2

假设我有一个名为 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 语句或在方法等中传递应用程序的名称。有更好的建议吗?

4

2 回答 2

2

您希望每个类都登录到同一个文件,但文件的名称应取决于入口点。在每个主要课程中,您可以:

  • 以编程方式设置附加程序并将其添加到根记录器。
  • 或加载不同的属性文件
  • 或设置包含文件名的系统属性(而不是在命令行上设置)
于 2013-04-12T14:41:34.123 回答
1

我喜欢使用多个记录器的想法。正如我所见,您在 MyAppService 和 MyAppDAO 类等常见类中使用记录器时遇到问题。我会说在实例化这些对象时,将记录器对象传递给构造函数。如果您使用静态记录器对象,那么您可能希望将作为参数传递给您在这些对象上调用的方法。这样您就不需要对记录器进行 if-else 条件检查。

于 2013-04-12T14:14:31.420 回答