Log4j: 将特定类的输出记录到特定的 appender

我使用 log4j,并希望将某些 Loggers 的输出路由到特定文件。

我已经准备好了很多附件。现在,为了使调试更容易,我想告诉 log4j 一个特定类(例如 foo.bar)生成的输出。Baz)应写入特定的日志文件。

这能做到吗?

139907 次浏览

举个例子:

log4j.rootLogger=ERROR, logfile


log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.datePattern='-'dd'.log'
log4j.appender.logfile.File=log/radius-prod.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%-6r %d{ISO8601} %-5p %40.40c %x - %m\n


log4j.logger.foo.bar.Baz=DEBUG, myappender
log4j.additivity.foo.bar.Baz=false


log4j.appender.myappender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.myappender.datePattern='-'dd'.log'
log4j.appender.myappender.File=log/access-ext-dmz-prod.log
log4j.appender.myappender.layout=org.apache.log4j.PatternLayout
log4j.appender.myappender.layout.ConversionPattern=%-6r %d{ISO8601} %-5p %40.40c %x - %m\n

这里有一个关于 XML 配置的答案,请注意,如果您不给文件附加器一个 ConversionPattern,它将创建0字节的文件,而不写任何东西:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">


<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
</layout>
</appender>


<appender name="bdfile" class="org.apache.log4j.RollingFileAppender">
<param name="append" value="false"/>
<param name="maxFileSize" value="1GB"/>
<param name="maxBackupIndex" value="2"/>
<param name="file" value="/tmp/bd.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
</layout>
</appender>


<logger name="com.example.mypackage" additivity="false">
<level value="debug"/>
<appender-ref ref="bdfile"/>
</logger>


<root>
<priority value="info"/>
<appender-ref ref="bdfile"/>
<appender-ref ref="console"/>
</root>


</log4j:configuration>

下面是一个将详细信息记录到单独文件中的例子,每个月的转出文件和删除超过180天的日志:

#property settings
property.LOG_DIR = /opt/logs/app_name/


#Console appenders
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yy/MM/dd HH:mm:ss.SSS} %p %c{1}: %m%n


#root loggers
rootLogger.level = INFO
rootLogger.appenderRef.stdout.ref = STDOUT
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.files.ref = Rolling


# Rolling file appender
appender.rolling.type = RollingFile
appender.rolling.name = Rolling
appender.rolling.fileName= ${LOG_DIR}/application.log
appender.rolling.filePattern= ${logFile}.%i
appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=%d{yy/MM/dd HH:mm:ss.SSS} %p %c{1}: %m%n
appender.rolling.policies.type=Policies
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.policies.size.size=50MB
appender.rolling.strategy.max=20


#custom logging for audit-viewer
logger.aduit.name = auditlogger
logger.aduit.level = info
logger.aduit.appenderRefs = auditRef
logger.aduit.appenderRef.auditRef.ref = AuditAppender
logger.aduit.additivity = false


# Logging audit details to dedicated file
appender.aduitfile.type = RollingFile
appender.aduitfile.fileName = ${AUDIT_FILE}
appender.aduitfile.filePattern= ${LOG_DIR}/audit.%d{yyyy-MM}.log
appender.aduitfile.name = AuditAppender
appender.aduitfile.layout.type = PatternLayout
appender.aduitfile.layout.pattern = %d{yy/MM/dd HH:mm:ss.SSS} %p %c{1}: %m%n
appender.aduitfile.policies.type = Policies
appender.aduitfile.policies.time.type =TimeBasedTriggeringPolicy
appender.aduitfile.strategy.type = DefaultRolloverStrategy
#Rollout files based on month
appender.aduitfile.policies.time.interval=1
appender.aduitfile.policies.time.modulate= true
appender.aduitfile.ImmediateFlush=true
appender.aduitfile.append=true
appender.aduitfile.strategy.action.type = Delete
appender.aduitfile.strategy.action.basepath = ${LOG_DIR}
appender.aduitfile.strategy.action.maxdepth = 1
appender.aduitfile.strategy.action.PathConditions.type = IfFileName
#This below field uses relative path from basepath
appender.aduitfile.strategy.action.PathConditions.glob = audit.*.log
appender.aduitfile.strategy.action.condition.type = IfLastModified
appender.aduitfile.strategy.action.condition.age = P180D




# Settings to quiet third party or custom logs that are too verbose
loggers = mongodb, aduit


logger.mongodb.name=org.mongodb.driver.cluster
logger.mongodb.level=ERROR

在这里,如果您希望将来自某个类的日志放到单独的文件中,比如 auditlogger,那么可以在类中使用它,如下所示:

  private val logger = LogManager.getLogger("auditlogger") //dont change this appender ref
logger.info("Find me inside 'audit.log' file")