首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java log4j2日志记录器级别未被遵循

Java log4j2日志记录器级别未被遵循
EN

Stack Overflow用户
提问于 2018-08-17 23:41:44
回答 1查看 385关注 0票数 0

因此,我正在努力学习log4j2,并对记录器及其级别和父母传播进行了解。

目前我运行的源层次结构是:

代码语言:javascript
复制
├── main
│   ├── java
│   │   └── calculatorMain
│   │       ├── Main.java
│   │       ├── someClass2.java
│   │       └── someClass1.java
│   └── resources
│       ├── Excels
│       │   └── TestExcel.xlsx
│       ├── FXMLs
│       │   └── mainWindow.fxml
│       └── log4j2.xml

我的calculatorMain是:

代码语言:javascript
复制
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是

代码语言:javascript
复制
<?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"。根据我对级别的理解,这意味着我的根记录器应该只输出错误日志或更低的日志。然后是我的CalculatorMain Calculator.Main记录器,前者应该只记录错误和更低的日志,而后者应该记录跟踪和更低的日志。因此,我的理解是,错误日志和更低版本将打印两次,并且基于父传播,任何高于错误日志的内容只应打印到日志中一次。然而,基于我的日志文件输出以下内容,情况并非如此:

代码语言:javascript
复制
[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深思熟虑的教程,但我想我一定是误解了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-18 13:22:46

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

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

事实上,它并不意味着所有的父记录器将被使用,它意味着父记录器的所有附加器将被使用。您应该阅读log4j2 manual,特别是关于可加性的部分。

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

注意,来自com.foo.Bar的跟踪消息出现了两次。这是因为首先使用与记录器com.foo.Bar关联的附加器,该附加器将第一个实例写入控制台。接下来,引用com.foo.Bar的父类,在本例中是根记录器。然后,该事件被传递给它的附加器,后者也会写入控制台,从而产生第二个实例。这就是所谓的加性。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51898831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档