当前位置: 首页 > 面试题库 >

Java以编程方式配置Log4j记录器

韩刚洁
2023-03-14
问题内容

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

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

  • 记录器1“ FileLogger”记录调试并附加到 DailyRollingFileAppender
  • 记录器2“ TracingLogger”记录TRACE +并追加到JmsAppender
  • 记录器3“ ErrorLogger”记录ERROR +并追加到其他记录器 JmsAppender

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

我想通常,我会Logger在一些自举代码中的某处(如init()方法)定义这些。但是,由于我想使用slf4j-log4j,我对在哪里定义记录器并使它们可用于类路径感到困惑。

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

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


问题答案:

你可以通过编程将Appender添加/删除到Log4j:

  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,而只是为系统中所有可能的类别提供处理程序。



 类似资料:
  • 问题内容: 是否可以覆盖已经在中配置的附加程序的“文件”属性,而无需创建新的附加程序?如果是的话-怎么样? 这是这种情况:我有两个apender,A1是ConsoleAppender,而A2是FileAppender。A2的“文件”指出了一个一般性error.log: 此附加程序仅记录错误级别的事件,或更糟糕的是 。 现在,我希望根据导致错误的类将这些错误写入不同的文件中,因为正在创建实例的类有多

  • 我试图配置使用log4j编程api之一的根记录器的模式。这就是我所拥有的,它正在删除默认记录器,我知道重新配置,setLevel和setRootLevel正在工作,但是新的ConsoleAppender实际上没有记录任何内容 我也尝试了其他API,同样的运气。如何修复我的代码? 这里有一个完整的链接到我的来源,对不起,我一直在努力,所以行号可能会改变。 https://github.com/xen

  • 我在logback.xml中定义了一个logback appender,它是一个DB appender,但是我想知道是否有任何方法可以使用我自己定义为bean的连接池在java中配置appender。 我发现了类似的事情,但从来没有真正的答案。

  • 问题内容: 我正在尝试使用JAVA解析JFR转储。我关注了这个博客,http://hirt.se/blog/?p=446。但是现在不推荐使用这些方法。JFR到JAVA是否有任何受支持的解析器?如果不能,您能否指出我是否可以从JFR转储中检索数据? 问题答案: 正如Klara提到的那样,没有官方支持的解析器。希望JDK 9将正式支持JFR解析器。现在,您可以使用Hirt博客中提到的API 。不用担心

  • 我正在使用log4j2 v2.17.2,需要在运行时以编程方式添加记录器/附加器。我正在创建LoggerConfig,如下所示:https://logging . Apache . org/log4j/2 . x/manual/custom config . html部分:初始化后以编程方式修改当前配置 包括此片段: 当使用:LoggerConfig.createLogger(..)(现在我用构建

  • 问题内容: 说我有两个JavaBeans 和。 如果创建一个Person对象的列表,我想编组成这样的东西: 可以使用这里描述的技术: 使用JAXB解组/编组List 通过使用和注释JaxbList,可以将其编组为上述XML。 但是,能够重用相同的类来封送对象列表也很好。实际上,我将有许多其他类型的bean。我可以这样: 但是,理想情况下,最好用类名的复数形式替换“列表”,用类名替换“ item”。