我目前正在创建一个可以包含模块(将它们视为插件)的系统,其中每个模块都可以拥有自己的专用日志。
我想使用 log4j2 项目进行日志记录,但文件附加程序似乎有些问题。
主项目(模块加载器和整个项目的“核心”)应该有自己的日志文件,而模块应该有自己的(比如 mod_XXXXXXXX.log
)。
通过阅读有关 appender 的文档,我发现了 FileAppender
类,并且我打算使用它。直到我发现我不能简单地将 appender 添加到由 LogManager.getLog()
创建的默认记录器。
LogManager 返回的记录器与 Logger
接口(interface)不同。
即使搜索也没有给我任何接近的解决方案,我发现的只是 xml 配置中的预定义文件日志 - 这不是我想要的。
感谢您的阅读;欢迎提供最细微的线索:)
最佳答案
如果您真的需要动态确定日志文件,请查看 Log4J2 RoutingAppender .更长的示例在 FAQ 中这些 stackoverflow 问题可能很有趣: Wildcard pattern for RoutingAppender of Log4j2 和 How 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/