log4j

1. 描述和备注

a). 两种配置方式,log4j.xml和log4j.properties
b). 由3个东西组成,
		"logger"--负责采集日志,程序中使用,有继承关系
		"appender"--负责日志输出到哪里,控制台或文件
		"layout"--定义日志输出的格式

1.1 Maven

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

1.2 日志打印时组件调用顺序

a). 日志信息传入 Logger.
b). 将日志信息封装成 LoggingEvent 对象并传入 Appender.
c). 在 Appender 中调用 Filter 对日志信息进行过滤,调用 Layout 对日志信息进行格式化,然后输出.
d). Logger Logger = LogManager.getLogger("categorylog");   (<category标签的name属性>) -->  category --> Appender  

1.5 示例

public class Ts {
	// 按字符串匹配category,无则匹配到root, 支持按package层级匹配
	Logger Logger = LogManager.getLogger(Ts.class);

	@Test
	public void test() throws InterruptedException {
		while (true) {
			Logger.debug("This is debug ..");
			Logger.info("This is info ..");
			Logger.error("This is error ..\n\n");
			Thread.sleep(2000);

			// log4j.xml动态修改
			DOMConfigurator.configure(Ts.class.getResource("/log4j.xml"));
		}
	}
}


//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 name="CONSOLE" class="org.apache.log4j.ConsoleAppender">  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>  
        </layout>  
    </appender>  
  
    <appender name="FILE-DEBUG" class="org.apache.log4j.DailyRollingFileAppender">  
        <param name="DatePattern" value="'.'yyyyMMdd" />  
        <param name="Append" value="true"/>  
        <param name="Threshold" value="DEBUG"/>  
        <param name="Encoding" value="UTF-8"/>  
        <param name="file" value="./debug.log"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="[%d{HH:mm:ss}] [%p] - %l - %m%n"/>  
        </layout>  
    </appender>  
    
    <!-- 支持按包过滤,也可以直接是字符串 -->
    <category name="zhou.test">  
        <priority value="ERROR"/>  
        <appender-ref ref="CONSOLE"/>  
        <appender-ref ref="FILE-DEBUG"/>  
    </category>  
</log4j:configuration> 

3. log4j.xml

3.2 Appender--日志位置

内置 appender : 
	1).ConsoleAppender (控制台), 
	2).FileAppender (文件), 
	3).DailyRollingFileAppender (每天产生一个日志文件), 
	4).RollingFileAppender (文件大小到达指定尺寸的时候产生一个 新的文件) 
	5).WriterAppender (将日志信息以流格式发送到任意指定的地方) 

3.2.1 示例-每天输出一个日志

<appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">  
    <param name="File" value="${jboss.server.home.dir}/log/server.log"/>  

    <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->  
    <param name="Append" value="false"/>  
    <!-- Rollover at midnight each day -->  
    <param name="DatePattern" value="'.'yyyy-MM-dd"/>  
	
    <layout class="org.apache.log4j.PatternLayout">  
        <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>  
    </layout>  
</appender>  

3.2.2 cmi中实际使用示例

	<appender name="SYSTEM_RUN_FILE"
			  class="com.huawei.mdn.cms.log.CMSAppender">
		<param name="File" value="../logs/run/CMI_system_run" />
		<param name="MaxFileSize" value="&runLogSize;" />
		<param name="MaxBackupIndex" value="20" />
		<param name="Append" value="true" />
		
		<layout class="com.huawei.mdn.cms.log.MdnSystemRunLogLayout"/>
		
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="INFO"/>
			<param name="LevelMax" value="FATAL"/>
		</filter>

	</appender>

3.2.3 filter标签

	<!--过滤器设置输出的级别-->       
	<filter class="org.apache.log4j.varia.LevelRangeFilter">       
		<param name="levelMin" value="debug" />       
		<param name="levelMax" value="warn" />       
		<param name="AcceptOnMatch" value="true" />       
	</filter> 

3.2.5 自定义Appender--如把日志发送到flute

继承AppenderSkeleton类-->[一般]实现Append方法即可

 

3.4. layout--日志格式

//内置layout
	HTMLLayout(以HTML表格形式布局),
	PatternLayout(可自定义布局和输出内容)-- 常用 
	SimpleLayout(包含日志信息的级别和信息字符串),
	TTCCLayout(包含日志产生的时间、线程、类别等等信息)

Log4J采用类似C的printf函数的格式化日志,打印参数如下: -- 常用 “[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n”
	%p 	输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
	%l 	输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:com.Testlog4.main(TestLog4.java:10)
        %d 	输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
	%n 	输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
        %m 	输出代码中指定的消息
        
        %x   
        %t 	输出产生该日志事件的线程名        

	%r 	输出自应用启动到输出该log信息耗费的毫秒数
	%c 	输出所属的类目,通常就是所在类的全名
	%M   调用logger的方法名。
	

3.4.1 示例参见3.3.1节

    <layout class="org.apache.log4j.PatternLayout">  
        <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>  
    </layout>  
</appender>  

3.4.2 自定义layout--自定义输出格式

继承 TTCCLayout等内置的layout,或是layout接口-->实现format方法即可
public class MdnDebugLogLayout extends TTCCLayout
{
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";

    public MdnDebugLogLayout()
    {
    }

    @SuppressWarnings("unchecked")
    public String format(LoggingEvent event)
    {
        LocationInfo locationInfo = event.getLocationInformation();
        String lineNumber = locationInfo.getLineNumber();
        String fileName = locationInfo.getFileName();
        String threadName = event.getThreadName();
        String message = event.getRenderedMessage();

        setDateFormat(DATE_FORMAT);
        buf.setLength(0);
        buf.append("[");
        buf.append(threadName);

        return buf.toString();
    }
}

3.5 catagory/root标签--定义打印日志的包

//Logger Logger = LogManager.getLogger("categorylog");   (<category标签的name属性>) -->  category --> Appender 
    <appender name="FILE-DEBUG" class="org.apache.log4j.DailyRollingFileAppender">  
        <param name="DatePattern" value="'.'yyyyMMdd" />  
        <param name="Append" value="true"/>  
        <param name="Threshold" value="DEBUG"/>  
        <param name="Encoding" value="UTF-8"/>  
        <param name="file" value="${profile.log.root.path}/${profile.log.name.web}/${profile.log.name.web}-debug.log"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%7r] %-5p %c %M:%L - %m%n"/>  
        </layout>  
    </appender>  
  
	<!-- 日志过滤,只打印 com.portal.controller路径下日志 -->
    <category name="com.portal.controller">  
        <priority value="INFO"/>  
        <appender-ref ref="CONSOLE"/>  
    </category>  
  
    <root>  
        <priority value="INFO"/>  
        <appender-ref ref="CONSOLE"/>  
        <appender-ref ref="FILE-DEBUG"/>  
    </root>  
</log4j:configuration>  
posted @ 2017-11-27 21:45  Desneo  阅读(163)  评论(0编辑  收藏  举报