避免重复打印日志,浪费磁盘空间,务必在 log4j.xml 中设置 additivity=false

当设置 additivity=false 时,可以避免重复打印日志消息,从而节省磁盘空间和避免不必要的日志记录。以下是一个具体的例子来解释这个概念:

假设你有一个应用程序,使用 log4j 来记录日志。在应用程序中,有一个名为 “com.example.MyClass” 的类,它负责处理某些业务逻辑,并且有自己的日志记录器。

现在,你在 log4j.xml 中配置了这个类的日志记录器,如下所示:

<loggers>
  <logger name="com.example.MyClass" level="DEBUG">
    <appender-ref ref="consoleAppender"/>
  logger>
loggers>

默认情况下,additivity 属性是 true,意味着日志消息会在日志层次结构中向上传递。现在假设在 MyClass 类中调用了一个方法,该方法会输出一条日志消息:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MyClass {
    private static final Logger logger = LogManager.getLogger(MyClass.class);

    public void doSomething() {
        logger.debug("Doing something...");
    }
}

每当 doSomething() 方法被调用时,日志消息 “Doing something…” 将会被记录到 MyClass 类的日志记录器中。然而,由于 additivity=true 的设置,这条消息也会传递给上层的记录器,例如根记录器或其他父级记录器。

如果父级记录器也存在一个类似的日志配置,并将日志输出到文件中,那么这条日志消息将会在 MyClass 类的日志文件和父级记录器的日志文件中都被记录一次,造成重复的日志记录,浪费磁盘空间。

为了避免这种重复记录的情况,可以将 additivity 设置为 false:

<loggers>
  <logger name="com.example.MyClass" level="DEBUG" additivity="false">
    <appender-ref ref="consoleAppender"/>
  logger>
loggers>

现在,当 doSomething() 方法被调用时,日志消息 “Doing something…” 将只会在 MyClass 类的日志文件中记录,不会传递给上层的记录器。

通过设置 additivity=false,可以确保日志消息只被记录在定义了该类日志记录器的位置,避免重复记录,降低了日志的冗余性和磁盘空间的消耗。

你可能感兴趣的:(log4j,xml)