2013-05-30 40 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 

賓果!我們已經動態地更改了日誌文件的名稱。 :-)