【问题标题】:Logging same class to different file, if war is different如果战争不同,将相同的类记录到不同的文件
【发布时间】:2013-10-21 10:25:37
【问题描述】:

我需要将 1 个批处理应用程序拆分为 3 个不同的应用程序。代码几乎相同,我刚刚修改了 ANT 构建脚本,并为不同的应用程序排除或包含了一些依赖项。比我为每场战争设置不同的 web.xml。每个 web.xml 使用不同的 bean 定义不同的 spring 应用程序上下文以实现不同的行为。

所有战争都在一个 tomcat 服务器上运行。应用程序使用 log4j,但现在我将其重构为使用 slf4j。以为还是需要在slf4j下使用log4j。

我遇到的问题是每个应用程序日志必须出现在不同的日志文件中, 即使类名相同。

  • 我无法编写不同的 log4j.properties 文件,因为管理员将它放在所有应用程序的 tomcat/lib 文件夹中。
  • 我尝试在 tomcat/lib 中放置 3 个文件,并在初始化 servlet 时更改每个应用程序的配置文件名,但同时更改了所有应用程序的配置文件名。

我现在能想到的唯一解决方案是包装 log4j-over-slf4j,创建 3 个不同的 slf4j 日志工厂,这将为每个日志名称附加一些前缀。例如,如果我有这个日志:

 private final Logger logger = LoggerFactory.getLogger(MainProcessor.class);

每个日志工厂都会生成这些日志名称(前缀为 app1、app2 和 app3):

app1.com.test.MainProcessor
app2.com.test.MainProcessor
app3.com.test.MainProcessor

有没有更好的方法来处理这个问题?

【问题讨论】:

    标签: java tomcat logging log4j slf4j


    【解决方案1】:

    尝试使用挂钩方法、触发事件等,这样日志记录就不会发生在跨应用程序共享的类中,而是发生在每个应用程序唯一的某个(顶级)类中。
    变体是从应该发生日志记录的类中静态访问一些日志记录类,使用单例等,但在应用初始化时为该日志记录类设置上下文。

    【讨论】:

    • 我想过类似的解决方案,但是每个应用程序大约有10个日志,并且数量可以根据配置而变化,所以我不能使用一个唯一的类。第二种解决方案是另一种选择,但我无法确定它是否比我的工厂解决方案更好。这不需要构建额外的 jar,但我必须修改所有类,使获取记录器更加困难,并且必须管理额外的单例类。
    • 您可以为每个应用程序使用一个类或一个单例,因为您将获得一个使用调用者和应用程序知识的记录器。另一件事-您是否考虑过以编程方式设置配置?这可以使用文件或属性实例来完成。
    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 2019-01-27
    • 2011-05-12
    相关资源
    最近更新 更多