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
Java 将位于相同包层次结构下的2个类的日志消息打印到2个不同的文件中_Java_Logging_Log4j_Rollingfileappender - Fatal编程技术网

Java 将位于相同包层次结构下的2个类的日志消息打印到2个不同的文件中

Java 将位于相同包层次结构下的2个类的日志消息打印到2个不同的文件中,java,logging,log4j,rollingfileappender,Java,Logging,Log4j,Rollingfileappender,我在同一个包中有两个Java类。我想将这两个类中的消息记录到两个不同的日志文件中 这两个文件中的任何一个都不应重复日志消息 我正在使用以下log4j.properties文件: # Set root category priority to DEBUG and its appender to CONSOLE and LOGFILE_ENGINE. log4j.rootCategory=DEBUG, LOGFILE_ENGINE, SYNC_HANDLER log4j.additivity.L

我在同一个包中有两个Java类。我想将这两个类中的消息记录到两个不同的日志文件中

这两个文件中的任何一个都不应重复日志消息

我正在使用以下log4j.properties文件:

# Set root category priority to DEBUG and its appender to CONSOLE and LOGFILE_ENGINE.
log4j.rootCategory=DEBUG, LOGFILE_ENGINE, SYNC_HANDLER


log4j.additivity.LOGFILE_ENGINE = false
log4j.additivity.SYNC_HANDLER = false


log4j.category.org.jboss=ERROR
log4j.category.org.apache.axis=ERROR
log4j.category.org.springframework=ERROR
log4j.category.org.hibernate=ERROR
log4j.category.org.jgroups=ERROR
log4j.category.org.apache.catalina.loader.WebappClassLoader=OFF
log4j.logger.net.sourceforge.stripes=ERROR
log4j.logger.net.sf.ehcache=ERROR
log4j.additivity.org.jboss.cache=false
log4j.logger.org.quartz=ERROR

# LOGFILE_ENGINE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE_ENGINE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE_ENGINE.File=${catalina.home}/logs/file1.log
log4j.appender.LOGFILE_ENGINE.Append=true
log4j.appender.LOGFILE_ENGINE.maxBackupIndex=5
log4j.appender.LOGFILE_ENGINE.maxFileSize=10MB
log4j.appender.LOGFILE_ENGINE.Threshold=INFO
log4j.appender.LOGFILE_ENGINE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE_ENGINE.layout.ConversionPattern=%d{MMM dd, yyyy hh:mm:ss.SSS a} %-5p %c - %m%n


log4j.appender.SYNC_HANDLER=org.apache.log4j.RollingFileAppender
log4j.appender.SYNC_HANDLER.File=${catalina.home}/logs/file2.log
log4j.appender.SYNC_HANDLER.Append=true
log4j.appender.SYNC_HANDLER.maxBackupIndex=5
log4j.appender.SYNC_HANDLER.maxFileSize=10MB
log4j.appender.SYNC_HANDLER.Threshold=DISASTER#PackageName.className
log4j.appender.SYNC_HANDLER.layout=org.apache.log4j.PatternLayout
log4j.appender.SYNC_HANDLER.layout.ConversionPattern=%d{MMM dd, yyyy hh:mm:ss.SSS a} %-5p %c - %m%n
DISASTER#PackageName.className
是我通过扩展
org.apache.log4j

我的问题1。file2.log中的日志消息会重复出现在file1.log文件中

2.是否可以通过log4j进行基于类的日志记录


不用说,我对
Log4j

很天真,你想要的是:

log4j.rootLogger=DEBUG, file1, file2

log4j.appender.file1=org.apache.log4j.RollingFileAppender
...

log4j.appender.file2=org.apache.log4j.RollingFileAppender
...

log4j.logger.my.package.MyClassA=DEBUG, file1
log4j.additivity.my.package.MyClassA=false

log4j.logger.my.package.MyClassB=DEBUG, file2
log4j.additivity.my.package.MyClassB=false

这意味着您可以在记录器中使用类名。希望这有帮助

我找到了解决问题的方法。
我为我想要单独日志的类创建了一个自定义日志级别。
我尝试了以下log4j配置:

log4j.rootCategory=DEBUG, LOGFILE_ENGINE

log4j.category.packageName.className = DEBUG, packageName.className.syncLogger
log4j.additivity.packageName.className= false

log4j.appender.LOGFILE_ENGINE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE_ENGINE.File=${catalina.home}/logs/file1.log
.....................

log4j.appender.packageName.className.syncLogger=org.apache.log4j.RollingFileAppender
log4j.appender.packageName.className.syncLogger.File=${catalina.home}/logs/file2.log
log4j.appender.packageName.className.syncLogger.Threshold=DISASTER#packageName.SyncLogLevel
.....................
我创建了记录器引用,如下所示:

private static final String FQCN = className.class.getName();
private static final String SYNC_LOGGER_NAME = FQCN + ".syncLogger";
public static customLoggingClassName syncLogger = Logger.getLogger(SYNC_LOGGER_NAME);
syncLogger.log(SyncLogLevel.DISASTER, "Log Message");
下面是用于创建自定义级别(灾难)的自定义级别类(SyncLogLevel):

在此之后,您必须按如下方式在所需的类中进行日志记录:

private static final String FQCN = className.class.getName();
private static final String SYNC_LOGGER_NAME = FQCN + ".syncLogger";
public static customLoggingClassName syncLogger = Logger.getLogger(SYNC_LOGGER_NAME);
syncLogger.log(SyncLogLevel.DISASTER, "Log Message");
最后,从syncLogger调用的日志级别为“灾难”的所有日志消息都将转到一个单独的文件(file2.log)


完成所有这些操作后,我的所有日志将分别放入所需的文件中

我很抱歉,但我已经尝试过这个,它抛出错误。一些Bean创建异常。请参考我下面的答案。谢谢