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>