今天学习一个项目的时候,里面有个LogBack日志工具。用来做日志分析的。所以在网上查阅了一番资料,并学习了一波。在此总结一下。
1.简介
LogBack是一个日志框架,它是Log4j作者的又一个日志组件。
网上有一段介绍当前日志框架组件的话,我复制过来。助于理解。
slf4j由log4j作者Ceki开发,逐步取代apahce commons logging。
logback由log4j作者Ceki开发,逐步取代log4j。
slf4j等于commons-logging,是各种日志实现的通用入口
logback相比较log4j的优势
slf4j支持参数化的logger.error("帐号ID:{}不存在", userId);
告别了if(logger.isDebugEnable()) 时代。
另外logback的整体性能比log4j也较佳,hibernate等项目已经采用了slf4j。
2.核心对象
logback为取代log4j而生,当前可分为三个模块:logback-core,logback-classic,logback-access
logback的核心对象有logger,Appender,layout.logback主要建于logger,appender,layout这三个类之上。
1.Logger,即我们常用的日志记录器。把它关联到应用的对应的context上之后,主要用于存放日志对象,也可以定义日志类型,级别。Logger对象一般多定义为静态常量
public class MyApp {
final static Logger logger = LoggerFactory.getLogger("MyApp.class");
public static void main(String[] args) {
logger.trace("trace");
logger.debug("debug str");
logger.info("info str");
logger.warn("warn");
logger.error("error");}
2.Appender:用于指定日志输出的目的地,目的地可以是控制台,文件,远程套接字服务器,MySQL等数据库。
3.Layout:负责把事件转化为字符串,格式化的日志信息的输出。具体的layout通配符,可以查看帮助文档。
3.level
logger可以被分配几倍,级别包括:TRACE,DEBUG,INFO,WARN,ERROR,定义域ch.qos.logback.classic.Level类,程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少,如果设置级别为INFO,则优先级高于INFO(WARN,ERROR)级别的日志可以被输出,但是小于该级别的(TRACE,DEBUG)将不会被输出,为确保所有logger都能够最终继承一个级别,根logger总是有级别,默认情况下级别为DEBUG。
4.三值逻辑
LogBack的过滤器基于三值逻辑,允许把他们组装或成链,从而组成任意的符合过滤策略。过滤器很大程度上收到linux的iptables启发,所谓三值逻辑就是说过滤器返回值只能是ACCEPT,DENY和NEUTRAL的其中一个
DENY表示记录时间立即被抛弃,不再经过剩余过滤器,NEUTRAL表示有序列表里的下一个过滤器会接着处理记录事件,ACCEPT表示记录时间被立即处理,不再经过剩余过滤器。
5.Filter过滤器
logback-classic 提供两种类型的过滤器:常规过滤器和TuroboFilter过滤器。Logback整体流程:Logger产生日志信息llayout修饰这条msg的显示格式;Filrer过滤显示的内容,Appender具体的显示,即保存这日志信息的地方。
6.实际中解释
我把最近完善的一个logback.xml贴上,毕竟实际项目中的文件最能说明问题。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置信息,每60s扫描一次,这里的debug若设置为true,则会实时打印出logback的信息,所以这里我们设置为false-->
<configuration scan="true" scanPeriod="60 second" debug="false">
<!-- 定义参数常量 -->
<!-- TRACE<DUBUG<INFO<WARNING<ERROR 从小到大 -->
<!-- log的level默认值是debug -->
<property name="log.level" value="debug"></property>
<!-- 文件保留时间。30天 -->
<property name="log.maxhistory" value="30"></property>
<!-- 日志文件的存储跟路径,catalina.base是tomcat下实例的路径 -->
<property name="log.filePath" value="${catalina.base}/logs/webapps"></property>
<!-- 日志内容的形式(格式) +执行的线程+日志级别+日志相关的信息-->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"></property>
<!-- 定义4个appender,后三个将日志分为3个级别。 -->
<!-- 输出到控制台的配置-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!-- 类似于layout,并有将转化后的文件写入文件中的功能 -->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- DEBUG -->
<!-- class代表相关的类 -->
<appender name="debugAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/debug.log</file>
<!-- rolling策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称,压缩文件的形式 -->
<fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 文件最大保存历史 -->
<maxHistory>
${log.maxhistory}
</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 过滤器,过滤掉非dubug level的信息。 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch><!-- 过滤掉非debug信息 -->
</filter>
</appender>
<!-- INFO 与debug配置形式相似-->
<appender name="infoAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>
${log.maxhistory}
</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- ERROR 与debug配置形式相似 -->
<appender name="errorAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>
${log.maxhistory}
</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- logger配置,定义日志对象 ,日志需要记录的package。需要与appender绑定 -->
<!-- additivity =true,logger会将root下面的appender放入logger中,此项目中,会在控制台中输入相关的信息。 -->
<logger name="com.imooc.o2o" level="${log.level}" additivity="true">
<appender-ref ref="debugAppender"></appender-ref>
<appender-ref ref="infoAppender"></appender-ref>
<appender-ref ref="errorAppender"></appender-ref>
</logger>
<!-- 特殊的logger,相当于logger的父属性-->
<root level="info">
<appender-ref ref="consoleAppender"></appender-ref>
</root>
</configuration>
相关的细节在注释中写的很清楚了。