Java log4j2记录器级别为';没有人跟踪

Java log4j2记录器级别为';没有人跟踪,java,xml,logging,log4j2,Java,Xml,Logging,Log4j2,所以我试着学习log4j2,并将我的头脑集中在记录者和他们的水平以及父母的传播上 当前我的源层次结构运行的是: ├── main │   ├── java │   │   └── calculatorMain │   │   ├── Main.java │   │   ├── someClass2.java │   │   └── someClass1.java │   └── resources │   ├── Excels │   │   └── Te

所以我试着学习log4j2,并将我的头脑集中在记录者和他们的水平以及父母的传播上

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

├── main
│   ├── java
│   │   └── calculatorMain
│   │       ├── Main.java
│   │       ├── someClass2.java
│   │       └── someClass1.java
│   └── resources
│       ├── Excels
│       │   └── TestExcel.xlsx
│       ├── FXMLs
│       │   └── mainWindow.fxml
│       └── log4j2.xml
我的计算公式是:

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>

上面这些日志应该只打印一次。我一直在遵循经过深思熟虑的教程,但我想我一定是误解了。

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

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

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

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

请注意,com.foo.Bar中的跟踪消息出现两次。这是 由于首先使用与记录器com.foo.Bar关联的appender, 将第一个实例写入控制台。接下来,是 引用com.foo.Bar,在本例中,它是根记录器。这个 事件然后被传递到它的附加程序,该附加程序也会写入 控制台,生成第二个实例。这被称为 可加性


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

非常有用的答案,我唯一想问的是,如果将事件传递给其父记录器,为什么会忽略父记录器的级别?是不是像你说的,所有父母的附加器都会被使用?如果是这样的话,如果加法产生了不良影响,为什么默认情况下加法设置为true?是的,使用父记录器的所有附加器。效果并不总是令人不快的——考虑你有一个主日志文件的情况,你希望所有的日志都被写入。假设您正在测试一个新类,并且希望从这个新代码中查看所有调试日志,并将它们写入控制台(或者可能是单独的日志)。您可以将additivity设置为true,这样您就可以很容易地看到孤立的日志,并且仍然可以在整个应用程序的更广泛上下文中看到它们,因为来自子应用程序的事件将进入父应用程序的附加器,并写入主日志。
[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