【问题标题】:Stop creating log file if no logs are printed如果没有打印日志,则停止创建日志文件
【发布时间】:2018-02-23 15:55:59
【问题描述】:

我有以下简单的Hello World:

public class App {
    private static final Logger log = Logger.getLogger(App.class);

    public static void main(String[] args) {
        System.out.println("Hello World!"); 
//        log.info("Test info log");
    }
}

并在log4j.properties 中有以下内容:

# Root logger option
log4j.rootLogger=DEBUG,  file  
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=log.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

每当我运行代码时,都会创建空的log.log 文件,即使日志记录已被注释掉。

如何让它只在打印日志时才创建日志文件?

【问题讨论】:

  • 即使它是空的,拥有一个日志文件不是很有用吗?仅凭这一点,您就知道这些例程以某种方式起作用。

标签: java log4j


【解决方案1】:

如果您知道第一个日志写入文件的位置,这可能会为此提供解决方案。您可以在需要登录时创建文件附加程序

    public static void addFileAppender() {
        FileAppender fileAppender = new FileAppender();
        fileAppender.setName("FileLogger");
        fileAppender.setFile("feature.log");
        fileAppender.setLayout(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"));
        fileAppender.setThreshold(Level.DEBUG);
        fileAppender.setAppend(true);
        fileAppender.activateOptions();
        Logger.getRootLogger().addAppender(fileAppender);
    }

【讨论】:

  • 您的意思是从properties 文件中删除附加程序并在使用任何log... 之前像这样添加它,对吗?
【解决方案2】:

Log4j 创建日志文件,因为您创建了记录器private static final Logger log = Logger.getLogger(App.class);。你告诉他你想写一条日志消息,但是因为你评论了日志的用法,他不知道你需要什么 appender 并创建所有这些。

例如:

log4j2.properties

rootLogger.level=trace
rootLogger.appenderRef.file-info.ref = FileInfo
rootLogger.appenderRef.file-debug.ref=FileDebug

appender.file-info.type=File
appender.file-info.name=FileInfo
appender.file-info.fileName=info.log
appender.file-info.layout.type=PatternLayout
appender.file-info.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
appender.file-info.filter.filter-info.type=LevelRangeFilter
appender.file-info.filter.filter-info.minLevel=info
appender.file-info.filter.filter-info.maxLevel=info

appender.file-debug.type=File
appender.file-debug.name=FileDebug
appender.file-debug.fileName=debug.log
appender.file-debug.layout.type=PatternLayout
appender.file-debug.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
appender.file-debug.filter.filter-debug.type=LevelRangeFilter
appender.file-debug.filter.filter-debug.minLevel=debug
appender.file-debug.filter.filter-debug.maxLevel=debug 

案例 1:将只创建一个文件 info.log 和一条消息

public class App {
    private static final Logger log = LogManager.getLogger(App.class);

    public static void main(String[] args) {
        log.info("Test info log");
    }
}

案例2:会创建两个空文件info.log、debug.log

public class App {
    private static final Logger log = LogManager.getLogger(App.class);

    public static void main(String[] args) {
    }
}

案例3:将创建两个文件info.log(一条消息),debug.log(空)

public class App {
    private static final Logger log = LogManager.getLogger(App.class);

    public static void main(String[] args) {
        log.info("Test info log");
        Doc doc = new Doc();
    }
}

public class Doc {
    private static final Logger log = LogManager.getLogger(Doc.class);
}

【讨论】:

  • 我认为这与我提出的问题没有直接关系。
  • 问题:How to make it create a log file only if logs are printed? 在提供的代码示例中删除private static final Logger log = Logger.getLogger(App.class);,因为您没有使用它来创建日志消息并且它会混淆记录器。 Log4j 被构造为仅在您从框中记录一些消息时创建日志文件。我向你展示了几个例子,它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 2012-08-16
相关资源
最近更新 更多