[英]Logging in separate .log files using Log4j
我正在开发一个多模块Maven Web项目。
假设结构看起来像这样:
Project
Module1
Module2
Persist
log4j.properties
我设法将所有日志条目记录到一个文件中(将log4j.properties文件放置在project-persist模块中)。 到目前为止,这很清楚。 现在,有一些模块我想将日志分成其他文件。 仅添加一个新的附加程序(示例中为testAppender)对我不起作用,因为那样一来,我就无法获取写入日志的.java文件的路径。 如果我这样写:
Logger log = Logger.getLogger("testAppender");
我得到这样的东西:
2017-276-06 15:00:00,032 [INFO ] Start rule activation. (testAppender)[__ejb-thread-pool3]
这就是我想要的:
2016-06-06 15:00:00,032 [INFO ] Start rule activation. (Module1.src.main.java.somepkg.MyClass)[__ejb-thread-pool3]
其中MyClass是.java文件。
我还尝试向Maven模块(Module1和Module2)中添加一个全新的(独立的)log4j.properties文件,就像在Persist模块中一样,我想使用不同的路径将日志与.log分开。文件,但它仅记录来自Maven测试的条目-这是我遇到的另一个问题,但一次只能记录一个。
有没有一种方法可以添加一个新的附加程序,该附加程序将按其所来自的模块分隔日志条目,并将其打印在.log文件中?
在jar模块中,从jar中排除文件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<excludes>
<exclude>log4j.xml</exclude>
</excludes>
</configuration>
</plugin>
使用buildhelper插件将log4j.xml作为单独的工件附加到构建
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>attach-artifacts</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${project.build.outputDirectory}/log4j.xml</file>
<type>xml</type>
<classifier>log4j</classifier>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
现在在您的战争工件中,将xml复制到输出目录:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>prepare-package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>your.jar.project.artifactId</artifactId>
<version>${project.version}</version>
<type>xml</type>
<classifier>log4j</classifier>
<outputDirectory>${project.build.outputDirectory}
</outputDirectory>
<destFileName>log4j.xml</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
但是当然,首先将文件放在[web-artifact] / src / main / resources中会更容易:-)
因此,我找到了解决此问题的方法。
我创建了一个获取记录器对象的类,并从记录器对象中获取了将它们分开所需的信息。 我会手动初始化记录器。 希望这会对某人有所帮助!
在每个使用Logger的类中,我也称为初始化器。
public class ClassA{
private final Logger LOGGER = Logger.getLogger(ClassA.class);
static{
LOGGER.addAppender(LogConfig.init(LOGGER));
}
some code...
}
这是我在LogConfig类中所做的:
public class LogConfig {
public static RollingFileAppender init(Logger LOGGER) {
String logInfo = LOGGER.getClass().toString();
String loglevel = getLogLevel(logInfo);
String logClazz = getLogClazz(logInfo);
String logModule = getModule(logInfo);
PatternLayout PL = new PatternLayout("%d [%-5p] %m (%c)[%t]%n");
try {
if (logModule == "presentation") {
RollingFileAppender appender = new RollingFileAppender(PL, "PathToLogFile_1.log", true);
return appender;
}
else if (logModule == "business") {
RollingFileAppender appender = new RollingFileAppender(PL, "PathToLogFile_2.log", true);
return appender;
}
RollingFileAppender appender = new RollingFileAppender(PL, "PathToLogFile_3.log", true);
return appender;
}catch (IOException e) {
e.printStackTrace();
}
return null;
}
private static String getLogClazz(String logInfo) {
return logInfo.substring(logInfo.indexOf("("), logInfo.indexOf(")") + 1);
}
private static String getLogLevel(String logInfo) {
return logInfo.substring(24, 31);
}
private static String getModule(String logInfo) {
logInfo = logInfo.substring(logInfo.indexOf("(") + 15, logInfo.length());
return logInfo.substring(0, logInfo.indexOf("."));
}
}
如果您曾经使用此代码,请注意,您将不得不调整三种返回类名,日志级别和模块名的方法,具体取决于您对包,类,模块等的命名方式。
LOGGER.getClass()。toString(); 返回一个看起来像这样的字符串
[timestamp] (moduleName.packageName.src.java.yourClassName);
使用String.class()方法,您可以轻松获取所需的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.