我有一个log4j2.xml文件,我配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="log-path">${sys:catalina.base}/logs</Property>
</Properties>
<Appenders>
<!-- console appender -->
<Console name="console-log" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n"/>
</Console>
<!-- file appender -->
<RollingFile name="commons-log" fileName="${log-path}/commons.log"
filePattern="${log-path}/commons-%d{yyyy-MM-dd}.log">
<!-- log pattern -->
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c{1} - %msg%n</pattern>
</PatternLayout>
<!-- set file size policy -->
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="5 MB" />
</Policies>
</RollingFile>
<RollingFile name="analytics-log" fileName="${log-path}/analytics.log"
filePattern="${log-path}/analytics-%d{yyyy-MM-dd}.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.test.app" level="debug" additivity="false">
<appender-ref ref="commons-log" level="debug"/>
<appender-ref ref="analytics-log" level="warn"/>
<appender-ref ref="console-log" level="debug"/>
</Logger>
<Root level="info" additivity="false">
<AppenderRef ref="console-log"/>
</Root>
</Loggers>
现在,我想将日志数据自定义为commons.log和analytics.log文件。
java中的示例:
private static final Logger logCommon = LogManager.getLogger("commons-log");
private static final Logger logAnalytics = LogManager.getLogger("analytics-log");
我想在需要时自定义写入每个文件的日志,例如:
logCommons.info ("Need it save into commons.log file");
logAnalytics.info ("Only save into analytics.log file");
问题:我该怎么做?请帮我修复log4j2.xml文件和Java代码示例中的所有问题。
谢谢!
答案 0 :(得分:7)
尝试如下,您正在将调试日志写入同一记录器中的两个文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="log-path">${sys:catalina.base}/logs</Property>
</Properties>
<Appenders>
<!-- console appender -->
<Console name="console-log" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} [%t] %c{1} - %msg%n"/>
</Console>
<!-- file appender -->
<RollingFile name="commons-log" fileName="${log-path}/commons.log"
filePattern="${log-path}/commons-%d{yyyy-MM-dd}.log">
<!-- log pattern -->
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c{1} - %msg%n</pattern>
</PatternLayout>
<!-- set file size policy -->
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="5 MB" />
</Policies>
</RollingFile>
<RollingFile name="analytics-log" fileName="${log-path}/analytics.log"
filePattern="${log-path}/analytics-%d{yyyy-MM-dd}.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.test.app.commons" level="debug" additivity="false">
<appender-ref ref="commons-log" level="debug"/>
<appender-ref ref="analytics-log" level="warn"/>
</Logger>
<Logger name="com.test.app.console" level="debug" additivity="false">
<appender-ref ref="console-log" level="debug"/>
<appender-ref ref="analytics-log" level="warn"/>
</Logger>
<Root level="info" additivity="false">
<AppenderRef ref="console-log"/>
</Root>
</Loggers>
答案 1 :(得分:5)
我认为问题来自于你在一台记录器中拥有所有的appender ref。
此外,记录器名称按照您在java代码中为Logger指定的名称过滤日志条目。
您在示例中使用过:
private static final Logger logCommon = LogManager.getLogger("commons-log");
private static final Logger logAnalytics = LogManager.getLogger("analytics-log");
因此,您的记录器需要具有相同的名称。 你能做的是:
<Logger name="com.test.app" level="debug" additivity="false">
<appender-ref ref="console-log" level="debug"/>
<!-- you can put other appender references here if you want to log you
app logs in a specific file -->
</Logger>
<Logger name="commons-log" level="debug" additivity="false">
<appender-ref ref="commons-log" level="debug"/>>
</Logger>
<Logger name="analytics-log" level="debug" additivity="false">
<appender-ref ref="analytics-log" level="warn"/>
</Logger>
这样,它会根据记录器名称将日志拆分为不同的文件。
希望它有所帮助!
答案 2 :(得分:1)
您可以像这样配置记录器:
String log4jfile = topDir + "log4j2.xml";
PropertyConfigurator.configure(log4jfile);
其中log4jfile是您要使用的配置文件的路径。如果不这样做,它将只有默认行为。