【问题标题】:How to use AspectJ to change Log4j output file name dynamically如何使用 AspectJ 动态更改 Log4j 输出文件名
【发布时间】:2013-05-30 20:27:44
【问题描述】:

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

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

【问题讨论】:

  • 如果你知道版本号为什么需要AOP来做这个?
  • 我知道这是旧的,但仍列为未答复。如果它看起来合适,请您接受并支持我的回答吗?谢谢。

标签: logging log4j aspectj


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多