一、什么是日志
之前听说过一句话:“只有在程序出问题以后才会知道打一个好的日志有多么重要。”
二、logback简介
官网:https://logback.qos.ch/manual/introduction.html
-
目前比较常用的Java日志框架: Logback、log4j、log4j2、JUL等等。 -
Logback是在log4j 的基础上重新开发的一套日志框架,是完全实现SLF4J接口API(也叫日志门面)。 -
Logback 的架构非常通用,可以应用于不同的环境。目前logback分为三个模块,logback-core、logback-classic和logback-access。 -
logback-core 模块为其他两个模块奠定了基础。logback-classic模块 原生实现了SLF4J API,因此您可以轻松地在 logback 和其他日志记录框架(例如 log4j 1.x 或 java.util.logging (JUL))之间来回切换。 -
logback-access 模块与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能。请注意,您可以轻松地在 logback-core 之上构建自己的模块。
三、在springboot使用
logback是springboot默认使用日志,所以不用配置也是能正常使用呢
1、简易使用
可在 application.yml 设置输出的路径
logging:
file:
name: /upload/logs/exceptions.log
logback:
rollingpolicy:
file-name-pattern: /upload/logs/exceptions-%d{yyyy-MM-dd}.%i.log
clean-history-on-start: false
max-file-size: 1GB
total-size-cap: 10GB
max-history: 7
name: 这里是指定输出路径和文件名称。 logback:文件归档保存规则
在全局异常处理的地方使用 语法:
final Logger logger = LoggerFactory.getLogger(“名称”);
使用
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
输出
logger.error("异常原因是:",e);
使用小案例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld1 {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1");
logger.debug("Hello world.");
}
}
2、高级使用
高级使用 这里就在 logback.xml,这个是springboot。默认引用的日志配置,在resources新建文件
接着需要了解几个配置参数
① logger记录器
日志记录器(Logger):控制要输出哪些日志记录语句,对日志信息进行级别限制。
了解3个常用属性
- name属性:记录器的名称
- level 属性:记录器的基本 (TRACE < DEBUG < INFO < WARN < ERROR)
- additivity属性:是否允许叠加打印日志。true或false
② appender 附加器
记录器会将输出日志的任务交给附加器完成,不同的附加器会将日志输出到不同的地方,比如控制台附加器、文件附加器、网络附加器等等。
了解3个常用附加器
-
控制台附加器: ch.qos.logback.core.ConsoleAppender -
文件附加器: ch.qos.logback.core.FileAppender -
滚动文件附加器: ch.qos.logback.core.rolling.RollingFileAppender
1??重要属性 pattern 样式
pattern由文字文本和转换说明符组成。我们可以在其中自由插入任何文字文本,每个转换说明符都以百分,后跟可选的格式修饰符、转换字和大括号之间的可选参数。转换字控制要转换的数据字段,例如记录器名称、级别、日期或者线程名称。格式修饰符控制字段宽度,填充以及对齐方式。
常用的参数
参数 | 说明 | 样式 |
---|
%date{ISO8601} | 日志时间 | 相当 %date{yyyy-MM-dd HH:mm:ss.SSS} | %level | 日志级别 | 显示级别info、warn、error | %thread | 日志线程 | 如:restartedMain | %logger | 记录器名称 | -如:xyz.kszs.Starter | %msg | 日志信息 | Started Starter in 3.928 seconds (JVM running for 5.342) | %n | 如长度不够会在左边加空格 | - |
默认官方样式 我项目常用的
%date{ISO8601} %level [%thread] %logger{56} : %msg%n
效果 2?? 重要的属性 过滤器 Filter
过滤器 可以把日志信息做一个分类。如info统一放在一个文件夹。warn 统一放在一个文件夹。error统一放在统一文件夹
常用过滤器有4个。这里说明一下,我项目用 级别过滤器 LevelFilter(级别过滤器) : 实现类 ch.qos.logback.classic.filter.LevelFilter
在项目这么用的
<!--过滤器,只记录INFO级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
③root根记录器
置根记录器的级别为INFO, root标签等于标签
四、项目真正案例
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<!-- 日志路径 部署在服务器 文件夹需要设计777权限 -->
<property name="log.base" value="/logs/KYB"/>
<!--日志存储天数-->
<property name="log.max.days" value="30"/>
<!-- 日志文件大小 -->
<property name="log.max.size" value="500MB"/>
<!-- 输出格式-->
<property name="log.pattern" value="%date{ISO8601} %level [%thread] %logger{56} : %msg%n"/>
<!--字符集-->
<property name="log.charset" value="UTF-8"/>
<!--控制台-附加器 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!--info-附加器-->
<appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base}/info/_info.log</file><!--存储路径-->
<!-- 输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--按天回滚-->
<fileNamePattern>${log.base}/info/archive/info_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<!--日志最大存储天数-->
<maxHistory>${log.max.days}</maxHistory>
<!--当天的日志 超过大小 压缩日志并保存 -->
<maxFileSize>${log.max.size}</maxFileSize>
</rollingPolicy>
<!--过滤器,只记录INFO级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--warn-附加器-->
<appender name="warnFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base}/warn/_warn.log</file><!--存储路径-->
<!--输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.base}/warn/archive/warn_%d{yyyy-MM-dd}.%i.log.zip
</fileNamePattern>
<!--日志最大存储天数-->
<maxHistory>${log.max.days}</maxHistory>
<!-- 当天的日志 超过大小 压缩日志并保存 -->
<maxFileSize>${log.max.size}</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--error-附加器-->
<appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base}/error/_error.log</file><!--存储路径 -->
<!--输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.base}/error/archive/error_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<!--日志最大存储天数-->
<maxHistory>${log.max.days}</maxHistory>
<!-- 当天的日志 超过大小 压缩日志并保存 -->
<maxFileSize>${log.max.size}</maxFileSize>
</rollingPolicy>
<!--级别-过滤器 error-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName -->
<logger name="org.springframework.aop.framework.CglibAopProxy" additivity="false">
<level value="info" />
<appender-ref ref="stdout" />
</logger>
<!-- root将级别为“DEBUG”及大于“DEBUG”的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console -->
<root level="info">
<appender-ref ref="stdout" /> <!-- 标识这个appender将会添加到这个logger -->
<appender-ref ref="infoFile" />
<appender-ref ref="warnFile" />
<appender-ref ref="errorFile" />
</root>
</configuration>
效果 更改你需要地址,就可以在你项目使用呢 注意,要设置服务器文件夹权限(777)
总结
在springboot 使用默认 logback,不需要引入任何依赖。 在resources,新建文件logback.xml.系统默认这个文件。 创建记录器 创建附加器 附加配置pattern样,文档回滚规则,过滤器 创建根记录器
如果帮助到大家,可以点赞👍,收藏?,关注,谢谢
|