log4j中使用MDC动态命名日志文件
是否可以使用 MDC 在运行时命名日志文件。
我有一个 Web 应用程序,它使用 tomcat 文档库同时被不同的名称调用。所以我需要为每个人都有单独的日志文件。
Is it possible some how to use MDC to name the log file at run time.
I have a single web application which is being called by different names at the same time using tomcat docbase. So i need to have separate log files for each of them.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这可以在 Log4J 的后继者 Logback 中完成。
请参阅筛选 Appender 的文档
在示例中,他们根据 MDC 值为每个用户生成单独的日志文件。
根据您的需要,可以使用其他 MDC 值。
This can be accomplished in Logback, the successor to Log4J.
See the documentation for Sifting Appender
In the example, they generate a separate log file for each user based on an MDC value.
Other MDC values could be used depending on your needs.
使用 log4j 也可以实现这一点。您可以通过实现自己的附加程序来做到这一点。我想最简单的方法是
子类 AppenderSkeleton。
所有日志记录事件最终都会在您必须实现的
append(LoggingEvent event)
方法中结束。在该方法中,您可以通过 event.getMDC("nameOfTheKeyToLookFor"); 访问 MDC
,然后您可以使用此信息打开要写入的文件。
查看标准附加程序的实现可能会有所帮助,例如 RollingFileAppender 来弄清楚剩下的事情。
我自己在应用程序中使用了这种方法,将不同线程的日志分离到不同的日志文件中,效果非常好。
This is also possible with log4j. You can do this by implementing your own appender. I guess the easiest way is to
subclass AppenderSkeleton.
All logging events end up in the
append(LoggingEvent event)
method you have to implement.In that method you can access the MDC by
event.getMDC("nameOfTheKeyToLookFor");
Then you could use this information to open the file to write to.
It may be helpful to have a look at the implementation of the standard appenders like RollingFileAppender to figure out the rest.
I used this approach myself in an application to separate the logs of different threads into different log files and it worked very well.
我花了一段时间在 log4j 中找到类似 SiftingAppender 的功能(由于某些依赖关系,我们无法切换到 logback),最终得到了一个运行良好的编程解决方案,使用 MDC 并在运行时附加记录器:
过滤器上面附加的内容只是检查特定的进程 ID:
希望这会有所帮助。
I struggled for a while to find SiftingAppender-like functionality in log4j (we couldn't switch to logback because of some dependencies), and ended up with a programmatic solution that works pretty well, using an MDC and appending loggers at runtime:
The filter appended above just checks for a specific process id:
Hope this helps a bit.
截至 2020 年 1 月 20 日,这现已成为 Log4j 的默认功能。
要实现这一点,您只需要使用 RoutingAppender与MDC。
示例:
要了解更多信息,请参阅Log4j - 如何将消息路由到动态创建的日志文件 。
As of 20-01-2020, this is now a default functionality of Log4j.
To achieve that you just need to use a RoutingAppender with MDC.
Example:
To known more, see Log4j - How to route message to log file created dynamically.