目录
一、概念和作用
作用
希望系统能记住某些数据是被谁操作的,比如被谁删除了?
想分析用户浏览系统的具体情况,以便挖掘用户的具体喜好?
当系统在开发或者上线后出现了bug,崩溃了,该通过什么去分析、定位bug?
概念
用来记录程序运行过程中的信息,并可以进行永久存储。
优势和特点
可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。
可以随时以开关的形式控制是日志的记录和取消,无需侵入到源代码中去进行修改。
和输出语句的区别
输出语句 | 日志技术 | |
输出位置 | 输出到控制台 | 可以将日志信息写入到文件或者数据库中 |
取消日志 | 需要修改代码,灵活性比较差 | 不需要修改代码,灵活性比较好 |
多线程 | 性能较差 | 性能较好 |
二、日志技术
1.日志体系结构
日志接口:一些规范,提供给日志的实现框架设计的标准。
日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿去使用。
Logback是基于slf4j的日志规范实现的框架。
2.Logback概述
Logback日志框架
logback-core: 该模块为其他两个模块提供基础代码。 (必须有)
logback-classic:完整实现了slf4j API的模块。(必须有)
logback-access 模块与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能(可选模块)
想使用Logback日志框架,至少需要在项目中整合如下三个模块:
slf4j-api:日志接口
logback-core:基础模块
logback-classic:功能模块,它完整实现了slf4j API
三、Logback快速入门
1.使用Logback目的
使用Logback日志框架,纪录系统的运行信息。
2.实现步骤
①:导入Logback框架到项目中去。在项目下新建文件夹lib,导入Logback的jar包到该文件夹下
②:将存放jar文件的lib文件夹添加到项目依赖库中去。
在IDEA中Add as Lib
③:将Logback的核心配置文件logback.xml直接拷贝到src目录下(必须是src下)。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/home" />
<!--控制台日志, 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--文件日志, 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
</configuration>
④:创建Logback框架提供的Logger日志对象,后续使用其方法记录系统的日志信息。
public static final logger LOGGER = LoggerFactory.getLogger("类名");
四、Logback配置
1.输出位置
输出到控制台的配置标志
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
输出到系统文件的配置标志
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
2.日志级别
如果系统上线后想关闭日志,或者只想记录一些错误的日志信息,可以通过设置日志的输出级别来控制哪些日志信息输出或者不输出。
日志级别
ALL 和 OFF分别是打开、及关闭全部日志信息。
除此之外,日志级别还有: TRACE < DEBUG < INFO < WARN < ERROR ; 默认级别是DEBUG,对应其方法
作用:当在logback.xml文件中设置了某种日志级别后,系统将只输出当前级别,以及高于当前级别的日志。
具体在<root level=“INFO”>标签的level属性中设置指定系统的日志级别。
<root level=“INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
五、SpringBoot下使用Slf4j
1.导入依赖
slf4j可以理解为一个log的接口,导入了这个包后即可使用log.error() log.warn() log.info()等用于日志输出。
projectlombok是包含@Slf4j这个注解的包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
2.导入配置文件logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:当此属性设置为 true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当 scan为 true 时,此属性生效。默认的时间间隔为1分钟。-->
<!-- debug:当此属性设置为true 时,将打印出 logback内部日志信息,实时查看 logback运行状态。默认值为 false。通常不打印-->
<configuration scan="true" scanPeriod="10 seconds">
<!--1. 输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<Pattern>>%date %5p [%thread] %logger{60} [%file : %line] %msg%n</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--2. 输出到文档-->
<!-- level为 DEBUG 日志,时间滚动输出 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>D:\myDev\log\debug.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%date %5p [%thread] %logger{60} [%file : %line] %msg%n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 添加.gz历史日志会启用压缩大大缩小日志文件所占空间-->
<!--<fileNamePattern>/ home/log/stdout.log .%d{yyyy-MIA-dd}.log</fileNamePattern>-->
<fileNamePattern>D:\myDev\log\debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--日志文档保留天数-->
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 此日志文档只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--单个指定-->
<logger name="com.guo.springboot.mapper" level="DEBUG"/>
<!--全部指定-->
<!--如果root标签不指定日志级,默认日志级别为debug,,,,
root标签指定日志级别和追加器指定日志级别,哪个日志级别高以哪个为准
-->
<root level="debug">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="DEBUG_FILE"/> <!--引用appender name-->
</root>
</configuration>