天天看点

java日志大全-第4篇:Logback

作者:不开心就撸代码

一、Logback的使用

Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。

1. Logback主要分为三个模块

Ø logback-core:其它两个模块的基础模块

Ø logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API

Ø logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

Ø 后续的日志代码都是通过SLF4J日志门面搭建日志系统,所以在代码是没有区别,主要是通过修改配置文件和pom.xml依赖

2. logback入门

Ø 依赖

<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-api</artifactId>
 <version>1.7.27</version>
</dependency>

<dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-classic</artifactId>
 <version>1.2.3</version>
</dependency>           

Ø 代码

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Demo1 {

 private static final Logger LOGGER = LoggerFactory.getLogger(Demo1.class);

   @Test
   public void test1(){
     //打印日志信息
     LOGGER.error("error");
     LOGGER.warn("warn");
     LOGGER.info("info");
     LOGGER.debug("debug");//默认级别
     LOGGER.trace("trace");
   }
}           
输出:
java日志大全-第4篇:Logback

3. logback配置

logback会依次读取以下类型配置文件:

1.logback.groovy

2.logback-test.xml

3.logback.xml

4.如果均不存在会采用默认配置

1》logback组件之间的关系

1. Logger:日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。

2. Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。

3. Layout:负责把事件转换成字符串,格式化的日志信息的输出。在logback中Layout对象被封装在encoder中。

2》基本配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
 <!--
 日志输出格式:
 %-5level
 %d{yyyy-MM-dd HH:mm:ss.SSS}日期
 %c类的完整名称
 %M为method
 %L为行号
 %thread线程名称
 %m或者%msg为信息
 %n换行
 -->
 <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>

 <!-- 输出的位置:控制台输出
 Appender: 设置日志信息的去向,常用的有以下几个
 ch.qos.logback.core.ConsoleAppender (控制台)
 ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新文件)
 ch.qos.logback.core.FileAppender (文件)
 -->
 <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
 <!--控制输出流对象 默认 System.out 改为 System.err-->
 <target>System.err</target>
 <!--日志消息格式配置-->
 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 <pattern>${pattern}</pattern>
 </encoder>
 </appender>

 <!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
 <root level="ALL">
 <appender-ref ref="console"/>
 </root>
</configuration>           
输出:
java日志大全-第4篇:Logback

3》文件输出:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
 <!--
 日志输出格式:
 %-5level
 %d{yyyy-MM-dd HH:mm:ss.SSS}日期
 %c类的完整名称
 %M为method
 %L为行号
 %thread线程名称
 %m或者%msg为信息
 %n换行
 -->
 <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>

 <!--日志文件存放的路径-->
 <property name="log_dir" value="D://logs"></property>


 <!-- 输出的位置:文件输出 -->
 <appender name="file" class="ch.qos.logback.core.FileAppender">
 <!--文件保存的路径-->
 <file>${log_dir}/logback.log</file>
 <!--日志消息格式配置-->
 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 <pattern>${pattern}</pattern>
 </encoder>
 </appender>

 <!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
 <root level="ALL">
 <appender-ref ref="file"/>
 </root>
</configuration>           
输出:
java日志大全-第4篇:Logback

4》文件输出(html)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
 <!--
 日志输出格式:
 %-5level
 %d{yyyy-MM-dd HH:mm:ss.SSS}日期
 %c类的完整名称
 %M为method
 %L为行号
 %thread线程名称
 %m或者%msg为信息
 %n换行
 -->
 <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>

 <!--日志文件存放的路径-->
 <property name="log_dir" value="D://logs"></property>

 <!-- 输出的位置: html 格式日志文件输出-->
 <appender name="file" class="ch.qos.logback.core.FileAppender">
 <!--文件保存的路径-->
 <file>${log_dir}/logback.html</file>
 <!--日志消息格式配置-->
 <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
 <layout class="ch.qos.logback.classic.html.HTMLLayout">
 <pattern>${pattern}</pattern>
 </layout>
 </encoder>
 </appender>

 <!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
 <root level="ALL">
 <appender-ref ref="file"/>
 </root>
</configuration>           
输出:
java日志大全-第4篇:Logback

