catalina.home和catalina.base区别
Tomcat解惑 之 CATALINA_HOME与CATALINA_BASE
catalina.home指向公用信息的位置,就是bin和lib的父目 录。
catalina.base指 向每个Tomcat目 录私有信息的位置,就是conf、logs、temp、webapps和work的父目录。
logback.xml文件的配置
直接把下面的文件命名为logback.xml放在java/resource下(根目录)就可以被自动读取
<?xml version="1.0" encoding="UTF-8"?>
<!--scan为true(默认每一分钟扫描一下配置文件,如果发生更改就重新加载配置文件)
scanPeriod设置扫描配置文件的时间间隔(如果没有指定单位默认为毫秒)
debug 如果设置为true,在控制台中打印logback内部运行日志(内部状态信息,如果配置文件有错误也会输出),由于logback已经很稳定了,我们一般设置为false,以免干扰我们查看有用的日志信息 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--定义参数常量(全局变量)-->
<!--设置Logger的等级 (TRACE<DEBUG<INFO<WARN<ERROR),假设配置为INFO,那么debug将不会被输出,我们一般会把debug,info,error的信息分别输出到文件中-->
<property name="log.level" value="debug" />
<!--归档日志文件保存的最大时间(单位跟按什么轮转有关,比如按天轮转那么单位就为天) -->
<property name="log.maxHistory" value="30" />
<!--日志存储的根路径 ${catalina.base}指向每个Tomcat目录私有信息的位置,
就是conf、logs、temp、webapps和work的父目录-->
<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是为了配置日志信息输出到哪个地方-->
<!--控制台设置,输出到控制台中-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!--encoder作用是既把日志信息转换为字符串,也输出到指定的位置 -->
<encoder>
<!--pattern为配置输出的格式-->
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- DEBUG -->
<!-- 把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作用是既把日志信息转换为字符串,也输出到指定的位置(文件) -->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!--基于级别来过滤日志事件
只输出DEBUG级别的日志事件,过滤掉其他日志事件-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch><!-- 如果是debug级别的信息就记录-->
<onMismatch>DENY</onMismatch><!--如果不是debug级别的信息不记录-->
</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>
<!-- name表示为哪一个logger指定层级和输出的方式
additivity表示叠加祖先的输出方式(默认为true,会叠加),所以com.lxc.o2o以及其子类都会输出在控制台中,因为这个logger继承了root中的appender
level表示级别大于${log.level}的信息才会输出,输出方式为配置的appender-->
<logger name="com.lxc.o2o" level="${log.level}" additivity="true">
<appender-ref ref="debugAppender"></appender-ref>
<appender-ref ref="infoAppender"></appender-ref>
<appender-ref ref="errorAppender"></appender-ref>
<!--这里还会继承root logger的appender,打印信息在控制台中-->
</logger>
<!-- 一切logger都会继承自root,root默认的层级level为debug -->
<root level="info">
<!--在控制台中输出所在层级对应level(以及大于level)的日志信息,因为这里并没有设置LevelFilter-->
<appender-ref ref="consoleAppender"></appender-ref>
</root>
</configuration>
-
层级Level
对于一个给定的名为 L 的
logger
,它的有效层级为从自身一直回溯到root logger
,直到找到第一个不为空的层级作为自己的层级。为了确保所有的logger
都有一个层级,root logger
会有一个默认层级 —DEBUG
。 -
appender叠加
自动叠加父类的
appender
,除非这个logger
的属性additivity
设置为false
。所以上面配置的层级com.lxc.o2o也会继承root的appender,在控制台中打印信息
日志的使用
@Controller
@RequestMapping("/superadmin")
public class AreaController {
Logge
ggerFactory.getLogger(AreaController.class);
@Autowired
private AreaService areaService;
@RequestMapping(value = "/listarea", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> listArea() {
logger.info("=======start========");
long startTime = System.currentTimeMillis();
Map<String, Object> modelMap = new HashMap<String, Object>();
List<Area> list = new ArrayList<>();
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("error test");
long endTime = System.currentTimeMillis();
logger.debug("costTime:[{}ms]", endTime - startTime);//输出costTime:[12ms]
logger.info("========end=========");
return modelMap;
}
}