我目前正在创建一个系统,可以有模块(认为他们作为插件),其中每个人都可以有自己的日志,专用。
我想使用log4j 2项目进行日志记录,但是我似乎在文件附加器方面遇到了一些麻烦。
主项目(模块加载器和整个项目的“核心”)应该有自己的日志文件,而模块应该有自己的日志文件(如mod_XXXXXXXX.log
)。
通过阅读关于appender的文档,我发现了FileAppender
类,我打算使用它。直到我发现我不能简单地将appender添加到LogManager.getLog()
创建的默认记录器中。
LogManager返回的记录器与Logger
接口的记录器不同。
即使搜索也没有给予我任何接近的解决方案,我所找到的只是xml配置中预定义的文件日志-这不是我想要的。
感谢您的阅读;即使是最轻微的线索也是受欢迎的:)
4条答案
按热度按时间e4yzc0pl1#
如果您真的需要动态地确定日志文件,请查看Log4J2RoutingAppender。FAQ中有一个更长的示例,您可能会对这些堆栈溢出问题感兴趣:Wildcard pattern for RoutingAppender of Log4j2和How to write different logs in different files with log4j2 (MDC in xml)?的函数
请注意,您需要在
ThreadContext
Map中设置值,RoutingAppender使用该Map来决定将日志事件路由到哪个appender。这意味着,每次代码进入不同的插件时,您都需要在ThreadContextMap中放置一些值。如果你事先知道你有什么插件,你可以为每个插件声明一个logger(使用插件的包名是一种常见的方法),然后将每个这样的loggerMap到一个单独的appender。
xmakbtuz2#
我假设你想让你的模块管理代码定义logger配置,对吗?如果是这样,你可能想看看手册的这一部分,它讨论了扩展LoggerConfig,这是基于你的要求,我认为你正在寻找什么。
http://logging.apache.org/log4j/2.x/manual/extending.html
不管怎么说,我以前参与过基于插件的大型系统(使用OSGi),老实说,我们还没有走这条路。通常更容易的是,从一个日志文件中直接grep出你感兴趣的类或包。
9avjhtql3#
尽管Remko Popma的答案可能是进行日志记录的最有效方法,但我构建了一个可以自己创建日志文件的小类。
我想我将使用公认答案的解决方案,因此下面是我编写的代码,用于解决XML文件问题:
如果你不使用
trove
,你可以用普通的javaHashMap
来代替它。0tdrvxhp4#
}