Java log4j-写入/记录到多个日志文件取决于应用程序
假设我有一个名为myApp.jar的jar文件。jar文件由4个应用程序组成。jar文件中的所有四个应用程序在jar文件中使用相同的代码,唯一的区别是数据的提取和转换方式。jar文件中的包如下所示Java log4j-写入/记录到多个日志文件取决于应用程序,java,logging,log4j,Java,Logging,Log4j,假设我有一个名为myApp.jar的jar文件。jar文件由4个应用程序组成。jar文件中的所有四个应用程序在jar文件中使用相同的代码,唯一的区别是数据的提取和转换方式。jar文件中的包如下所示 com.myapp |-App1Main.java |-App2Main.java |-App3Main.java |-App4Main.java com.myapp.transform |-App1Transform |-App2Transform
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
唯一的区别是,每个应用程序使用一组不同的algrithms来转换/转换来自不同来源的数据。转换数据后,服务、dao和模型类都将在不同的应用程序之间共享。应用程序使用与此类似的命令运行
$JAVA_HOME/java -cp myApp.jar com.myApp.App1Main.java
jar文件包含三个应用程序都使用的log4j.properties文件
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语句或在方法中传递应用程序的名称等。
有更好的建议吗?我喜欢使用多个记录器的想法。正如我所看到的,在诸如MyAppService和MyAppDAO类的公共类中使用记录器存在问题。我想说,在实例化这些对象时,将logger对象传递给构造函数。如果使用静态记录器对象,则可能希望将其作为参数传递给对这些对象调用的方法。这样,您就不需要对记录器进行if-else条件检查。您希望每个类都登录到同一个文件中,但文件名应该取决于入口点。在每个主类中,您可以:
- 通过编程设置并将appender添加到根记录器
- 或加载其他属性文件
- 或者设置包含文件名的系统属性(而不是在命令行上设置)