SSM到SpringBoot(校园商铺)
Logback日志:
Logback的主要模块:
- logback-core:其它两个模块的基础模块
- logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
- logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
Logback的主要标签:
- Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
- Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。
- Layout 负责把事件转换成字符串,格式化的日志信息的输出。
Logback的配置:
在src/main/resources下创建logback.xml
注意在写的时候千万要细心,我就是因为几个小的错误导致一晚上都在找错误,浪费了大把时间。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 每60s自动重新加载配置文件 -->
<configuration scan="true" scanPeriod="60 seconds"
debug="false">
<!-- 定义参数常量 -->
<!-- 日志级别 case<debug<info<warn<error -->
<property name="log.level" value="debug" />
<!-- 保存30天内的日志 -->
<property name="log.maxHistory" value="30" />
<!-- 日志存储的根路径 tomcat实例的根目录 -->
<property name="log.filePath"
value="${catalina.base}/logs/webapps" />
<!-- 日志展现的格式 时间 线程 日志级别 package+class 日志信息 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.sss} [%thread] %-5level %logger{50} - %msg%n" />
<!-- 日志输出的目的地console -->
<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">
<!-- 文件名称 自动压缩为gz文件 -->
<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>
<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">
<!-- 文件名称 自动压缩为gz文件 -->
<fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!-- 文件保存最大历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!-- 日志信息格式化为字符串并输出到相应文件中 -->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 过滤掉不是infolevel的日志 -->
<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">
<!-- 文件名称 自动压缩为gz文件 -->
<fileNamePattern>${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!-- 文件保存最大历史数量 -->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!-- 日志信息格式化为字符串并输出到相应文件中 -->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 过滤掉不是errorlevel的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- name:监听包com.hytxwz.o2o addtivity="true":引入父类中的appender-ref -->
<logger name="com.hytxwz.o2o" level="${log.level}" addtivity="true">
<appender-ref ref="debugAppender" />
<appender-ref ref="infoAppender" />
<appender-ref ref="errorAppender" />
</logger>
<!-- 父类logger -->>
<root level="info">
<appender-ref ref="consoleAppender" />
</root>
</configuration>
验证配置:
package com.hytxwz.o2o.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.hytxwz.o2o.entity.Area;
import com.hytxwz.o2o.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 // 以JSON形式返回结果
public Map<String, Object> getAreaList() {
logger.info("===start===");
Long startTime = System.currentTimeMillis();
Map<String, Object> modelMap = new HashMap<>();
List<Area> areaList = new ArrayList<>();
try {
areaList = areaService.getAreaList();
// 得到结果后将areaList和areaList.size封装到modelMap中
modelMap.put("rows", areaList);
modelMap.put("total", areaList.size());
} catch (Exception e) {
// 错误 将错误日志返回
e.printStackTrace();
modelMap.put("success", false);
modelMap.put("errorMsg", e.toString());
}
logger.error("test error!");
Long endTime = System.currentTimeMillis();
// {}是占位符
logger.debug("costTime:[{}]", endTime - startTime);
logger.info("===end===");
return modelMap;
}
}
发布到tomcat并访问:
控制台:
tomcat CATALINA_HOME:
gz文件将在第二天出现在相应文件夹中