【问题标题】:Java log4j2 logger levels aren't being followed未遵循 Java log4j2 记录器级别
【发布时间】:2018-08-17 15:41:44
【问题描述】:

所以我正在尝试学习 log4j2 并围绕记录器及其级别和父母传播。

目前我的源层次结构是:

├── main
│   ├── java
│   │   └── calculatorMain
│   │       ├── Main.java
│   │       ├── someClass2.java
│   │       └── someClass1.java
│   └── resources
│       ├── Excels
│       │   └── TestExcel.xlsx
│       ├── FXMLs
│       │   └── mainWindow.fxml
│       └── log4j2.xml

而我的calculatorMain 是:

Public class Main extends Application
{
    private static final String mainWindow = //FXML stuff
    private static final Logger logger = LogManager.getLogger(Main.class.getName());

    public static void main(String[] args)
    {
        logger.debug("Main has started");
        launch(args);
    }

    @Override
    public void start(Stage primaryStage)
    {
        try
        {
            //FXML stuff
            Parent root = //fxml stuff
            logger.info("Main scene loaded successfully");
            if (root != null)
            {
                //FXML stuff
            }
            else
                logger.error("Root was null");
        }
        catch (Exception e)
        {
            logger.error("Error",e);
        }
    }
}

我的 log4j2.xml 是

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="BrightnessCalculator packages">
    <!-- Logging Properties -->
    <Properties>
        <Property name="basePath">./logs</Property>
        <Property name="filePattern">${date:yyyy-MM-dd}</Property>
    </Properties>

    <Appenders>

        <!-- File Appenders -->
        <RollingFile name="mainLog" fileName="${basePath}/info-${filePattern}.log"
                     filePattern="${basePath}/app-info-%d{yyyy-MM-dd}.log.gz">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>

        <!-- Console Appender -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>

        <Root level="ERROR">
            <AppenderRef ref="console"/>
        </Root>

        <Logger name="calculatorMain" level="ERROR">
            <appenderRef ref="mainLog"/>
        </Logger>

        <Logger name="calculatorMain.Main" level="TRACE">
            <appenderRef ref="mainLog"/>
        </Logger>


    </Loggers>
</Configuration>

问题是输出到控制台的根记录器设置为level="ERROR"。根据我对级别的理解,这意味着我的根记录器应该只输出错误日志或更低。然后是我的CalculatorMainCalculator.Main 记录器,前者应该只记录错误和更低,而后者应该记录跟踪和更低。所以我的理解是错误日志和更低的日志将被打印两次,并且任何高于错误日志的内容都应该只根据父传播打印到日志中一次。但是,基于我的日志文件输出以下内容,情况并非如此:

[DEBUG] 2018-08-17 16:37:28.239 [main] calculatorMain.Main - Main has started
[DEBUG] 2018-08-17 16:37:28.239 [main] calculatorMain.Main - Main has started
[INFO ] 2018-08-17 16:37:28.741 [JavaFX Application Thread] calculatorMain.Main - Main scene loaded successfully
[INFO ] 2018-08-17 16:37:28.741 [JavaFX Application Thread] calculatorMain.Main - Main scene loaded successfully

以上这些日志应该只打印一次。我一直在关注this 深思熟虑的教程,但我想我一定是误解了。

【问题讨论】:

    标签: java xml logging log4j2


    【解决方案1】:

    您遇到的问题是由于默认情况下可加性为true。您的教程具有误导性,因为它说:

    默认情况下,log4j2 日志记录是附加的。这意味着所有的父母 loggers 也将在使用特定记录器时使用。

    实际上意味着所有父级loggers都会被使用,这意味着所有父级loggers的appenders都会被使用.你应该阅读log4j2 manual,尤其是关于加法的部分。

    在手册的可加性部分,有一个例子,后面有一些解释:

    请注意,来自 com.foo.Bar 的跟踪消息出现了两次。这是 因为首先使用了与 logger com.foo.Bar 关联的 appender, 它将第一个实例写入控制台。接下来,家长 com.foo.Bar,在这种情况下是根记录器,被引用。这 然后将事件传递给它的 appender,它也会写入 控制台,导致第二个实例。这被称为 可加性。

    加性设置为true(默认情况下)任何被子记录器接受的事件都会传递给所有父记录器的附加程序。

    【讨论】:

    • 非常有用的答案,我唯一的烦恼是,如果将事件传递给其父级,为什么会忽略父级的级别?是不是因为像你说的,父母的所有appender都会被使用?如果是这种情况,为什么 additivity 默认设置为 true,如果它会产生不良影响?
    • 是的,所有父记录器的附加器都被使用。效果并不总是不可取的 - 考虑您有一个希望写入所有日志的主日志文件的情况。假设您正在测试一个新类,并且您希望查看此新代码中的所有 DEBUG 日志并将它们写入控制台(或者可能是单独的日志)。您可以将 additivity 设置为 true 以便您可以轻松查看隔离日志,并且仍然可以在整个应用程序的更广泛的上下文中看到它们,因为来自子级的事件将进入父级的附加程序并被写入主日志。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多