Logback的浪漫: 记录每一个瞬间

Posted 巴扎嘿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Logback的浪漫: 记录每一个瞬间相关的知识,希望对你有一定的参考价值。


日志记录的作用一般有2个,一个是故障定位,一个是显示程序的运行状态


一个好的日志记录方式可以提供我们足够多定位问题的依据。日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事情。这里从最Logback基本的日志实现方式入手,辅以代码示例,总结如何配置日志以及相关使用:

 

一: 需要的jar包

 

    slf4j-api-1.6.0.jar


    logback-core-0.9.21.jar


    logback-classic-0.9.21.jar


    logback-access-0.9.21.jar

 

 

二:Logback的主要模块

     

    logback-access : 与servelt集成,通过http访问日志的功能。也就是说第三方可以通过这个模 块,访问日志记录的信息。


    logback-classic:log4j的改良版本,完整的实现了slf4j的API(同一个作者开发),性能很高,并且可以很方便的更换为其他日志系统。


    logback-core:日志基本服务类

 

三:主要标签


    Logger:存放日志对象,定义日志的类型、级别


    Appender:指定日志输出的目的地(可以是控制台,文件,远程服务器等)


    Layout:格式化日志信息输出。

 

 

四:代码实例

 

在看代码之前,说明一下,logback配置文件加载顺序。


目前完整的加载顺序是:


 

2.如果没有配置上面的属性, 将会在classpath中查找  logback.groovy 文件

 

3.如果没有找到文件, 将会在classpath中查找  logback-test.xml 文件

 

4.如果没有找到文件, 将会在classpath中查找  logback.xml 文件


5.如果没有找到文件, 如果是 jdk6+,那么会调用ServiceLoader 查找                 com.qos.logback.classic.spi.Configurator接口的第一个实现类

 

6.如果上面都没有,将自动使用ch.qos.logback.classic.BasicConfigurator,在控制台输出日志 。

 

这里,我采用的是在classpath中创建logback.xml文件的形式。

 

配置代码如下:

 

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

<!-- 属性含义=scan:自动扫描; scanPeriod:扫描周期,60s; debuglogback运行的状态信息,一般为false,不需要展示 -->

<configuration scan="true" scanPeriod="60 second" debug="false">

<!-- 定义参数常量 -->

<!-- 日志分级别显示:

TRACE<DEBUG<INFO<WARN<EEROR,级别依次增大,指定后面的级别,前面的就不会显示实际项目中一般使用DEBUG\INFO\ERROR级别,存储在不同的文件中。

 -->

<property name="log.level" value="debug" />

<!-- 日志文件的最大记录时间 -->

<property name="log.maxHistory" value="30" />

<!-- 文件路径 ,catalina.basetomcat实例的根目录,文件放在服务器的tomcat目录下-->

<property name="log.filePath" value="${catalina.base}/logs/webapps"/>

<!-- 日志展现的格式:日期+线程+级别+类及信息 -->

<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread] %-5level %logger{50}-%msg%n"/>


<!-- 控制台设置 -->

<!-- CONSOLE-->

<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">

<!-- encoder:将envent事件换行成byte数组,并将其输出到文件中。 -->

<encoder>

<pattern>${log.pattern}</pattern>

</encoder>

</appender>

<!-- DEBUG -->

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

<!-- 文件路径 -->

<file>${log.filePath}/debug.log</file>

<!-- 滚动策略:基于时间生成zip-->

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

<!-- 文件名称 -->

<fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz</fileNamePattern>

<!-- 最大保存历史数量:30-->

<maxHistory>${log.maxHistory}</maxHistory>

</rollingPolicy>

<encoder>

<pattern>${log.pattern}</pattern>

</encoder>

<!-- 过滤器:日志信息符合该设置,则保留,其他则不保留 -->

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>DEBUG</level>

<onMatch>ACCEPT</onMatch>

<onMismatch>DENY</onMismatch>

</filter>

</appender>


<!-- INFO -->

<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 -->

<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:

1 存放日志对象

2 告诉logback,需要关注哪个package的信息

 -->

<!-- additivity属性:为true时候,会在控制台打印相关级别的信息(不只是存入指定文件)-->

<!-- 注意:

业务里面,一个类只能对应一个logger,也就是说这个类的日志信息,可以在logger里输出,也可以在root中输出。

这里指定了package的名字,所以这个package的所有类和这个logger对应。

 -->

<logger name="com.imooc.o2o" level="${log.level}" additivity="true">

<!-- 绑定三个文件相关的appender,logger会往三个文件输出信息-->

<appender-ref ref="debugAppender"/>

<appender-ref ref="infoAppender"/>

<appender-ref ref="errorAppender"/>

</logger> 

<!-- root对象:特殊的Logger,可理解为根Logger -->

<!-- level属性:如果logger没有配置Level,那么会自动继承rootlevel信息 -->

<root level="debug">

<appender-ref ref="consoleAppender"/>

</root>

 </configuration>

 

测试运用:

 

@Controller

@RequestMapping("/superadmin")

public class AreaController {

@Autowired

private AreaService areaService;


@RequestMapping(value="/listarea",method=RequestMethod.GET)

@ResponseBody

public Map<String,Object> listArea(){

Logger logger = (Logger) LoggerFactory.getLogger(AreaController.class);


logger.info("=====start=====");

long startTime = System.currentTimeMillis();

Map<String,Object> modelMap = new HashMap<String,Object>();

try{

List<Area> areaList = areaService.getAreaList();

modelMap.put("rows", areaList);

modelMap.put("total", areaList.size());

}catch(Exception e){

modelMap.put("success", false);

modelMap.put("errorMsg", e.toString());

}


logger.error("=====error test=========");

long endTime = System.currentTimeMillis();

//{}为占位符,会显示endTime-startTime的结果值

logger.debug("costTime:[{}ms]",endTime-startTime);

logger.info("====end=====");

return modelMap;

}


}

 

五:结果

Console输出:

Logback的浪漫: 记录每一个瞬间

 

本地持久化:

 1 所有文件

2 日志打包文件

总结:

logback日志系统是目前使用的比较多的日志系统,性能比log4j要好很多,并且是同一大神写出来的,完整的实现了slf4j的API,所以能很方便的替换成其他的日志系统。


logback的功能很多,这里这是基本的使用了logback-classic模块的功能,显示程序的运行状态。如果有其他功能的使用,那就去啃官方文档(https://logback.qos.ch/)吧。

以上是关于Logback的浪漫: 记录每一个瞬间的主要内容,如果未能解决你的问题,请参考以下文章

logback的使用笔记

你真的了解logback吗?

logback介绍和配置详解

Loglogback指定配置文件

为什么要使用logback 日志框架?

SpringBoot如何与logback集成