Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java log4j-写入/记录到多个日志文件取决于应用程序_Java_Logging_Log4j - Fatal编程技术网

Java log4j-写入/记录到多个日志文件取决于应用程序

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

假设我有一个名为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
唯一的区别是,每个应用程序使用一组不同的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添加到根记录器
  • 或加载其他属性文件
  • 或者设置包含文件名的系统属性(而不是在命令行上设置)

您不能在AppMain类中设置记录器,然后将其传递给共享类吗?您甚至可以在代码中更改log4j系统属性