2013-05-30 96 views
0

我在同一个Tomcat中部署了同一应用程序的多个版本。他们每个人都有相同的Log4j配置文件。所以,当所有这些应用程序写入日志时,它们都会在同一个目录中。如何使用AspectJ动态更改Log4j输出文件名

我想知道是否有方法根据部署的应用程序的版本号动态更新日志的相应位置。

+0

如果你知道版本号为什么你需要AOP来做到这一点? –

+0

我知道这个是旧的,但仍列为未答复。如果看起来合适,请您接受并提出我的答案吗?谢谢。 – kriegaex

回答

0

是的。因为我没有Tomcat的经验,所以我只是使用一个任意的JAR文件(Apache Commons Compress 1.4.1)到read manifest data。您可以轻松调整示例代码以适应您的需求。

假设你有这样的应用程序:

package de.scrum_master.aop.java; 

import java.util.Enumeration; 
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; 
import org.apache.log4j.*; 

public class Application { 
    public static void main(String[] args) throws Exception { 
     Logger logger = Logger.getLogger(ZipArchiveInputStream.class); 
     logger.addAppender(new ConsoleAppender(new SimpleLayout())); 
     logger.addAppender(new FileAppender(new SimpleLayout(), "my.log")); 
     logger.info("Logger: " + logger.getName()); 
     logger.info("Appenders:"); 
     for (Enumeration<Appender> appenders = logger.getAllAppenders(); appenders.hasMoreElements();) { 
      Appender appender = appenders.nextElement(); 
      if (appender instanceof FileAppender) 
       logger.info(" " + appender + ": " + ((FileAppender) appender).getFile()); 
      else 
       logger.info(" " + appender); 
     } 
    } 
} 

没有AspectJ的输出如下:

INFO - Logger: org.apache.commons.compress.archivers.zip.ZipArchiveInputStream 
INFO - Appenders: 
INFO - [email protected] 
INFO - [email protected]: my.log 

这里没有惊喜。现在让我们假设我们想要添加从ZipArchiveInputStream的父JAR中的清单读取的版本号。为了达到这个目的,我们可以拦截构造函数调用Log4J FileAppender并且只是操作第二个参数,而这个参数总是文件名。为了简单起见,我不拦截默认构造函数或任何setter。

package de.scrum_master.aop.aspectj; 

import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; 
import org.apache.log4j.FileAppender; 

public aspect LogFileChanger { 
    pointcut fileAppenderCreation(String fileName) : 
     call(public FileAppender.new(*, String, ..)) && args(*, fileName, ..); 

    FileAppender around(String fileName) : fileAppenderCreation(fileName) { 
     Class<?> clazz = ZipArchiveInputStream.class; 
     Package pkg = clazz.getPackage(); 
     return proceed(fileName + "." + pkg.getSpecificationVersion()); 
    } 
} 

现在输出变化如下:

INFO - Logger: org.apache.commons.compress.archivers.zip.ZipArchiveInputStream 
INFO - Appenders: 
INFO - [email protected] 
INFO - [email protected]: my.log.1.4.1 

宾果!我们已经动态地更改了日志文件的名称。 :-)