Logback-日志文件按日期切分解决方案_imVainiycos的博客-程序员宅基地_logback 按日期

技术标签: java  logback  

Logback,是一个开源的日志组件,同样也是由log4j创始人设计。天然支持SLF4J(Simple Logging Facade For Java)。在Spring Boot中,使用Logback是最优的选择,可使用logback-spring.xml进行配置使用。

实际项目中经常需要通过日志文件来定位,不同于本地测试开发环境,线上的日志文件如果不做按日期切割整理就会比较乱,而且打开日志文件需要很久。

本文旨在提供多种实际可用的日志配置文件模板,便捷可用。

一、Logback使用

logback有5种级别,分别是TRACE < DEBUG < INFO < WARN < ERROR。

使用如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDateTime;

public class MyLogback {
    

    private Logger logger = LoggerFactory.getLogger(MyLogback.class);
    
    void test(){
    
        String now = LocalDateTime.now().toString
        logger.trace("trace 测试日志打印->{}", now);
        logger.debug("debug 测试日志打印->{}", now);
        logger.info("info   测试日志打印->{}", now);
        logger.warn("warn   测试日志打印->{}", now);
        logger.error("error 测试日志打印->{}", now);
    }
}

如何自定义日志管理。在resource目录下新建一个logback-spring.xml文件。该xml文件主要分为以下几部分:

  1. 头部声明

    <?xml version="1.0" encoding="UTF-8"?>
    
  2. 主节点

    包含参数定义以及关键appender节点

    <configuration>
    	<!-- 项目名称 例:mylogback -->
        <property name="APP_NAME" value="mylogback" />
        <!-- 日志目录 例:/usr/local/mylogback/logs -->
        <property name="LOG_PATH" value="/usr/local/${APP_NAME}/logs" />
    </configuration>
    
  3. 关键子节点

    • appender:是一个接口,最重要的有两个Appender,分别为ConsoleAppender和RollingFileAppender。顾名思义,前者主要是控制台输出,对应的class值为:ch.qos.logback.core.ConsoleAppender;后者则是输出到文件中,对应的class值为ch.qos.logback.core.rolling.RollingFileAppender
    • file:主要针对RollingFileAppender输出文件命名规则
    • encoder:最主要的是pattern,定义日志格式
    • filter:日志过滤规则
    • rollingPolicy:主要针对文件日志输出,定义输出日志策略
    <appender name="myDebuglog" class="ch.qos.logback.core.ConsoleAppender">
        <file>
        	${LOG_PATH}/debug.log
        </file>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 过滤策略 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 设置命中策略 debug、info、warn、error -->
            <level>debug</level>
            <!-- 命中设置的日志等级就记录 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 未命中则拒绝该appender策略 -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 日志归档 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
            <maxHistory>30</maxHistory>
            <!-- 单个文件达到最大10MB时开始切分 -->
            <maxFileSize>10MB</maxFileSize>
            <!-- 当日志容量超过20GB,即使没有到保存期限的30天也会开启日志清理 -->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
    </appender>
    

二、默认实现

如果我们不写logback.xml配置文件,工程项目也会正常打印日志,因为springboot有默认的实现,即通过以下两个文件进行指定,以下是Spring Boot下的org/springframework/boot/logging/logback/base.xml、defaults.xml文件默认实现:

base.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->

<included>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
	<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
	<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
	<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</included>

defaults.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!--
Default logback configuration provided for import
-->

<included>
	<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="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-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}}"/>
	<property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
	<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
	<property name="FILE_LOG_CHARSET" value="${FILE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>

	<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
	<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
	<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
	<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
	<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
	<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
	<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
	<logger name="org.springframework.boot.actuate.endpoint.jmx" level="WARN"/>
</included>

三、实用模板

经过上述分析,对logback配置文件有了大概的了解,接下来旨在提供标准可用的日志配置文件,并且由于trace级别的日志打印极少用到,我们在配置文件中暂不体现trace级别配置,若有需要请根据实际需求进行增减调整配置。

此处定义的日志目录会输出到C盘,若部署到线上需要做调整;日志最大保留天数均为30天,单个文件最大不超过100MB,且在同个level下总文件大小不超过20GB,否则即使没超过30天也会自动清理日志:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 引入默认实现 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <!-- 自定义项目名称 例:mylogback -->
    <property name="APP_NAME" value="mylogback" />
    <!-- 自定义日志目录 若线上部署环境需调整 如:/usr/local/${APP_NAME}/logs -->
    <property name="LOG_PATH" value="C:/${APP_NAME}/logs" />
    <!-- 引入日志等级参数,支持从配置文件读入 -->
    <springProperty scope="context" name="log.level" source="log.level"/>

    <!-- 时间滚动输出 level为 DEBUG 日志 -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/debug.log</file>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 日志归档 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <maxFileSize>100MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!-- 此日志文件只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/info.log</file>
        <encoder>
            <charset>UTF-8</charset>
            <!-- 引用默认的配置项 -->
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 日志归档 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <maxFileSize>100MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 WARN 日志 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/warn.log</file>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 日志归档 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <maxFileSize>100MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/error.log</file>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 日志归档 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <maxFileSize>100MB</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <!-- 此日志文件只记录error级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${log.level}</level>
        </filter>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <root level="${log.level}">
        <appender-ref ref="DEBUG_FILE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

使用前建议配置日志打印等级,表示只打印输出设置值及以上等级的日志:

logging:
  level:
    root: debug #debug info warn error

实际使用效果如下:

image-20211123135321043

image-20211123135359092

四、总结

项目中最细微的日志打印虽然平时感知不到,正所谓润物细无声,但是实际上好的日志打印能够帮助你更快定位项目的线上问题。

