java - xml配置详解 - log4j配置




以编程方式配置Log4j记录器 (2)

如果您已经在log4j属性中定义了appender并且想要以编程方式更新它,请在log4j属性中设置名称并按名称获取它。

这是一个log4j.properties条目的例子:

log4j.appender.stdout.Name=console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=INFO

要更新它,请执行以下操作:

((ConsoleAppender) Logger.getRootLogger().getAppender("console")).setThreshold(Level.DEBUG);

我正尝试第一次使用SLF4J(与log4j绑定)。

我想配置3个不同的Logger,它们可以被LoggerFactory返回,LoggerFactory会记录不同的级别并将消息推送到不同的appender:

  • 记录器1“FileLogger”记录DEBUG DailyRollingFileAppender
  • 记录器2“TracingLogger”记录TRACE + JmsAppender
  • 记录器3“ErrorLogger”记录ERROR + JmsAppender加到不同的JmsAppender

此外,我希望它们以编程方式进行配置(使用Java,而不是XML或log4j.properties文件)。

我想通常,我会在某些引导代码中的某处init()init()方法init()定义这些Logger 。 但是,因为我想使用slf4j-log4j ,所以我很困惑我可以在哪里定义记录器并将它们提供给类路径。

我不认为这是违反SLF4J的底层目的(作为外观),因为我使用SLF4J API的代码永远不会知道这些记录器存在。 我的代码只是正常调用SLF4J API,然后将它们转发到它在类路径中找到的log4j Logger。

但是,如何在Java类路径中配置这些log4j Logger?


您可以以编程方式向Log4j添加/删除Appender:

  ConsoleAppender console = new ConsoleAppender(); //create appender
  //configure the appender
  String PATTERN = "%d [%p|%c|%C{1}] %m%n";
  console.setLayout(new PatternLayout(PATTERN)); 
  console.setThreshold(Level.FATAL);
  console.activateOptions();
  //add appender to any Logger (here is root)
  Logger.getRootLogger().addAppender(console);

  FileAppender fa = new FileAppender();
  fa.setName("FileLogger");
  fa.setFile("mylog.log");
  fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
  fa.setThreshold(Level.DEBUG);
  fa.setAppend(true);
  fa.activateOptions();

  //add appender to any Logger (here is root)
  Logger.getRootLogger().addAppender(fa);
  //repeat with all other desired appenders

我建议你把它放到一个init()的地方,你可以肯定的是,它会在别的之前执行。 然后,您可以删除根记录器上的所有现有appender

 Logger.getRootLogger().getLoggerRepository().resetConfiguration();

并开始添加你自己的。 当然,你需要在类路径中使用log4j来运行。

备注:
你可以使用任何你喜欢的Logger.getLogger(...)来添加appender。 我只接受了根记录器,因为它位于所有事物的底部,并将处理通过其他类别中的其他appender传递的所有内容(除非通过设置可加性标志进行配置)。

如果您需要了解日志记录的工作原理以及如何确定日志的写入方式,请阅读本手册以获取更多信息。
简而言之:

  Logger fizz = LoggerFactory.getLogger("com.fizz")

会给你一个类别为“com.fizz”的记录器。
对于上面的例子,这意味着与它一起记录的所有内容都将被引用到根日志记录器上的控制台和文件appender。
如果你将一个appender添加到Logger.getLogger(“com.fizz”).addAppender(newAppender),那么从fizz记录将通过根记录器和newAppender的appender进行处理。
您不需要使用配置创建记录器,只需为系统中的所有可能类别提供处理程序即可。





slf4j