logback日常应用总结
Posted weiguolong0306
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了logback日常应用总结相关的知识,希望对你有一定的参考价值。
一、logback简介:logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系
统如log4j或JDK14 Logging。
二、特点如下:
1、基于我们先前在log4j上的工作,logback 重写了内部的实现,在某些特定的场景上面,甚至可以比之前的速度快上10
倍。在保证logback的组件更加快速的同时,同时所需的内存更加少。
2、logback-classic中的登陆类自然的实现了SLF4J。当你使用 logback-classic作为底层实现时,涉及到LF4J日记系统的
问题你完全不需要考虑。更进一步来说,由于 logback-classic强烈建议使用SLF4J作为客户端日记系统实现,如果需要切换到
log4j或者其他,你只需要替换一个jar包即可,不需要去改变那些通过SLF4J API 实现的代码。这可以大大减少更换日记系统的工
作量。
3、Logback-classic可以在配置文件被修改后,自动重新载入。这个扫描过程很快,无资源争用,并且可以动态扩展支持
在上百个线程之间每秒上百万个调用。它和应用服务器结合良好,并且在JEE环境通用,因为它不会调用创建一个单独的线程来做扫
描。
4、FileAppender和它的子类,包括RollingFileAppender,可以优雅的从I/O错误中恢复。所以,如果一个文件服务器临时
宕机,你再也不需要重启你的应用,而日志功能就能正常工作。当文件服务器恢复工作,logback相关的appender就会透明地和快速
的从上一个错误中恢复。
5、RollingFileAppender可以在回滚操作中,自动压缩归档日志文件。压缩通常是异步执行的,所以即使是很大的日志文
件,你的应用都不会因此而被阻塞。
6、Lilith是logback的一个记录和访问事件查看器。它相当于log4j的 chainsaw,但是Lilith设计的目的是处理大量的日
志记录。
7、在谨慎模式中,在多个JVM中运行的多个FileAppender实例,可以安全的写入统一个日志文件。谨慎模式可以在一定的
限制条件下应用于RollingFileAppend
三、名词解释
configuration : logback配置文件的根节点(起始节点), 有如下属性:
scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属
性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
configuration 只有三个子节点: appender、 logger、 root
logger:
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<loger>仅有一个name属性,一个可选的
level和一个可选的addtivity属性。
name: 指定一个包或者具体的某一个类。
level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,如果未设置此属性,那么当
前loger将会继承上级的级别。
addtivity: 是否向上级loger传递打印信息。默认是true。
appender-ref: 标识关联的appender将会添加到这个loger。
root:
和logger一样, 他是根logger,或特殊的logger,只有一个level属性,level可选 TRACE, DEBUG, INFO, WARN, ERROR,
ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
appender: 负责写日志的组件。有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。
常用到appender有:
ConsoleAppender:把日志添加到控制台 ;
FileAppender: 日志添加到文件;
RollingFileAppender: 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。这可
以做到按照某一个规则实现日志分割。
appender中一个特别的元素:filter。
<filter>:
过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日志将立即被抛弃不再经过其他过滤
器;返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。
过滤器被添加到<Appender> 中,为<Appender> 添加一个或多个过滤器后,可以用任意条件对日志进行过滤。<Appender> 有多个过
滤器时,按照配置顺序执行。
下面是几个常用的过滤器:
LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒
绝日志。有以下子节点:
<level>:设置过滤级别
<onMatch>:用于配置符合过滤条件的操作
<onMismatch>:用于配置不符合过滤条件的操作
例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。
四、使用logback, 首先需要引入其jar, 如下:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
五、范例及说明
<configuration>
<!--
写日志的组件,ConsoleAppender表示将日子写入到控制台。
-->
<appender name="api-console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--
%date表示时间,中是时间格式,%thread表示线程号, %-5level表示日志级别格式进行左对齐,且最小宽度为5。
%logger36:输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边点符号之后的字符串。
%msg%n 其中msg表示打印输出的消息, %n表示换行
-->
<pattern>%dateHH:mm:ss.SSS [%thread] %-5level %logger36 - %msg%n
</pattern>
</encoder>
</appender>
<!--
RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件, 其属性:
<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
<encoder>:对记录事件进行格式化。(具体参数稍后讲解 )
<rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
<triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。
<prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空
-->
<appender name="api-rollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/data/logs/api/api.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/data/logs/api/api.%dyyyy-MM-dd.log
</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%dateHH:mm:ss.SSS [%thread] %-5level %logger36 - %msg%n
</pattern>
</encoder>
</appender>
<appender name="api-error"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/data/logs/api/api-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/data/logs/api/api-error.%dyyyy-MM-dd.log
</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%dateHH:mm:ss.SSS [%thread] %-5level %logger36 - %msg%n
</pattern>
</encoder>
</appender>
<!--
LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。有以下子节点:
<level>:设置过滤级别
<onMatch>:用于配置符合过滤条件的操作
<onMismatch>:用于配置不符合过滤条件的操作
表示所有INFO级别的日志,由此appender处理,非INFO级别的日志,被过滤掉.
-->
<appender name="api-LOGHUB" class="com.iyouqu.dycm.route.utils.loghub.StaLoghubAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="api-analysis"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/data/logs/api/api-analysis.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/data/logs/api/api-analysis.%dyyyy-MM-dd.log
</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%dateHH:mm:ss.SSS [%thread] %-5level %logger36 - %msg%n
</pattern>
</encoder>
</appender>
<appender name="api-coalescingStatistics" class="org.perf4j.logback.AsyncCoalescingStatisticsAppender">
<timeSlice>60000</timeSlice>
<appender-ref ref="api-analysis"/>
</appender>
<logger name="org.perf4j.TimingLogger" level="DEBUG" additivity="false">
<appender-ref ref="api-console" />
<appender-ref ref="api-analysis" />
<appender-ref ref="api-coalescingStatistics" />
</logger>
<!--manager -->
<logger name="com.iyouqu.dycm.route.utils.loghub" level="INFO" >
<appender-ref ref="api-LOGHUB" />
</logger>
<!--
logger:日志控制。name属性表示某一个包下的日志或者某一个具体类。addtivity属性:是否向上级loger传递打印信息。默认是true。
appender-ref: 指定某一个具体的写日志组件。
-->
<logger name="com.iyouqu.dycm.route" level="DEBUG" additivity="false">
<appender-ref ref="api-console" />
<appender-ref ref="api-rollingFile" />
</logger>
<!-- error 日志 -->
<logger name="com.iyouqu.dycm" level="ERROR" additivity="false">
<appender-ref ref="api-error" />
</logger>
</configuration>
说明:
上面的配置, logback会将当前的日志写入到api.log等file所定义的日志中, 如果今天结束到下一天开始的时候, logback默认会将当天的日志进行拆分为api.yyyy-MM-dd.log, 会重新建一个api.log 继续写日志。
以上是关于logback日常应用总结的主要内容,如果未能解决你的问题,请参考以下文章