1. logback日志主要模块
1-1logback-access
第三方软件可以通过logback-access访问日志
1-2logback-classic
1-3logback-core
2. logback的主要标签
2-1.logger作为日志的记录器,主要用于存放日志对象,定义日志的级别和类型
2-2.appender指定日志输出的目的地,也就是输出媒介,可以是控制台可以是服务器等
2-3layout格式化日志输出文件
3. logback的配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan为true时,配置文件发生改变,则日志文件跟着更改 -->
<!-- scanPeriod日志文件扫描配置文件的间隔时间,每隔60秒扫描一次配置文件 -->
<!-- debug的作用是打印出logback日志内部的信息,我们不需要故设为true -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义参数常量 -->
<!--日志输出级别 trace<debug<info<warn<error -->
<property name="log.level" value="debug" />
<!-- 文件保留时间 30天 -->
<property name="log.maxHistory" value="30" />
<!-- 日志文件存储的根路径 -->
<property name="log.filePath" value="${catalina.base}/logs/webapps" />
<!-- 日志展现格式 -->
<!-- 定义时间格式,[%thead]定义使用的是哪个线程,%-5level输出是哪个级别日志,
%logger{50} -%msg输出哪个package中的哪个类的信息,%n换行 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50} -%msg%n" />
<!-- 控制台日志输出设置 -->
<!-- 定义logback标签 -->
<!-- appender指定日志输出的目的地,也就是输出媒介,可以是控制台可以是服务器等 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!-- 类似layout,但是 encoder既负责将日志文件转换成字符串也负责将日志信息写到对应的文件当中 -->
<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>
<!-- 定义过滤器,过滤不是debuglevel的日志文件 -->
<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>
<!-- 定义过滤器,过滤不是debuglevel的日志文件 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!-- 如果是debug日志信息则留下来 -->
<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>
<!-- 定义过滤器,过滤不是debuglevel的日志文件 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<!-- 如果是debug日志信息则留下来 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果不是日志信息则直接过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- logger作为日志的记录器,主要用于存放日志对象,定义日志的级别和类型 -->
<logger name="com.imooc.o2o" level="${log.level}" additivity="true">
<!-- 绑定三个日志输出文件 -->
<appender-ref ref="debugAppender"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="errorAppender"/>
</logger>
<!-- 跟root相关的信息,打印到控制台 -->
<root level="info">
<appender-ref ref="consoleAppender"/>
</root>
</configuration>
4. logback的使用
//日志文件的使用一般在controller和service层
Logger logger=LoggerFactory.getLogger(AreaController.class);
@Autowired
private AreaService areaService;
//指定访问该路径便是访问该方法,指定访问方法为get方法,get是通过URL传参
@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();
//当遇到下一个list对象的时候,会直接替换当前对象
//有点类似循环遍历,但是该方法更快
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;
}