5》日志拆分、压缩和过滤

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
 <!--
 日志输出格式:
 %-5level
 %d{yyyy-MM-dd HH:mm:ss.SSS}日期
 %c类的完整名称
 %M为method
 %L为行号
 %thread线程名称
 %m或者%msg为信息
 %n换行
 -->
 <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>

 <!--日志文件存放的路径-->
 <property name="log_dir" value="D://logs"></property>

 <!-- 输出的位置: 日志拆分、归档压缩和过滤 -->
 <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
 <!--文件保存的路径-->
 <file>${log_dir}/logback.log</file>
 <!--日志消息格式配置-->
 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 <pattern>${pattern}</pattern>
 </encoder>
 <!--拆分规则-->
 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 <!--按照时间和压缩格式声明拆分的文件名-->
 <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
 <!--按照文件大小拆分-->
 <maxFileSize>1MB</maxFileSize>
 </rollingPolicy>
 <!--日志级别过滤器-->
 <filter class="ch.qos.logback.classic.filter.LevelFilter">
 <!--日志过滤规则-->
 <level>ERROR</level>
 <onMatch>ACCEPT</onMatch>
 <onMismatch>DENY</onMismatch>
 </filter>
 </appender>

 <!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
 <root level="ALL">
 <appender-ref ref="rollFile"/>
 </root>
</configuration>           
输出:
java日志大全-第4篇:Logback
java日志大全-第4篇:Logback

6》异步日志和自定义logger

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的属性 通过 ${name} 进行引用 -->
 <!--
 日志输出格式:
 %-5level
 %d{yyyy-MM-dd HH:mm:ss.SSS}日期
 %c类的完整名称
 %M为method
 %L为行号
 %thread线程名称
 %m或者%msg为信息
 %n换行
 -->
 <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>

 <!--日志文件存放的路径-->
 <property name="log_dir" value="D://logs"></property>

 <!-- 输出的位置: 日志拆分、归档压缩和过滤 -->
 <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
 <!--文件保存的路径-->
 <file>${log_dir}/logback.log</file>
 <!--日志消息格式配置-->
 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 <pattern>${pattern}</pattern>
 </encoder>
 <!--拆分规则-->
 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
 <!--按照时间和压缩格式声明拆分的文件名-->
 <fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
 <!--按照文件大小拆分-->
 <maxFileSize>1MB</maxFileSize>
 </rollingPolicy>
 <!--日志级别过滤器-->
 <filter class="ch.qos.logback.classic.filter.LevelFilter">
 <!--日志过滤规则-->
 <level>ERROR</level>
 <onMatch>ACCEPT</onMatch>
 <onMismatch>DENY</onMismatch>
 </filter>
 </appender>

 <!--异步日志-->
 <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
 <appender-ref ref="rollFile"/>
 </appender>

 <!--root logger 配置-->
 <!-- <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
 <root level="ALL">
 <appender-ref ref="rollFile"/>
 </root>

 <!---自定义logger-->
 <!--
 用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
 <loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性
 name:
 用来指定受此logger约束的某一个包或者具体的某一个类。
 level:
 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,如果未设置此属性,那么当前logger将会继承上级的级别。
 additivity:
 是否向上级loger传递打印信息。默认是true。
 <logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger
 -->
 <logger name="com.hk.log.logback" level="info" additivity="false">
 <appender-ref ref="rollFile"/>
 </logger>
</configuration>           

4. 官方提供的log4j.properties转换成logback.xml

https://logback.qos.ch/translator/

5. logback-access的使用

logback-access模块与Servlet容器(如Tomcat和Jetty)集成,以提供HTTP访问日志功能。我们可以使用logback-access模块来替换tomcat的访问日志。

1. 将logback-access.jar与logback-core.jar复制到$TOMCAT_HOME/lib/目录下

2. 修改$TOMCAT_HOME/conf/server.xml中的Host元素中添加:

<Valve className="ch.qos.logback.access.tomcat.LogbackValve" />

3. logback默认会在$TOMCAT_HOME/conf下查找文件 logback-access.xml

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

<!-- always a good activate OnConsoleStatusListener -->

<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/>

<property name="LOG_DIR" value="${catalina.base}/logs"/>

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

<file>${LOG_DIR}/access.log</file>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<fileNamePattern>access.%d{yyyy-MM-dd}.log.zip</fileNamePattern>

</rollingPolicy>

<encoder>

<!-- 访问日志的格式 -->

<pattern>combined</pattern>

</encoder>

</appender>

<appender-ref ref="FILE"/>

</configuration>

4. 官方配置:

https://logback.qos.ch/access.html#confifiguration