Java 如果war不同,则将同一类记录到不同的文件

Java 如果war不同,则将同一类记录到不同的文件,java,tomcat,logging,log4j,slf4j,Java,Tomcat,Logging,Log4j,Slf4j,我需要将1个批处理应用程序拆分为3个不同的批处理应用程序。代码几乎是一样的,我刚刚修改了ANT构建脚本,并排除或包含了不同应用程序的一些依赖项。然后我为每一场战争设置了不同的web.xml。每个web.xml使用不同的bean为不同的行为定义不同的spring应用程序上下文 所有战争都在一台tomcat服务器上运行。应用程序使用log4j,但现在我将其重构为使用slf4j。我想我仍然需要在slf4j下使用log4j 我的问题是每个应用程序日志必须出现在不同的日志文件中, 即使类名相同 我无法编写

我需要将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

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

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

我考虑过类似的解决方案,但每个应用程序大约有10个日志,数量可以根据配置而变化,所以我不能使用一个唯一的类。第二种解决方案是另一种选择,但我无法决定它是否比我的工厂解决方案更好。这不需要构建额外的JAR,但我必须修改所有类,使获取logger变得更加困难,并且必须管理额外的singleton类。您可以为每个应用程序使用一个类或一个singleton,因为您将使用调用方和应用程序的知识获取logger。另一件事-您是否考虑过以编程方式设置配置?这可以使用文件或属性实例来完成。