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; debug:logback运行的状态信息,一般为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.base是tomcat实例的根目录,文件放在服务器的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,那么会自动继承root的level信息 -->
<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输出:
本地持久化:
1 所有文件
2 日志打包文件
总结:
logback日志系统是目前使用的比较多的日志系统,性能比log4j要好很多,并且是同一大神写出来的,完整的实现了slf4j的API,所以能很方便的替换成其他的日志系统。
logback的功能很多,这里这是基本的使用了logback-classic模块的功能,显示程序的运行状态。如果有其他功能的使用,那就去啃官方文档(https://logback.qos.ch/)吧。
以上是关于Logback的浪漫: 记录每一个瞬间的主要内容,如果未能解决你的问题,请参考以下文章