logback简介
-
Logback是由log4j创始人设计的一个开源日志组件。LogBack被分为3个组件,logback-core, logback-classic 和 logback-access。
logback-core是其它两个模块的基础模块。 logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。 logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
logback中的logger、appender、layout
- logger:作为日志的记录器,把它关联到对应的context后,主要用于存放日志对象,也可以定义日志类型,级别。 logger 存放日志对象,关注哪个地方的日志,属性additivity为true时,将父类(root)中的appender-ref继承,且不是按照root的level,且一个类只能对应一个logger
- appender:设置输出媒介以及输出路径 ,主要用于指定日志输出的目的地。目的地可以是控制台,文件,远程套接字服务器,数据库mysql等。
- layout:负责把时间转换成字符串,格式化日志信息的输出。(encoder的功能类似于layout,layout仅仅完成一个event事件转换为一组字符串 encoder除了将evnet事件转换为byte数组,也会将日志输出到相应的文件中)
logback的日志级别
错误级别:TRACE<DEBUG<INFO<WARN<ERROR 定义log.level为debug 只显示DEBUG 和大于DEBUG等级的错误
logback的配置和使用
将logback的配置文件logback.xml放在/src/main/resource/下,当运行logback时会自动找到该配置文件加载
- 配置文件及注释
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan 为true时,配置文件发生改变将会被重新加载 scanPeriod 检测配置文件的时间间隔默认为毫秒 debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds"
debug="false">
<!-- 定义参数常量 -->
<!-- 错误级别:TRACE<DEBUG<INFO<WARN<ERROR 定义log.level为debug 只显示DEBUG 和大于DEBUG等级的错误 -->
<property name="log.level" value="debug" />
<!-- 设置日志内容保存多长时间 -->
<property name="log.maxHistory" value="30" />
<!-- 设置存储路径 -->
<property name="log.filePath"
value="${catalina.base}/logs/webapps"></property>
<!-- 设置日志相关格式格式 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread] %-5level %logger{50} - %msg%n" />
<!-- 控制台设置 -->
<!-- appender 设置输出媒介以及输出路径 -->
<appender name="consoleAppender"
class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder的功能类似于layout,layout仅仅完成一个event事件转换为一组字符串 encoder除了将evnet事件转换为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>
<!-- 滚动策略 -->
<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>
<!-- 符合DEBUG记录,不符合不记录 -->
<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>
<!-- 符合INFO记录,不符合不记录 -->
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- DEBUG -->
<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>
<!-- 符合DEBUG记录,不符合不记录 -->
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- logger 存放日志对象,关注哪个地方的日志
additivity为true时,将父类(root)中的appender-ref继承,且不是按照root的level,
且一个类只能对应一个logger
-->
<logger name="com.o2o" level="${log.level}" additivity="true">
<appender-ref ref="debugAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="errorAppender"/>
</logger>
<!-- 特殊的Logger 如果logger不指定level则默认继承root下的level -->
<root level="info">
<appender-ref ref="consoleAppender"/>
</root>
</configuration>
- 使用:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(this.getClass());
@Controller
@RequestMapping(value = "")
public class LoginController {
@RequestMapping(value = "")
@ResponseBody
public void login() {
logger.debug("输出DEBUG级别的日志");
logger.info("输出INFO级别的日志");
logger.error("输出ERROR级别的日志");
}
}