log4j2以单独文件的形式打印各级日志
我需要在一个单独的文件中打印每个级别的日志。例如,调试消息应单独打印在调试文件中,而其他级别的日志不应打印在调试文件中。。 我不熟悉日志,所以你能更正代码吗log4j2以单独文件的形式打印各级日志,log4j2,Log4j2,我需要在一个单独的文件中打印每个级别的日志。例如,调试消息应单独打印在调试文件中,而其他级别的日志不应打印在调试文件中。。 我不熟悉日志,所以你能更正代码吗 <?xml version="1.0" encoding="UTF-8"?> <Configuration monitorinterval="30" status="info" strict="true"> <Properties> <Property name="debug
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorinterval="30" status="info" strict="true">
<Properties>
<Property name="debug">D://logs/debug.log</Property>
<Property name="info">D://logs/info.log</Property>
<Property name="warn">D://logs/warn.log</Property>
<Property name="error">D://logs/error.log</Property>
<Property name="fatal">D://logs/fatal.log</Property>
</Properties>
<Appenders>
<Appender type="File" name="Debug_file" fileName="${debug}">
<Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
</Appender>
<Appender type="File" name="Info_file" fileName="${info}">
<Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
</Appender>
<Appender type="File" name="Warn_file" fileName="${warn}">
<Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
</Appender>
<Appender type="File" name="Error_file" fileName="${error}">
<Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
</Appender>
<Appender type="File" name="Fatal_file" fileName="${fatal}">
<Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
</Appender>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="File" />
</Root>
</Loggers>
</Configuration>
D://logs/debug.log
D://logs/info.log
D://logs/warn.log
D://logs/error.log
D://logs/fatal.log
至少有两种不同的方法可以实现您的目标。一种方法是使用LevelRangeFilter
(请参阅),如以下示例配置所示:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="LOG_PATTERN">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
</Properties>
<Appenders>
<File name="TraceFile" fileName="logs/Trace.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
<LevelRangeFilter minLevel="TRACE" maxLevel="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
<File name="DebugFile" fileName="logs/Debug.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
<LevelRangeFilter minLevel="DEBUG" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
<File name="InfoFile" fileName="logs/Info.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
<LevelRangeFilter minLevel="INFO" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
<File name="WarnFile" fileName="logs/Warn.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
<LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
<File name="ErrorFile" fileName="logs/Error.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
<LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
<File name="FatalFile" fileName="logs/Fatal.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
<LevelRangeFilter minLevel="FATAL" maxLevel="FATAL" onMatch="ACCEPT" onMismatch="DENY"/>
</File>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="TraceFile" />
<AppenderRef ref="DebugFile" />
<AppenderRef ref="InfoFile" />
<AppenderRef ref="WarnFile" />
<AppenderRef ref="ErrorFile" />
<AppenderRef ref="FatalFile" />
</Root>
</Loggers>
</Configuration>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="LOG_PATTERN">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
</Properties>
<Appenders>
<File name="TraceFile" fileName="logs/Trace.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</File>
<File name="DebugFile" fileName="logs/Debug.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</File>
<File name="InfoFile" fileName="logs/Info.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</File>
<File name="WarnFile" fileName="logs/Warn.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</File>
<File name="ErrorFile" fileName="logs/Error.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</File>
<File name="FatalFile" fileName="logs/Fatal.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</File>
<Routing name="Routing">
<Routes>
<Script name="RoutingInit" language="JavaScript"><![CDATA[
logEvent.getLevel();]]>
</Script>
<Route ref="TraceFile" key="TRACE" />
<Route ref="DebugFile" key="DEBUG" />
<Route ref="InfoFile" key="INFO" />
<Route ref="WarnFile" key="WARN" />
<Route ref="ErrorFile" key="ERROR" />
<Route ref="FatalFile" key="FATAL" />
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="Routing" />
</Root>
</Loggers>
</Configuration>
在这种配置中,附加器对日志事件的级别无关紧要。RoutingAppender
是决定将哪些事件发送给哪个appender的决策者。我倾向于使用RoutingAppender
,因为它可以利用。如果添加返回与日志事件关联的级别名称的,则可以使用该查找动态创建附加器。查找代码和修改后的配置如下所示:
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;
@Plugin(name = "level", category = "Lookup")
public class LevelLookup implements StrLookup{
/**
* Lookup the value for the key.
* @param key the key to be looked up, may be null
* @return The value for the key.
*/
public String lookup(String key) {
return null;
}
/**
* Lookup the value for the key using the data in the LogEvent.
* @param event The current LogEvent.
* @param key the key to be looked up, may be null
* @return The value associated with the key.
*/
public String lookup(LogEvent event, String key) {
return event.getLevel().name();
}
}
以下是利用新查找的修订配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="LOG_PATTERN">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
</Properties>
<Appenders>
<Routing name="Routing">
<Routes pattern="$${level:}">
<Route>
<File name="${level:}File" fileName="logs/${level:}.log" immediateFlush="true"
append="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</File>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="Routing" />
</Root>
</Loggers>
</Configuration>
%d{HH:mm:ss.SSS}[%t]-5级别%logger{36}-%msg%n
与其他配置一样,这将根据日志事件的日志级别向文件发送日志消息。例如,INFO
level事件将被记录到logs/INFO.log中
我希望这对您有所帮助。Log4j现在提供了一个事件查找,因此您可以执行${event:Level},而不是创建自己的自定义查找。