java - Log4j2:动态创建多个日志的日志文件

标签 java logging log4j log4j2

我目前正在创建一个可以包含模块(将它们视为插件)的系统,其中每个模块都可以拥有自己的专用日志。

我想使用 log4j2 项目进行日志记录,但文件附加程序似乎有些问题。

主项目(模块加载器和整个项目的“核心”)应该有自己的日志文件,而模块应该有自己的(比如 mod_XXXXXXXX.log)。

通过阅读有关 appender 的文档,我发现了 FileAppender 类,并且我打算使用它。直到我发现我不能简单地将 appender 添加到由 LogManager.getLog() 创建的默认记录器。

LogManager 返回的记录器与 Logger 接口(interface)不同。

即使搜索也没有给我任何接近的解决方案,我发现的只是 xml 配置中的预定义文件日志 - 这不是我想要的。

感谢您的阅读;欢迎提供最细微的线索:)

最佳答案

如果您真的需要动态确定日志文件,请查看 Log4J2 RoutingAppender .更长的示例在 FAQ 中这些 stackoverflow 问题可能很有趣: Wildcard pattern for RoutingAppender of Log4j2How to write different logs in different files with log4j2 (MDC in xml)?

请注意,您需要在 RoutingAppender 用来决定将日志事件路由到哪个附加程序的 ThreadContext 映射中设置值。这意味着每次您的代码进入不同的插件时,您都需要在 ThreadContext 映射中放置一些值。

但是,您真的需要它如此动态吗?如果你事先知道你有什么插件,你可以为每个插件声明一个记录器(使用插件的包名称是一种常见的方法),并将每个这样的记录器映射到一个单独的附加程序。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <File name="MyFile" fileName="logs/app.log">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
    </File>
    <File name="plugin1" fileName="logs/plugin1.log">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
    </File>
    <File name="plugin2" fileName="logs/plugin2.log">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
    </File>
  </Appenders>
  <Loggers>
    <Logger name="com.mycomp.project.plugin1" level="debug">
      <AppenderRef ref="plugin1" level="debug" />
    </Logger>
    <Logger name="com.mycomp.project.plugin2" level="debug">
      <AppenderRef ref="plugin2" level="debug" />
    </Logger>
    <Root level="trace">
      <AppenderRef ref="MyFile" level="trace" />
    </Root>
  </Loggers>
</Configuration>

关于java - Log4j2:动态创建多个日志的日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19052070/

相关文章:

java - 如何获取联系人组 ID 或名称?

java - 从 java 进行 Json-Rpc 调用

java - 将图像转换为草图然后卡通化?

java - 将 Spring Integration 与 Spring 批处理管理一起使用时出错

java - 如何从 jar 文件中获取 log4j 输出

java - MyBatis log4j 配置仅记录映射器 XML 中的 SQL 名称,而不记录 SQL

java - Logback:选择性屏蔽语句和谨慎模式

java - 如何在 spring 中为 log4j2 创建自定义 appender

java - 禁用其他类调用的类中的记录器

java - log4j:错误尝试追加到名为的封闭附加程序