假设我有一个名为 myApp.jar 的 jar 文件。jar 文件由 4 个应用程序组成。jar 文件中的所有四个应用程序都使用 jar 文件中的相同代码,唯一的区别是数据的提取和转换方式。jar 文件中的包看起来像这样
com.myapp
|-App1Main.java
|-App2Main.java
|-App3Main.java
|-App4Main.java
com.myapp.transform
|-App1Transform
|-App2Transform
|-App3Transform
com.myapp.service
|-MyAppService.java
com.myapp.model
|-{ModelClasses}
com.myapp.dao
|-MyAppDAO
唯一的区别是每个应用程序使用一组不同的算法来转换/转换来自不同来源的数据。一旦数据被转换,服务、dao、模型类都在不同的应用程序之间共享。应用程序使用与此类似的命令运行
$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java
jar 文件包含所有三个应用程序都使用的 log4j.propeties 文件。
log4j.rootLogger=WARN, stdout, myAppLogger
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.myAppLogger.File=/myapp/logs/myapp.log
log4j.appender.myAppLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.myAppLogger.DatePattern=.dd-MM-yyyy
log4j.appender.myAppLogger.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.myAppLogger=org.apache.log4j.DailyRollingFileAppender
目前,上述配置意味着 jar 文件中的 3 个应用程序中的每一个都写入同一个日志文件 - 即 /myapp/logs/myapp.log 我想更改此设置,以便每个应用程序写入自己的日志文件。
我发现的一种解决方案是将日志文件配置更改为:
log4j.appender.myAppLogger.File=/myapp/logs/${logfile.name}
然后只需使用不同的日志文件名称作为系统属性调用每个应用程序,如下所示:
$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java -Dlogfile.name=myApp1Log.log
$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java -Dlogfile.name=myApp2Log.log
$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java -Dlogfile.name=myApp3Log.log
$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java -Dlogfile.name=myApp4Log.log
以上可能会起作用,但我不太热衷于使用系统属性。有没有办法使用多个记录器来实现同样的事情?
我知道我可以设置多个记录器并在应用程序中调用相关记录器,但我遇到的问题是我无法知道哪些应用程序当前正在某些类上运行。例如..
设置多个记录器
log4j.rootLogger=WARN, stdout,MyApp1, MyApp2, MyApp3, MyApp4
# setup MyApp1
log4j.appender.myAppLogger=org.apache.log4j.RollingFileAppender
log4j.appender.myAppLogger.File=/myapp/logs/myapp1.log
...
...
# setup MyApp4
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.myAppLogger.File=/myapp/logs/myapp4.log
...
log4j.logger.com.yourpackage.yourclazz=TRACE
所有 4 个应用程序都使用 MyAppService 和 MyAppDAO 类。如果我想在 MyAppService 或 MyAppDAO 中写入日志文件,我将不得不执行以下操作:
- import all 4 loggers in MyAppservice
- if the application is myapp1 use myapp1 logger
- if the application is myapp2 use myapp2 logger
- if the application is myapp3 use myapp3 logger
- if the application is myapp4 use myapp4 logger
以上也可能有效,但在代码中的多个位置有多个 if 语句不是很干净。
我正在寻找一种更简洁、更通用的方法,不需要使用 IF 语句或在方法等中传递应用程序的名称。有更好的建议吗?