1. logback主要模块
logback-access:与service容器集成,提供通过http来访问日志的功能。
logback-classic:是log4j的改良版,完整的实现了slf4j-api。
logback-core:为上述两个模块提供了基础的服务。
2. logback主要标签
logger: 作为日志的记录器主要用于存放日志对象,可以定义日志的类型及级别。
appender: 用于指定日志输入的目的地,也就是输出的媒介,可以是控制台,也可以是文件等。
layout: 用于格式化日志信息的输出
3. logback配置
(1)引入logback相关jar包
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
(2)在各自项目中resources目录下创建logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:配置文件发生改变则自动加载 ;scanPeriod:自动扫描配置时间修改间隔 (60秒钟扫描一次) debug:是否为调试模式-->
<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" />
<!-- 日志展现格式 %d表示日期格式; [%thread]表示由哪个线程执行; %-5表示缩进五位;level日志级别;%logger{50} - %msg"表示哪个类里输出的日志信息 ;%n换行 -->
<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 ,RollingFileAppender:滚动,即文件大小超出或随日期推移自动创建新的日志文件。-->
<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>
<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>
<!-- additivity 为true -->
<logger name="com.imooc.o2o" 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>
4. 验证日志配置是否可用
(1)controller层中创建日志
//创建日志
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 {
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===");
(1)运行查看日志是否正常输出
验证成功!