Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 如何使用AspectJ动态更改Log4j输出文件名_Logging_Log4j_Aspectj - Fatal编程技术网

Logging 如何使用AspectJ动态更改Log4j输出文件名

Logging 如何使用AspectJ动态更改Log4j输出文件名,logging,log4j,aspectj,Logging,Log4j,Aspectj,我在一个Tomcat中部署了同一应用程序的多个版本。它们都有相同的Log4j配置文件。因此,当所有这些应用程序写入日志时,它们最终都会在同一个目录中 我想知道是否有一种方法可以根据部署的应用程序的版本号动态更新日志各自的位置。是的。因为我没有Tomcat的经验,所以我只是使用一个任意的JAR文件(ApacheCommonsCompress1.4.1)来从。您可以轻松地调整示例代码以满足您的需要 假设您有这样一个应用程序: package de.scrum\u master.aop.java; 导

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


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

是的。因为我没有Tomcat的经验,所以我只是使用一个任意的JAR文件(ApacheCommonsCompress1.4.1)来从。您可以轻松地调整示例代码以满足您的需要

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

package de.scrum\u master.aop.java;
导入java.util.Enumeration;
导入org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
导入org.apache.log4j.*;
公共类应用程序{
公共静态void main(字符串[]args)引发异常{
Logger Logger=Logger.getLogger(ZipArchiveInputStream.class);
addAppender(新的ConsoleAppender(新的SimpleLayout());
addAppender(新的FileAppender(新的SimpleLayout(),“my.log”);
logger.info(“logger:+logger.getName());
logger.info(“Appenders:”);
对于(枚举appenders=logger.getAllAppenders();appenders.hasMoreElements();){
Appender Appender=appenders.nextElement();
if(文件追加器的追加器实例)
logger.info(“+appender+”:“+((FileAppender)appender.getFile());
其他的
logger.info(“+appender”);
}
}
}
不带AspectJ的输出如下:

INFO-Logger:org.apache.commons.compress.archivers.zip.ZipArchiveInputStream
信息-附件:
INFO-org.apache.log4j。ConsoleAppender@32c41a
INFO-org.apache.log4j。FileAppender@e89b94:my.log
这并不奇怪。现在让我们假设我们想要添加一个从
ZipArchiveInputStream
的父JAR中的清单读取的版本号。为了实现这一点,我们可以截获对Log4J
FileAppender
的构造函数调用,只需操作第二个参数,它恰好总是文件名。为了简单起见,我没有拦截默认构造函数或任何setter

package de.scrum\u master.aop.aspectj;
导入org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
导入org.apache.log4j.FileAppender;
公共方面日志文件转换器{
切入点文件附录创建(字符串文件名):
调用(public FileAppender.new(*,String,…)&&args(*,fileName,…);
FileAppender(字符串文件名):fileAppenderCreation(文件名){
Class clazz=ZipArchiveInputStream.Class;
Package pkg=clazz.getPackage();
返回继续(fileName+“+pkg.getSpecificationVersion());
}
}
输出现在更改如下:

INFO-Logger:org.apache.commons.compress.archivers.zip.ZipArchiveInputStream
信息-附件:
INFO-org.apache.log4j。ConsoleAppender@12d03f9
INFO-org.apache.log4j。FileAppender@5ffb18:my.log.1.4.1

宾果!我们已动态更改日志文件名<代码>:-)

如果您知道版本号,为什么需要AOP来执行此操作?我知道此版本很旧,但仍列为未答复版本。如果我的回答合适的话,请你接受并投赞成票好吗?谢谢