从库代码记录到应用程序日志的策略?

时间:2009-01-16 19:28:50

标签: java logging log4j

在我工作的地方,我们使用Log4j进行Web应用程序日志记录。 log4j.jar位于应用程序级别,而不是容器级别。我们正在使用每日滚动文件appender。我们的log4j.properties文件根据应用程序包名称定义了appender,因此只有应用程序包及其下面的类才会记录到我们应用程序的日志文件中。

在我的应用程序中,我正在使用一些支持类来扩展我们的框架。这些类不在应用程序的包中,因为它们不是我的应用程序所独有的,最终会被制作成jar库以供其他应用程序使用。因此,我的日志记录语句不会被我的应用程序的appender选中,因此不会记录到我的应用程序的日志文件中。

我想允许jar中的类使用类登录到应用程序的日志文件。但是,如果我根据我的类名在我的应用程序的log4j属性文件中创建一个appender,我怀疑当多个应用程序使用我的jar时,由于log4j.properties文件中的类名相同,只有一个应用程序日志文件会收到我的jar的日志记录语句,它将从使用该jar的每个应用程序接收所有日志记录语句。我认为情况就是这样,因为我们使用静态Logger.getLogger()调用来检索记录器。

我首先想知道我的恐惧是否有效,如果真的是当同一个或不同容器中的多个Web应用程序同时使用我的jar时会发生什么。

我还想知道是否存在此行为发生变化的“边界”。例如,无论log4j.jar是容器级jar还是app级jar,或者每个容器是否在单独的JVM中运行,是否存在此问题?

最后,如果是这种情况,我想知道我应该用什么策略来克服这个问题。

提前致谢!

2 个答案:

答案 0 :(得分:2)

如果log4j.jar仅在web-app中,那么日志将保持独立,因此每个web-app都应该有自己的log4j.jar和log4j.properties,以便所有日志保持独立。

答案 1 :(得分:0)

问题是log4j的优先模式是使用静态* Configurator方法,这些方法与应用程序容器的关系不太好。

当我遇到它时,article解决了这个问题......