1.log4j简单介绍
log4j的三大组件:loggers、appenders、layout
- loggers为日志记录器,负责处理日志记录的大部分操作。
- appenders 为日志信息的输出目的地,log4j中所有继承自Appender接口的类。他们一起定义了log4j需要把日志写到哪些地方,比如数据库或者是文件。
- layout为日志信息的输出格式。
log4j输出信息的类别level为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL等。常用优先级为:ERROR>WARN>INFO>DEBUG。
举个例子:如果配置的level级别为WARN,那么意味着只有WARN、ERROR、FATAL被输出。DEBUG、INFO将被屏蔽掉。
log4j支持两种配置文件格式,一种是XML格式的文件,一种时properties格式的文件。
2.言归正传,log4j.xml如何配置?
- 引入log4j的依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
2.log.xml的配置
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="true">
<!--输出到控制台-->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="com.sf.sgs.sflog.log4j.layout.SfPatternLayout"/>
</appender>
<!--输出到文件(info)-->
<!--将生成“info.log.2014-06-11”这样的日志文件-->
<appender name="SYSTEM" class="com.sf.sgs.sflog.log4j.appender.SFDailyRollingFileAppender">
<!-- 设置日志信息输出文件路径 -->
<param name="File" value="./log4j/logs/system.log" />
<!-- 设置日志每天回滚一次,即产生一个新的日志文件 -->
<param name="datePattern" value="'.'yyyy-MM-dd'.log'" />
<!-- 设置日志输出的样式 -->
<layout class="com.sf.sgs.sflog.log4j.layout.SfPatternLayout">
</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>
<!--输出到文件(error)-->
<appender name="ERROR" class="com.sf.sgs.sflog.log4j.appender.SFDailyRollingFileAppender">
<!-- 设置日志每天回滚一次,即产生一个新的日志文件 -->
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<param name="File" value="./log4j/logs/error.log" />
<param name="maxBackupIndex" value="3" />
<layout class="com.sf.sgs.sflog.log4j.layout.SfPatternLayout">
</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>
<logger name="org.apache" additivity="false">
<level value="ERROR" />
<appender-ref ref="console" />
</logger>
<root>
<level value="INFO" />
<appender-ref ref="SYSTEM"/>
<appender-ref ref="ERROR"/>
</root>
</log4j:configuration>
3. 测试类,程序中使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
/**
* log4j测试
*/
@Service
public class Log4jTest {
private Logger logger = LoggerFactory.getLogger(Log4jTest.class);
protected void TestLog() {
logger.trace("trace级别的日志输出");
logger.debug("debug级别的日志输出");
logger.info("info级别的日志输出");
logger.warn("warn级别的日志输出");
logger.error("error级别的日志输出");
}
}
注意:
1:当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制
2:logger中的name非常重要,它代表记录器的包的形式,有一定的包含关系,试验表明
2-1:当定义的logger的name同名时,只有最后的那一个才能正确的打印日志
2-2:当对应的logger含有包含关系时,比如:name=com.test.log4j和 name=com.test.log4j.test11,则2-1的情况是一样的
2-3:logger的name表示所有的包含在此名的所有记录器都遵循同样的配置,name的值中的包含关系是指记录器的名称!
3:logger中定义的level和appender中的filter定义的level的区间取交集
4:如果appender中的filter定义的 levelMin > levelMax ,则打印不出日志信息