1、前言
程序中计入日志的目的一般有2个,一是做故障定位,二是显示程序的运行状态。接下来介绍Logback的主要模块和标准配置。
2、Logback的主要模块:
1.logback-acess 第三方软件可以通过logback访问程序。
2.logback-classic 是一个Log4j的改良版,同时完整的实习slf4j的api,方便更换其他系统(比如Log4j)。
3、logback-core 为前2个模块提供了服务。
3、Logback的主要标签
1.logger 作为日志的记录器,用于存放日志对象和设置级别。
2.appender 指定日志输出的目的地。
3.layout 用来格式化日志输出。
4、Logback.xml的配置详述
在src/main/resources中创建logback.xml,大致可以分为三步:
<1> configuration
<!-- scran为true时,配置文件改变会重新加载, scanPeriod是设置时间间隔(ms)-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<2> 3个大类(三个详细的appender)
4个property
<!-- 定义参数常量 (全局变量)-->
<!-- TRACE<DEBUG<INFO<WARN<ERROR log.level级别 -->
<!-- logger.trace("msg") logger.debug... 如果指定DEBUG的话 那么TRACE是没法在log里显示,只会显示log.debug log.info等待-->
<!-- 1)一般只用DEBUG,INFO和ERROR 存储在不同的文件下 -->
<property name="log.level" value="debug" />
<!-- 2)log文件保留的多长时间 -->
<property name="log.maxHistory" value="30" />
<!-- 3)标示log保存的路径 -->
<property name="log.filePath" value="${catalina.base}/logs/webapps" />
<!-- 4)日志展现的格式" %d{时间格式} [%什么线程] %-什么级别 %logger{50}(日志信息) -%msg%n"-->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
<3> consoleAppender
控制台设置
<!-- appender的媒介consoleAppender -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder类似layout,pattern定义输出格式 -->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<4-1>debugAppender
<!-- DEBUG -->
<!-- 文件会随着数量或者时间的变化生成新的文件 -->
<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/debug.log</file>
<!-- rollingPolicy 基于时间滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 (按照什么格式)-->
<fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!-- encoder将日志信息转换成字符串,在放在文件里 -->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- filter过滤不是debug的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<4-2>infoAppender
<!-- INFO同上 -->
<!-- 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>
<4-3>errorappender
<!-- ERROR 同上 -->
<!-- ERROR -->
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/erorr.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>
<5>logger配置
<!-- (唯一要修改的地方) 指定关注的那个package,level是记录那个level以上的(现在默认debug) -->
<!-- additivity 默认值为ture 当additivity为ture时 会把root level在控制台输出,DEBUG也会输出 -->
<logger name="com.cn.lx" level="${log.level}" additivity="true">
<!-- 绑定Appender(对三个文件输出) -->
<appender-ref ref="debugAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="errorAppender"/>
</logger>
<root level="info">
<appender-ref ref="consoleAppender"/>
</root>
</configuration>
5、标准的logback.xml程序
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义参数常量 -->
<!-- TRACE<DEBUG<INFO<WARN<ERROR -->
<!-- logger.trace("msg") logger.debug... -->
<property name="log.level" value="debug" />
<property name="log.maxHistory" value="30" />
<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" />
<!-- 控制台设置 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- DEBUG -->
<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${log.filePath}/debug/debug.%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>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}/erorr.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 name="com.cn.lx" level="${log.level}" additivity="true">
<appender-ref ref="debugAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="errorAppender"/>
</logger>
<root level="info">
<appender-ref ref="consoleAppender"/>
</root>
</configuration>
6、controller的测试
package com.cn.lx.web.superadmin;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.cn.lx.entity.Area;
import com.cn.lx.service.AreaService;
@Controller
@RequestMapping("/superadmin")
public class AreaController {
Logger logger = LoggerFactory.getLogger(AreaController.class);
@Autowired
private AreaService areaService;
@RequestMapping(value="/listarea",method=RequestMethod.GET)
@ResponseBody
private Map<String,Object> listArea(){
logger.info("==start==");
long startTime = System.currentTimeMillis();
Map<String,Object> modelMap = new HashMap<String,Object>();
List<Area> list = new ArrayList<Area>();
try {
// rows 返回集合 total返回总数
list = areaService.getAreaList();
modelMap.put("rows", list);
modelMap.put("total",list.size());
}catch(Exception e) {
e.printStackTrace();
modelMap.put("success", false);
modelMap.put("errMsg", e.toString());
}
logger.error("test error!");
long endTime = System.currentTimeMillis();
logger.debug("costTime:[{}ms]",endTime-startTime);
logger.info("==end==");
return modelMap;
}
}