1、什么是logback
logback是一个java日志框架,它是log4j的后继者,被广泛用于应用程序中记录日志。
logger(日志记录器):
logger是 logback 中最重要的组件之一。它负责收集应用程序中的日志信息,并将其传递给适当的 appender 进行处理。logger 使用不同的日志级别来决定日志信息的输出方式。常见的日志级别有debug、info、warn、error 和 trace。
appender(日志输出目的地):appender决定日志信息的输出目的地。logback 提供了不同类型的 appender,比如 consoleappender、fileappender 和 socketappender 等。每个 appender 可以配置不同的 layout,用于定义日志信息的格式。
logback 的日志输出原理可以简单分为以下步骤:
- 应用程序代码中使用 logger 记录日志。logger 根据日志级别决定是否将日志信息传递给 appender。
- 当 logger需要输出日志时,它会将日志信息封装成一个 logevent 对象。
- logevent 对象传递给配置好的 appender。appender 将根据配置将日志信息输出到不同的目的地,比如控制台、文件、远程服务器等。
- 在输出日志之前,appender 还会使用配置好的 layout 对日志信息进行格式化。
- 最终,格式化后的日志信息被输出到指定的目的地,供开发者和系统管理员查看和分析。
2、springboot实现文件记录日志,日志文件自动归档和压缩
2.1、配置
1、引入依赖
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
</dependency>
2、在 resource 目录下 创建文件 logback-spring.xml 内容如下
<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanperiod="10 seconds">
<!--0. 日志格式和颜色渲染 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionrule conversionword="clr" converterclass="org.springframework.boot.logging.logback.colorconverter" />
<conversionrule conversionword="wex" converterclass="org.springframework.boot.logging.logback.whitespacethrowableproxyconverter" />
<conversionrule conversionword="wex" converterclass="org.springframework.boot.logging.logback.extendedwhitespacethrowableproxyconverter" />
<!-- 彩色日志格式 -->
<property name="log.path" value="./logs" />
<property name="app.name" value="eric" />
<property name="console_log_pattern" value="${console_log_pattern:-%clr(%d{yyyy-mm-dd hh:mm:ss.sss}){faint} %clr(${log_level_pattern:-%5p}) %clr(${pid:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${log_exception_conversion_word:-%wex}}"/>
<!--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>${console_log_pattern}</pattern>
<!-- 设置字符集 -->
<charset>utf-8</charset>
</encoder>
</appender>
<!-- 2.2 level为 info 日志,时间滚动输出 -->
<appender name="info_file" class="ch.qos.logback.core.rolling.rollingfileappender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/${app.name}-info.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-mm-dd hh:mm:ss.sss} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
<!-- 每天日志归档路径以及格式 -->
<filenamepattern>${log.path}/${app.name}/${app.name}-info-%d{yyyy-mm-dd}.%i.log.gz</filenamepattern>
<timebasedfilenamingandtriggeringpolicy class="ch.qos.logback.core.rolling.sizeandtimebasedfnatp">
<maxfilesize>10mb</maxfilesize>
</timebasedfilenamingandtriggeringpolicy>
<!--日志文档保留天数-->
<maxhistory>15</maxhistory>
</rollingpolicy>
<!-- 此日志文档只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.levelfilter">
<level>info</level>
<onmatch>accept</onmatch>
<onmismatch>deny</onmismatch>
</filter>
</appender>
<!-- 2.3 level为 warn 日志,时间滚动输出 -->
<appender name="warn_file" class="ch.qos.logback.core.rolling.rollingfileappender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/${app.name}-warn.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-mm-dd hh:mm:ss.sss} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
<filenamepattern>${log.path}/${app.name}/${app.name}-warn-%d{yyyy-mm-dd}.%i.log.gz</filenamepattern>
<timebasedfilenamingandtriggeringpolicy class="ch.qos.logback.core.rolling.sizeandtimebasedfnatp">
<maxfilesize>10mb</maxfilesize>
</timebasedfilenamingandtriggeringpolicy>
<!--日志文档保留天数-->
<maxhistory>15</maxhistory>
</rollingpolicy>
<!-- 此日志文档只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.levelfilter">
<level>warn</level>
<onmatch>accept</onmatch>
<onmismatch>deny</onmismatch>
</filter>
</appender>
<!-- 2.4 level为 error 日志,时间滚动输出 -->
<appender name="error_file" class="ch.qos.logback.core.rolling.rollingfileappender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/${app.name}-error.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-mm-dd hh:mm:ss.sss} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
<filenamepattern>${log.path}/${app.name}/${app.name}-error-%d{yyyy-mm-dd}.%i.log.gz</filenamepattern>
<timebasedfilenamingandtriggeringpolicy class="ch.qos.logback.core.rolling.sizeandtimebasedfnatp">
<maxfilesize>10mb</maxfilesize>
</timebasedfilenamingandtriggeringpolicy>
<!--日志文档保留天数-->
<maxhistory>15</maxhistory>
</rollingpolicy>
<!-- 此日志文档只记录error级别的 -->
<filter class="ch.qos.logback.classic.filter.levelfilter">
<level>error</level>
<onmatch>accept</onmatch>
<onmismatch>deny</onmismatch>
</filter>
</appender>
<!--
<logger name="org.springframework.web" level="warn"/>
<logger name="org.springframework.boot" level="warn" />
<logger name="springfox.documentation.spring" level="warn" />
<logger name="org.apache.shardingsphere" level="debug" />
-->
<!-- 开发、测试环境 -->
<springprofile name="dev,sit,test,uat">
<logger name="org.springframework.web" level="info"/>
<logger name="org.springframework.boot" level="info" />
<logger name="springfox.documentation.spring" level="info" />
<logger name="shardingsphere-sql" level="info" />
<logger name="sqlstatement" level="info" />
<logger name="com.alibaba.nacos.client.naming" level="warn" />
<logger name="org.apache.shardingsphere.core.route.sqllogger" level="info" />
<logger name="com.zkj.lawfirm.platform" level="info" />
</springprofile>
<!-- 生产环境-->
<springprofile name="prod">
<logger name="org.springframework.web" level="warn"/>
<logger name="org.springframework.boot" level="warn" />
<logger name="springfox.documentation.spring" level="warn" />
<logger name="org.apache.shardingsphere" level="warn" />
<logger name="shardingsphere-sql" level="warn" />
<logger name="com.alibaba.nacos.client.naming" level="warn" />
<logger name="org.apache.shardingsphere.core.route.sqllogger" level="warn" />
<logger name="com.zkj.lawfirm.platform" level="info" />
</springprofile>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="info_file" />
<appender-ref ref="warn_file" />
<appender-ref ref="error_file" />
</root>
</configuration>
3、编写一个控制器用来访问测试
package com.eric.springbootlog.demos.web;
import lombok.extern.slf4j.slf4j;
import org.springframework.stereotype.controller;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestparam;
import org.springframework.web.bind.annotation.responsebody;
@controller
@slf4j
public class basiccontroller {
// http://127.0.0.1:8080/hello?name=lisi
@requestmapping("/hello")
@responsebody
public string hello(@requestparam(name = "name", defaultvalue = "unknown user") string name) {
log.info("我是一条 info 日志");
return "hello " + name;
}
}
2.2、日志记录到文件中
此时我们启动项目,发现项目根目录会自动生成一个 logs 目录,发现日志已经成功记录到文件中了

此时我们再访问接口:http://127.0.0.1:8080/hello?name=lisi
发现日志成功打印,并且成功记录到日志文件中

2.3、日志文件自动归档和压缩
因为我在配置文件中已经配置好了,此时我们再手动更换下电脑的时间,我这里修改到第二天

此时我们再次访问接口:http://127.0.0.1:8080/hello?name=lisi

发现第二天的日志成功自动归档,并且成为压缩文件了~
总结
以上就是springboot实现文件记录日志及日志文件自动归档和压缩的详细内容,更多关于springboot日志文件归档和压缩的资料请关注代码网其它相关文章!
发表评论