所以我正在尝试学习 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>
问题是输出到控制台的根记录器设置为level="ERROR"
。根据我对级别的理解,这意味着我的根记录器应该只输出错误日志或更低的日志。然后是我的CalculatorMain
Calculator.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 https://www.journaldev.com/7128#log4j2-levels经过深思熟虑的教程,但我想我一定是误解了。