Maven项目中的Log4j日志记录

3

我正在使用Maven运行我的Selenium自动化测试。从执行开始到结束,我看到了很多日志。

通过这段代码,我知道只有.info警告和.warn会输出到控制台,而.debug则不会。

public static void main(String[] args) {
        Logger log = LogManager.getLogger();
        log.debug("its a debug message");
        log.info("its a info message");
        log.warn("its a warning message");
    }

输出:

2015-12-24 13:58:21,166 ERROR Logger contains an invalid element or attribute "append"
[INFO ] 2015-12-24 13:58:21.245 [main] DebuggerTest - its a info message
[WARN ] 2015-12-24 13:58:21.247 [main] DebuggerTest - its a warning message

现在我想通过mvn命令传递一个变量,以开启/关闭控制台中的任何日志。
类似这样:mvn test --debugging -false,这样可以在生成的日志文件中看到日志,但是不会在控制台中显示。
更多信息: 我想要像这里给出的那样: 如何正确初始化log4j? 在这里,用户"MATH"建议使用:Logger.getRootLogger().setLevel(Level.WARN);如果不想看到调试日志
我想从mvn命令行启用/禁用此功能。
更多信息2: 这是我的log4j2.xml的外观:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="log-path">logs</Property>
    </Properties>
    <Appenders>
        <Console name="console-log" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
        </Console>
        <RollingFile name="trace-log" fileName="${log-path}/rnf-info.log"
                     filePattern="${log-path}/rnf-trace-%d{yyyy-MM-dd}.log" append="false">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>
        <RollingFile name="debug-log" fileName="${log-path}/rnf-debug.log"
                     filePattern="${log-path}/rnf-debug-%d{yyyy-MM-dd}.log" append="false">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.rnf" level="debug" additivity="false" append="false">
            <appender-ref ref="trace-log" level="info"/>
            <appender-ref ref="debug-log" level="debug"/>
        </Logger>
        <Root level="info" additivity="false">
            <AppenderRef ref="console-log"/>
        </Root>
    </Loggers>
</Configuration>

您的日志配置是什么?为什么不能将控制台设置为警告级别,文件设置为调试级别呢? - Betlista
我认为这是可行的(虽然我不知道如何做,但我会尝试),但是如何让Maven知道在控制台中显示哪些内容以及哪些内容不显示呢? - paul
这与Maven无关... 你需要配置日志框架,基本上它会将消息添加到文件和控制台中,但你可以指定不同的日志级别,因此结果是你会在文件中看到更多的消息,在控制台中看到较少的消息... - Betlista
您可以从这里开始阅读 - https://logging.apache.org/log4j/1.2/manual.html - Betlista
我的意思是说,我想通过maven命令传递一个变量,以禁用控制台上的任何日志。如果我没有在maven命令中传递该变量,则会在控制台上看到日志。 - paul
2个回答

1

0
你可以尝试使用变量。 log4j2配置。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="LEVEL">WARN</Property> <!-- default value -->
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="${sys:LEVEL}">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

如果要将默认值从WARN更改为DEBUG,可以使用以下命令:

-DLEVEL=DEBUG
编辑:

在您的配置中,控制台级别是固定的 - 静态设置为INFO,但您想要动态行为。

您需要添加另一个属性。

<Properties>
    <Property name="log-path">logs</Property>
    <Property name="LEVEL">WARN</Property> <!-- default value -->
</Properties>

我将WARN设置为默认级别,因此默认情况下控制台中会有较少的消息。

然后我在根记录器配置中引用该属性${sys:LEVEL}

<Root level="${sys:LEVEL}">

但是它可以作为标准JVM参数从命令行中指定-D...

因此,如果你想在控制台中看到更多的消息,你可以运行mvn test -DLEVEL=DEBUG


所以,如果命令是mvn test -DLEVEL=DEBUG,我在控制台上就看不到日志了? - paul
不是真的,我的逻辑有些混乱,但请随意根据您的需求进行修改。上面的示例默认只显示级别为“WARN”及以上的消息,如果您想要查看“DEBUG”级别的消息,则需要使用“-DLEVEL=DEBUG”。 - Betlista
我的log4j2.xml里的Property标签写法不同,如上所示。我不明白该如何修改或使用它,以便在控制台中获取日志或停止控制台中的日志。 - paul
抱歉,我是新手。那么我的 .xml 文件中哪一行/标签指定了控制台级别为 fixed-static - paul
这个 <Root level="info" ...,你在那里有一个 info 值,而我正在使用变量... - Betlista

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接