PatternLayout自定义格式代码
package com.morlia.management.common.config;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.helpers.PatternParser;
public class Log4jExPatternLayout extends PatternLayout
{
public Log4jExPatternLayout()
{
super();
}
@Override protected PatternParser createPatternParser(String pattern)
{
return new Log4jExPatternParser(pattern);
}
}
package com.morlia.management.common.config;
import com.morlia.management.common.utils.DateUtil;
import org.apache.log4j.helpers.FormattingInfo;
import org.apache.log4j.helpers.PatternConverter;
import org.apache.log4j.helpers.PatternParser;
import org.apache.log4j.spi.LoggingEvent;
public class Log4jExPatternParser extends PatternParser
{
private static final char T = 'T';
private static final char D = 'D';
public Log4jExPatternParser(String pattern)
{
super(pattern);
}
@Override protected void finalizeConverter(char c)
{
if (c == T)
{
this.addConverter(new ExPatternConverter(this.formattingInfo));
}
else if (c == D)
{
this.addConverter(new TimePatternConverter(this.formattingInfo));
}
else
{
super.finalizeConverter(c);
}
}
private static class ExPatternConverter extends PatternConverter
{
public ExPatternConverter(FormattingInfo fi)
{
super(fi);
}
@Override protected String convert(LoggingEvent event)
{
return String.valueOf(Thread.currentThread().getId());
}
}
private static class TimePatternConverter extends PatternConverter
{
public TimePatternConverter(FormattingInfo fi)
{
super(fi);
}
@Override protected String convert(LoggingEvent event)
{
return DateUtil.getUTCTimeStr2();
}
}
}
log4j.xml 样例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<!-- 可以配置多个appender来对应不同的输出,如文件输出,sql输出,控制台输出,邮件输出等 -->
<!-- [控制台STDOUT] 不同的输出类型对应着不同的calss,如控制台输出class对应着 org.apache.log4j.ConsoleAppender -->
<!--name提供给logger或者root调用 -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<!--保存字符集 -->
<param name="encoding" value="UTF-8" />
<!--输出到控制台 -->
<param name="target" value="System.out" />
<!--loyout表示输出方式,可以多种,class值区分,PatternLayout表示自定义格式 -->
<layout class="com.morlia.management.common.config.Log4jExPatternLayout">
<!-- [method: %l] %l 表示当前的方法,它前面必须要加一个空格,否则不能定位到代码位置;
%m 表示日志打印的内容; %n 表示换行 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method: %l]%n%m%n%n" />
<!--输出格式,后面解释 -->
<!-- <param name="ConversionPattern" value="%D %T[from: %-40.40c{3} type: %-5p content: %m]%n" /> -->
</layout>
<!-- filter过滤器设置输出的级别:
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
所有下面输出的是debug到warn不会有error和fatal -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="debug" />
<param name="levelMax" value="error" />
<!--答案:http://bbs.csdn.net/topics/350195913 -->
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!--系统相关相关日志 -->
<appender name="system" class="org.apache.log4j.DailyRollingFileAppender">
<!-- ${webapp.root}项目根路径,自动获得,不用配置,可自己在web.xml中配置 -->
<param name="File" value="${management.root}../../logs/managementlogs/management-system.log" />
<!-- 是否项目重启继续保存之前日志 -->
<param name="Append" value="true" />
<param name="encoding" value="UTF-8" />
<!-- 记录所有类型日志,记录它和比它等级高的日志all<debug -->
<param name="threshold" value="all" />
<!-- 日期格式 例子:common-default.log.2015-09-17.log -->
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="com.morlia.management.common.config.Log4jExPatternLayout"> <!-- 输出方式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
<!-- <param name="ConversionPattern" value="%D %T[from: %-40.40c{3} type: %-5p content: %m]%n" /> -->
</layout>
</appender>
<!--游戏配置相关日志 -->
<appender name="config" class="org.apache.log4j.DailyRollingFileAppender">
<!-- ${webapp.root}项目根路径,自动获得,不用配置,可自己在web.xml中配置 -->
<param name="File" value="${management.root}../../logs/managementlogs/management-config.log" />
<!-- 是否项目重启继续保存之前日志 -->
<param name="Append" value="true" />
<param name="encoding" value="UTF-8" />
<!-- 记录所有类型日志,记录它和比它等级高的日志all<debug -->
<param name="threshold" value="all" />
<!-- 日期格式 例子:common-default.log.2015-09-17.log -->
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="com.morlia.management.common.config.Log4jExPatternLayout"> <!-- 输出方式 -->
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
<!-- <param name="ConversionPattern" value="%D %T[from: %-40.40c{3} type: %-5p content: %m]%n" /> -->
</layout>
</appender>
<!--
注意:
1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明
2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志
2-2:当对应的logger含有包含关系时,比如:name=test.log4j.test8 和 name=test.log4j.test8.UseLog4j,则2-1的情况是一样的
2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称哟!注意啦!
3:logger中定义的level和appender中的filter定义的level的区间取交集
4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息
-->
<!-- Root Logger -->
<!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
<logger name="org.springframework.scheduling" additivity="false">
<level value ="INFO"/>
<appender-ref ref="console"/>
<appender-ref ref="db"/>
</logger>
<!--指定logger的设置,additivity指示是否遵循缺省的继承机制 -->
<logger name="com.morlia.management.service.configservice" additivity="false">
<level value ="INFO"/>
<appender-ref ref="console"/>
<appender-ref ref="config"/>
</logger>
<!-- 所有logger的父类,记录所有的日志。 -->
<root>
<!-- 限定记录等级 ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
<level value="INFO"></level>
<!-- 调用记录方式 -->
<appender-ref ref="system" />
<appender-ref ref="console" />
</root>
</log4j:configuration>