Log4j 配置 - 不同文件的不同日志

2022-09-01 00:16:11

对于某些人来说,这可能是一个非常简单的问题,但就我个人而言,我发现Log4j配置非常困难,学习进行脑部手术可能不那么具有挑战性。

我正在尝试将多个记录器添加到不同的文件中。以下是我在log4j.properties文件中的内容:

# Root logger option
log4j.rootLogger=INFO, file, admin

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/home/nick/logging/file.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n

log4j.appender.admin=org.apache.log4j.RollingFileAppender
log4j.appender.admin.File=/home/nick/logging/admin.log
log4j.appender.admin.MaxFileSize=1MB
log4j.appender.admin.MaxBackupIndex=1
log4j.appender.admin.layout=org.apache.log4j.PatternLayout
log4j.appender.admin.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n

这是我的(非常简单的)Java应用程序,用于测试配置:

public static void main(String[] args) throws Exception {

    Properties resource = new Properties();
    InputStream in = new FileInputStream("/home/nick/logging/log4j.properties");
    resource.load(in);
    PropertyConfigurator.configure(resource);

    Logger admin = Logger.getLogger("admin");
    Logger file = Logger.getLogger("file");

    admin.info("hello admin");
    file.info("hello file");
}

我有2个问题:

一个问题我总是在行中得到一个异常:PropertyConfigurator.configure(resource);

java.io.FileNotFoundException: /home/nick/logging (Is a directory)
 at java.io.FileOutputStream.open(Native Method)
 at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
 at java.io.FileOutputStream.<init>(FileOutputStream.java:136)
 at org.apache.log4j.FileAppender.setFile(FileAppender.java:289)
 at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:167)
 at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:163)
 at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:256)

第二个问题是两条消息都写入两个日志。以下是实际结果:

文件管理员:日志:

2014-04-27 11:55:30 INFO  admin - hello admin
2014-04-27 11:55:30 INFO  file - hello file

文件文件.log:

2014-04-27 11:55:30 INFO  admin - hello admin
2014-04-27 11:55:30 INFO  file - hello file

以下是所需的结果:

文件管理员:日志:

2014-04-27 11:55:30 INFO  admin - hello admin

文件文件.log:

2014-04-27 11:55:30 INFO  file - hello file

导致异常的原因是什么,如何实现所需的结果?


答案 1

Log4J区分了负责生成日志消息的记录器和负责将这些消息发送到某个地方(文件,控制台,数据库等)的追加器。记录器形成一个层次结构,根记录器是名为 的记录器的父级,该记录器是 等的父级,您可以将追加器附加到层次结构中的任何记录器。默认情况下,记录器会将消息发送到直接附加到它的所有追加器,或者发送到层次结构中的任何祖先(这就是为什么记录器通常像Java类一样命名,例如,您可以通过配置记录器来控制日志记录)。adminadmin.component1com.example.Class1com.example.subpkg.AnotherClasscom.example

记录器和追加器形成单独的命名空间,这是您混淆的根源 - 命名的记录器和命名的追加器是两个独立的实体。adminadmin

您在问题中给出的配置定义了一个记录器(根记录器),它将它生成的所有消息发送到两个单独的追加器,两个文件各一个。然后,您的代码请求两个不同的记录器,并为每个记录器生成一条日志消息。这两个记录器都从根记录器继承追加器配置,因此它们都将其消息发送到两个已配置的追加器。

enter image description here

不应将两个追加器附加到根记录器,而应将追加器附加到记录器,将追加器附加到记录器:filefileadminadmin

log4j.rootLogger=INFO
log4j.logger.file=INFO, file
log4j.logger.admin=INFO, admin

这样,记录器将仅将消息发送到 、记录器仅发送到 ,并且来自其他记录器的所有消息将被静默丢弃,因为没有附加到根目录的附加器。filefile.logadminadmin.log

enter image description here


可加性标志是此规则的例外 - 将记录器的可加性设置为 false 实质上会断开从记录器到其父级的箭头,因此该记录器生成的消息(或从其子项之一流入该记录器)不会在树上进一步向上移动,它们只会转到直接附加到相关记录器的追加器。


答案 2

为了回答我自己的问题,这就是我需要的:

log4j.logger.file=DEBUG, fileAppender
log4j.logger.admin=DEBUG, adminAppender

log4j.additivity.file=false
log4j.additivity.admin=false

log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=/home/nick/logging/file.log
log4j.appender.fileAppender.MaxFileSize=1MB
log4j.appender.fileAppender.MaxBackupIndex=1
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n

log4j.appender.adminAppender=org.apache.log4j.RollingFileAppender
log4j.appender.adminAppender.File=/home/nick/logging/admin.log
log4j.appender.adminAppender.MaxFileSize=1MB
log4j.appender.adminAppender.MaxBackupIndex=1
log4j.appender.adminAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.adminAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n

推荐