前不久学习到的log4j,有必要来总结一下啦~
- 常用的值框架
commons logging ,slf4j, log4j, logback, Jul(Java Util Logging)
简单介绍一下:
java.util.logging, JDK标准库中的类,是JDK1.4版本之后添加的日志记录的功能包
Log4j, 最强大的日志记录方式,可以通过配置 .properties 或 .xml 文件配置日志的目的地,格式等等。
commons-logging, 最综合和常见的日志记录方式,是java中的一个日志接口,一般会与log4j一起使用,自带simpleLog可用于日志记录。
好啦,下面重点总结log4j
1.Log4j的组成
Logging记录器 -> 常用的五个级别:DEBUG<INFO<WARN<ERROR<FATAL
appender输出源
layout布局 -> 四种日志输出样式:HTML、自由样式指定、包含日志级别与信息样式、包含日志时间,线程类别等信息的样式
2.Log4j的配置
两种方式:配置日志的目的地,格式等等。
1).properties文件
2).xml 文件
一般找到的基本上都是第一种方式配置的,我用的是第二种,xml文件配置方式
下面是我项目的配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<!-- console print -->
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d %c [%t] %L - %m%%%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="DEBUG" />
<param name="levelMax" value="OFF" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- debug level daily file -->
<appender name="FILE_DEBUG" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="E://log_debug.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d %c [%t] - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="DEBUG" />
<param name="levelMax" value="DEBUG" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- info level daily file -->
<appender name="FILE_INFO" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="E://log_info.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d %c [%t] - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="INFO" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- warn level daily file -->
<appender name="FILE_WARN" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="E://log_warn.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d %c [%t] - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="WARN" />
<param name="levelMax" value="WARN" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- error level daily file -->
<appender name="FILE_ERROR" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="E://log_error.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d %c [%t] - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="ERROR" />
<param name="levelMax" value="ERROR" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<!-- '.'yyyy-MM-dd-HH-mm -->
<!-- daily file info-->
<appender name="DailyLog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="E://daily.log" />
<param name="append" value="true" />
<param name="DatePattern" value="'.'yyyyMMdd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="OFF" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<logger name="com.test.TestLog4j" additivity="false">
<level value="DEBUG" />
<appender-ref ref="STDOUT"/>
<appender-ref ref="DailyLog" />
</logger>
<root>
<level value="INFO" />
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE_DEBUG" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_WARN" />
<appender-ref ref="FILE_ERROR" />
</root>
</log4j:configuration>
3.Log4j日志的级别
ALL<TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF
常用 DEBUG INFO WARN ERROR 这四种,对于每种不同级别的操作,demo中已经全部测试完毕
4.哪些情况下必须要打日志
1)系统启动参数,环境变量
2)异常的捕获处
3)函数获得期望之外的结果时
4)关键操作
之前对日志并不是很上心,以为没有什么用,后来才发现,日志很重要,生产环境中,一旦程序出现问题,只能从输出的日志中查看问题所在并对其进行相应的解决,可能有些人会觉得log日志跟system.out.print没什么区别,在开发环境中,用system.out完全没有什么大问题,哪里有问题直接打印在了控制台中,但如果是生产环境,那么大的一个项目,很难找出准确的问题,难道要一个一个out去看嘛,这个时候,日志就起到了非常重要的作用。
好啦,把我的demo贴上:
- TestLog4j.java
package com.test;
import org.apache.log4j.Logger;
public class TestLog4j {
private static final Logger logger = Logger.getLogger(TestLog4j.class);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
logger.debug("hey.I am debug");
logger.info("I am right info");
logger.warn("attention!I am warn");
logger.error("oh,it's error");
logger.fatal("I am fatal");
// log.off("I am off"); //没有off方法
}
}
输出如下:今天先这样啦,有了新的心得再补充啦~~