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日常应用总结的主要内容,如果未能解决你的问题,请参考以下文章

Linux/Mac 日常入门命令行的规整总结

14-Java之-Logback大型项目使用总结

logback之Appender源码解读

最全最详细Logback高级讲解

jvm故障排查

千万项目Logback项目使用总结