因此,我正在尝试学习log4j2,并把头放在记录器及其级别和父母传播上。
当前,我的源层次结构运行是:
├── main
│ ├── java
│ │ └── calculatorMain
│ │ ├── Main.java
│ │ ├── someClass2.java
│ │ └── someClass1.java
│ └── resources
│ ├── Excels
│ │ └── TestExcel.xlsx
│ ├── FXMLs
│ │ └── mainWindow.fxml
│ └── html" target="_blank">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>
问题是将输出到控制台的root记录程序设置为level="ERROR"
。根据我对级别的理解,这意味着我的root记录器应仅输出错误日志或更低的错误日志。然后是我的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
以上这些日志应该只打印一次。我一直在关注这个经过深思熟虑的教程,但我想我一定是误会了。
您遇到的问题是true
默认情况下的可加性。您的教程具有误导性,因为它说:
默认情况下,log4j2日志记录是累加的。这意味着当使用特定记录器时,还将使用所有父 记录 器。
其实它并 没有 意味着所有父 记录器 将被使用,这意味着所有的 附加目的地
父记录器将被使用。您应该阅读log4j2手册,尤其是有关可加性的部分。
在手册的可加性部分中,有一个带有一些解释的示例:
请注意,来自com.foo.Bar的跟踪消息出现了两次。这是因为首先使用与记录器com.foo.Bar关联的附加程序,该附加程序将第一个实例写入控制台。接下来,引用com.foo.Bar的父级(在本例中为root记录器)。然后将该事件传递到其
appender ,后者还将写入控制台,从而导致第二个实例。这称为可加性。
将可加性设置为true
(默认情况下),子记录器接受的任何事件都会传递给所有父记录器的附加程序。
现在,问题是,当我以以下方式进行日志记录时: 尽管根记录器级别被设置为“错误”,但日志条目仍然存在于两个日志文件中。然而,当我去掉“it.pkg.testpkg.service”记录器(通过注释或删除它)时,条目停止进入根记录器。我不太清楚这是怎么回事。 目前,我已经找到了一个临时解决方案,方法是在“root_file_appender”中添加以下条目: 谢了。
我的团队使用来控制我们的, 在中,我们可以选择更改中的级别, 我们为每个(线程)有一个单独的记录器,如果我们想只看到一个线程的控制台日志,我们关闭所有其他线程记录器,问题是每个记录器都为和某个文件发送输出,我们只想关闭stdout输出。 log4j2.xml配置示例: 我们尝试了很多解决方案: 将父记录器与可加性结合使用,并将每个附加器分离到不同的记录器,对此有什么想法吗?
我正在使用log4j进行日志记录。我有一个场景,我必须为不同的严重性使用单独的日志记录。例如,对于软件包foo,我必须在控制台中打印具有严重性ERROR的消息,而我必须在日志文件中打印具有严重性WARN的消息。我如何配置我的log4j.xml相同。
问题内容: 我觉得这里缺少明显的东西! 输出: 当然应该输出: 这是怎么了 问题答案: 字典未排序。如果需要依赖顺序,则需要一个OrderedDict- Python 2.7的模块中有一个,或者您可以使用多种食谱之一。
如何在SL4J中配置日志记录?我的项目有很多类:class1、class2、Class3....我想做两件事:将所有类记录到一个名为FILE1的文件追加器中,并具有警告级别(class1、class2、class3...)将一个名为class1的类记录到具有调试级别的名为FILE2的文件追加器中。 问题是,当我将class1的记录器配置为具有WARN级别的FILE1 appender时,我不知道如