0

我在一个 Tomcat 中部署了同一应用程序的多个版本。它们每个都有相同的 Log4j 配置文件。因此,当所有这些应用程序写入日志时,它们最终都在同一个目录中。

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

4

1 回答 1

0

是的。因为我没有 Tomcat 经验,所以我只是使用任意 JAR 文件(Apache Commons Compress 1.4.1)来读取清单数据。您可以轻松调整示例代码以满足您的需求。

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

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 -   org.apache.log4j.ConsoleAppender@32c41a
INFO -   org.apache.log4j.FileAppender@e89b94: my.log

这里没有惊喜。现在让我们假设我们要添加从ZipArchiveInputStream的父 JAR 中的清单读取的版本号。为了实现这一点,我们可以拦截对 Log4J 的构造函数调用,FileAppender并仅操作恰好总是文件名的第二个参数。为简单起见,我没有拦截默认构造函数或任何设置器。

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 -   org.apache.log4j.ConsoleAppender@12d03f9
INFO -   org.apache.log4j.FileAppender@5ffb18: my.log.1.4.1

答对了!我们已经动态更改了日志文件名。:-)

于 2013-05-31T12:23:23.000 回答