小编典典

以编程方式配置 Log4j 记录器

all

log4j第一次尝试使用 SLF4J(带绑定)。

我想配置 3 个不同的命名记录器,它们可以由 LoggerFactory 返回,它们将记录不同的级别并将消息推送到不同的附加程序:

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

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

我想,通常情况下,我会Logger在一些引导代码中的某个地方定义这些 s
,比如一个init()方法。但是,因为我想使用slf4j-log4j,所以我对在哪里可以定义记录器并使它们可用于类路径感到困惑。

我不 认为 这违反了 SLF4J 的基本目的(作为门面),因为我使用 SLF4J API 的代码永远不会知道这些记录器的存在。我的代码只是对 SLF4J
API 进行正常调用,然后将它们转发到它在类路径上找到的 log4j 记录器。

但是如何在类路径上配置那些 log4j 记录器......在 Java 中?!


阅读 74

收藏
2022-07-07

共1个答案

小编典典

您可以通过编程方式向 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() 中,你可以肯定,这将在其他任何事情之前执行。然后,您可以删除根记录器上的所有现有附加程序

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

并从添加您自己的开始。当然,您需要在类路径中使用 log4j 才能使其正常工作。

备注:
您可以随意Logger.getLogger(...)添加附加程序。我只使用了根记录器,因为它位于所有事物的底部,并且将处理通过其他类别中的其他附加程序传递的所有内容(除非通过设置可加性标志进行其他配置)。

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

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

将为您提供“com.fizz”类别的记录器。
对于上面的示例,这意味着使用它记录的所有内容都将引用到根记录器上的控制台和文件附加程序。
如果您向 Logger.getLogger(“com.fizz”).addAppender(newAppender)
添加附加程序,则fizz来自根记录器和newAppender.
您无需使用配置创建 Logger,您只需为系统中所有可能的类别提供处理程序。

2022-07-07