log4j自定义级别并分类输出到文件
2017-04-29 11:47
435 查看
背景介绍:为service中的每个方法进行日志记录,记录方法执行时间以及方法名、方法用途、返回结果等。记录工具采用了log4j,并自定义级别,然后分类输出到文件中。
首先,自定义log4j级别:
定义过滤器:
配置文件log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 输出日志到控制台 ConsoleAppender -->
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="DEBUG"></param>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss} -%t] %c:%L%n%m%n"></param>
</layout>
</appender>
<!-- 记录info信息 每天一个文件 -->
<appender name="info" class="org.apache.log4j.DailyRollingFileAppender">
<param name="DatePattern" value="'_'yyyy-MM-dd'.log'"></param>
<param name="File" value="D:/Servers/logs/log_info"></param>
<param name="Encoding" value="UTF-8"></param>
<param name="Append" value="true"></param>
<param name="Threshold" value="INFO"></param>
<filter class="com.cisdi.tool.serviceLog.ServiceLogFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss} -%t] %c:%L%n%m%n"></param>
</layout>
</appender>
<!-- 记录错误信息 文件大小到达指定尺寸的时候产生一个新的文件 -->
<appender name="error" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/Servers/logs/log_error"></param>
<param name="DatePattern" value="'_'yyyy-MM-dd'.log'"/>
<param name="Append" value="true"></param>
<param name="Threshold" value="ERROR"></param>
<param name="MaxFileSize" value="2000KB"></param>
<param name="Encoding" value="UTF-8"></param>
<filter class="com.cisdi.tool.serviceLog.ServiceLogFilter">
<param name="LevelMin" value="Error" />
<param name="LevelMax" value="Error" />
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss} -%t] %c:%L%n%m%n"></param>
</layout>
</appender>
<!-- 自定义日志,用来记录service操作记录 -->
<appender name="serviceLog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/Servers/logs/serviceLog"></param>
<param name="DatePattern" value="'_'yyyy-MM-dd"></param>
<param name="Encoding" value="UTF-8"></param>
<param name="Append" value="true"></param>
<param name="Threshold" value="SERVICELOG"></param>
<filter class="com.cisdi.tool.serviceLog.ServiceLogFilter">
<param name="LevelMin" value="SERVICELOG" />
<param name="LevelMax" value="SERVICELOG" />
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %m%n%n"></param>
</layout>
</appender>
<!--
定义全局的日志输出级别,但是在输出目的地的配置中配置的具体输出级别优先级高于全局定义的优先级。
如果在railyFile中定义<param name="Threshold" value="info"></param>,那么将会把info以上级别的信息输出
-->
<root>
<priority value="info" />
<appender-ref ref="stdout" />
<appender-ref ref="info" />
<appender-ref ref="error" />
<appender-ref ref="serviceLog" />
</root>
</log4j:configuration>
配置文件的使用,需要在web.xml中配置使用(由于笔者使用时,采用的java web项目)
关于自定义的日志级别具体使用请参见另一篇文章《AOP实现方法的日志记录》
首先,自定义log4j级别:
public class ServiceLog { private static Logger logger = Logger.getLogger(ServiceLog.class); // 定义级别 private static class ServiceLogLevel extends Level { private static final long serialVersionUID = 1L; private ServiceLogLevel(int level, String name, int sysLogLevel) { super(level, name, sysLogLevel); } } // 20050级别数,"SERVICELOG":级别名称 private static final Level SERVICE_LOG_LEVEL = new ServiceLogLevel(20050, "SERVICELOG", SyslogAppender.LOG_LOCAL0); // 使用时调用方法 public static void serviceLogger(Object pm_objLogInfo) { logger.log(SERVICE_LOG_LEVEL, pm_objLogInfo); } }
定义过滤器:
public class ServiceLogFilter extends Filter { boolean acceptOnMatch = false; private String levelMin; private String levelMax; public String getLevelMin() { return levelMin; } public void setLevelMin(String levelMin) { this.levelMin = levelMin; } public String getLevelMax() { return levelMax; } public void setLevelMax(String levelMax) { this.levelMax = levelMax; } public boolean isAcceptOnMatch() { return acceptOnMatch; } public void setAcceptOnMatch(boolean acceptOnMatch) { this.acceptOnMatch = acceptOnMatch; } @Override public int decide(LoggingEvent lgEvent) { int inputLevel = lgEvent.getLevel().toInt(); if (inputLevel >= getLevel(levelMin) && inputLevel <= getLevel(levelMax)) { return 0; } return -1; } private int getLevel(String level) { level = level.toUpperCase(); if (level.equals("SERVICELOG")) { return LevelType.SERVICELOG.getType(); } if (level.equals("OFF")) { return LevelType.OFF.getType(); } if (level.equals("FATAL")) { return LevelType.FATAL.getType(); } if (level.equals("ERROR")) { return LevelType.ERROR.getType(); } if (level.equals("INFO")) { return LevelType.INFO.getType(); } if (level.equals("WARN")) { return LevelType.WARN.getType(); } if (level.equals("DEBUG")) { return LevelType.DEBUG.getType(); } if (level.equals("ALL")) { return LevelType.ALL.getType(); } return LevelType.OFF.getType(); } private static enum LevelType { OFF(2147483647), FATAL(50000), ERROR(40000), WARN(30000), INFO(20000), DEBUG(10000), ALL(-2147483648), SERVICELOG(20050); int type; public int getType() { return type; } private LevelType(int type) { this.type = type; } } }
配置文件log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 输出日志到控制台 ConsoleAppender -->
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="DEBUG"></param>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss} -%t] %c:%L%n%m%n"></param>
</layout>
</appender>
<!-- 记录info信息 每天一个文件 -->
<appender name="info" class="org.apache.log4j.DailyRollingFileAppender">
<param name="DatePattern" value="'_'yyyy-MM-dd'.log'"></param>
<param name="File" value="D:/Servers/logs/log_info"></param>
<param name="Encoding" value="UTF-8"></param>
<param name="Append" value="true"></param>
<param name="Threshold" value="INFO"></param>
<filter class="com.cisdi.tool.serviceLog.ServiceLogFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss} -%t] %c:%L%n%m%n"></param>
</layout>
</appender>
<!-- 记录错误信息 文件大小到达指定尺寸的时候产生一个新的文件 -->
<appender name="error" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/Servers/logs/log_error"></param>
<param name="DatePattern" value="'_'yyyy-MM-dd'.log'"/>
<param name="Append" value="true"></param>
<param name="Threshold" value="ERROR"></param>
<param name="MaxFileSize" value="2000KB"></param>
<param name="Encoding" value="UTF-8"></param>
<filter class="com.cisdi.tool.serviceLog.ServiceLogFilter">
<param name="LevelMin" value="Error" />
<param name="LevelMax" value="Error" />
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss} -%t] %c:%L%n%m%n"></param>
</layout>
</appender>
<!-- 自定义日志,用来记录service操作记录 -->
<appender name="serviceLog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/Servers/logs/serviceLog"></param>
<param name="DatePattern" value="'_'yyyy-MM-dd"></param>
<param name="Encoding" value="UTF-8"></param>
<param name="Append" value="true"></param>
<param name="Threshold" value="SERVICELOG"></param>
<filter class="com.cisdi.tool.serviceLog.ServiceLogFilter">
<param name="LevelMin" value="SERVICELOG" />
<param name="LevelMax" value="SERVICELOG" />
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %m%n%n"></param>
</layout>
</appender>
<!--
定义全局的日志输出级别,但是在输出目的地的配置中配置的具体输出级别优先级高于全局定义的优先级。
如果在railyFile中定义<param name="Threshold" value="info"></param>,那么将会把info以上级别的信息输出
-->
<root>
<priority value="info" />
<appender-ref ref="stdout" />
<appender-ref ref="info" />
<appender-ref ref="error" />
<appender-ref ref="serviceLog" />
</root>
</log4j:configuration>
配置文件的使用,需要在web.xml中配置使用(由于笔者使用时,采用的java web项目)
<!-- log4j 系统日志--> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:config/log4j.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
关于自定义的日志级别具体使用请参见另一篇文章《AOP实现方法的日志记录》
相关文章推荐
- log4j按级别分类输出日志到相对路径日志文件
- Log4J日志配置详解和自定义log4j日志级别及输出日志到不同文件实现方法
- Log4J日志配置详解和自定义log4j日志级别及输出日志到不同文件实现方法
- 系统日志分类别输出至日志文件[Log4j应用]
- 【J2EE系列】log4j日志输出分级别或模块到不同文件
- Log4j按级别输出日志到不同的文件
- ----log4j----按时间和大小增加新日志文件/输出多个自定义日志文件 - pulybuffer的专栏 - 博客频道 - CSDN.NET
- log4j输出多个自定义日志文件
- Log4j按级别输出日志到不同的文件2009-09-07 13:29会按日存分割日志文件,并且根据级别输出到不同的文件
- log4j输出多个自定义日志文件,动态配置路径
- Log4j按级别输出日志到不同文件配置分析
- log4j自定义输出多个文件
- 将Log4j按不同级别输出到不同文件【是网上别的童鞋的一篇帖子,但我改了点东西,就属于翻译吧^_^】
- log4j输出多个自定义日志文件,动态配置路径
- log4j日志输出分级别或模块到不同文件
- log4j输出多个自定义路径的日志文件,动态配置路径
- log4j输出多个自定义日志文件,动态配置路径[转]
- log4j输出多个自定义日志文件
- Log4j日志分类别输出至日志文件 [Log4j应用]
- log4j输出多个自定义日志文件,动态配置路径