读者可以clone该项目体验日志文件输出,该项目会定时每隔5秒打印各个等级的日志:

https://gitee.com/dearvainycos/mylogback.git

参考资料:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/imVainiycos/article/details/121492830

智能推荐

css 去掉浏览器记住账号密码后 input输入框 黄色背景_违规昵称001的博客-程序员宅基地

给input框设置&amp;:-webkit-autofillinput{ width: 100%; background: inherit; box-shadow: inherit; border: none; outline: none; color: $white; &amp;:-webkit-autofi

毕业设计成品价格_计算机毕业设计成品.docx_HelloGithub的博客-程序员宅基地

计算机毕业设计成品【篇一:毕业设计成品】国昌220kv降压变电所电气部分设计引 言电气工程及其自动化专业的毕业设计是培养学生综合运用大学四年所学理论知识,独立分析和解决工程实际问题的初步能力的一个重要环节。本设计是根据毕业设计的要求,针对220/60kv降压变电所毕业设计论文。本次设计主要是一次变电所电气部分的设计,并做出阐述和说明。论文包括选择变电所的主变压器的容量、台数和形式,选择待设计变电...

c语言中求单链表的最大值,编写算法,要求删除单链表中元素最大的结点_九千步的博客-程序员宅基地

满意答案89兄弟2016.08.20采纳率:49%等级:9已帮助:466人//删除单链表中最大元素Del-max(link a){int tmp;element *p;element *max;p=a; //指针,用于遍历链表,取数与当前最大结点值比较max=a; //指针,用于记录最大元素所在位置(未考虑有多个最...

linux ha启停脚本,HADOOP HA集群一键启动脚本_太球的博客-程序员宅基地

#!/bin/bash#启动hadoop ha集群start(){md hadoop"zkServer.sh start"node1 node2 node3md hadoop"start-dfs.sh"master1md hadoop"start-yarn.sh"master1md hadoop"yarn-daemon.sh start resourcemanager"master2}#启动had...

jtest java 代码_使用Jtest:一款优秀的 Java 代码优化和测试工具_做生活的创作者的博客-程序员宅基地

2、file&gt;new&gt;Project&gt;Jtest&gt;Create Project Specifying Source Folders。这种方式允许开发测试人员自定义代码层次结构。用户可以通过图 2 中的对话框,根据需求,任意添加或删除文件夹,组成新建项目的代码结构。图 2. 自定义代码结构在本文中,作者将创建全新的 Java 实例项目 Jtest Example,在此项目中的...

英文写作中,关于the的用法、time的用法_w云淡风轻的博客-程序员宅基地

(1)类似于 Table 1 or Figure 1 ,这样的,前面是不需要加the 来进行特指的。因为 你所 \cite的标号已经进行特指过了(2)同理,formula (25)前面也不需要加 the, 因为 \cite 已经引用过标号了。就相当于已经特指过了。谨记!...

随便推点

matlab fpga in loop,FPGA in the Loop在环测试_weixin_39802519的博客-程序员宅基地

关于FPGA在环测试功能一直是被我忽视的一点,幸得坛友提供资料,使得能够完善在环测试功能,关于在环测试实现将在MBDCORE的手册中更新。有兴趣关于FPGA在环测试功能一直是被我忽视的一点,幸得坛友 2980518171 提供资料,使得能够完善在环测试功能,关于在环测试实现将在MBDCORE的手册中更新。有兴趣的MBD爱好者可以看一下原帖是怎么写的https://www.cnblogs.com/l...

Oracle快照的创建_阳光下的青柠小镇的博客-程序员宅基地_oracle创建快照

1、什么是数据库快照?oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果,也就是说快照根本的原理就是将本地或远程数据库上的一个查询结果保存在一个表中。2、创建快照的步骤:2.1、在目标数据库上创建database links:create database link TEST1 connect to TEST identified by 123 using 'orcl';其中test1是database links的名字,test是目标数

idea 调试java技巧_Intellij IDEA调试功能使用总结_ChrisJimmel的博客-程序员宅基地

点击上方“Java知音”,选择“置顶公众号”技术文章第一时间送达!作者:WB4S链接:www.cnblogs.com/Bowu这段时间一直在使用Intellij IDEA, 今天把调试区工具的使用方法记录于此。先编译好要调试的程序。1.设置断点选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。2.开启调试会话点击红色箭头指向的小虫子,开始进入调试。IDE下方出现Debug视图,红色的箭头指...

深入理解java8_深入理解Java8新特性与源码剖析_weixin_40006965的博客-程序员宅基地

资源介绍资源名称:深入理解Java8新特性与源码剖析教程内容:xa08可谓Java语言历史上变化最大的一个版本,其承诺要调整Java编程向着函数式风格迈进,这有助于编写出更为简洁、表达力更强,并且在很多情况下能够利用并行硬件的代码。本门课程将会深入介绍Java 8新特性,学员将会通过本门课程的学习深入掌握Java 8新增特性并能灵活运用在项目中。学习者将学习到如何通过Lambda表达式使用一行代码...

mybatis-plus代码生成_林一.的博客-程序员宅基地

代码生成器主类GenteratorCodeimport com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.InjectionConfig;import com.baomidou.mybatisplus.generator.config.*;import com.baomidou.mybatisplus.generator.config.converts.MySqlTy

android viewgroup 事件,android中viewgroup的事件传递分析_AMD中国的博客-程序员宅基地

在上一篇中我们分析了从view的dispatchTouchEvent到onTouchListener的onTouch回调到onTouchEvent到onClickLisener的onClickandroid中view事件传递,在后面遗留了两个问题,那就是在onTouchEvent中返回false的时候,只触发到action_down事件,以及在dispatchTouchEvent中返回false也...

推荐文章

热门文章

相关标签