今天分享springboot自定义logback.xml并且在java代码中自定义,动态变化打印的日志

一、基础知识
   a.log4j、logback、slf4j的介绍
      slf4j是日志的规范(也就是一种日志标准),而logback、log4j是具体实现的日志系统。
   b.logback速度比log4j执行速度更快,官方推荐使用logback作为日志系统。
   c.官方推荐使用logback-spring.xml自定义配置SpringBoot框架的日志配置。
   d.SpringBoot默认使用logback来记录logger(日志)。

二、logback-spring.xml(按大小进行切割)编写例子:
a.功能介绍:
   1、继承Spring boot logback设置(可以在appliaction.yml或者application.properties设置logging.*属性)
   2、重写了默认配置,设置日志文件大小在10MB时,按日期切分日志,切分后目录:

b.具体的配置

 

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

<!-- 设置全局log的变量路径 -->
<property name="logPath" value="./logs"/>

<!-- 设置名称为STDOUT的appender为一个控制台输出appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoder shi PatternLayoutEncoder默认的一个 -->
    <encoder>
        <!-- %d{yyyy-MM-dd HH:mm:ss.SSS} %d为输出日期,{yyyy-MM-dd HH:mm:ss.SSS}为日期的格式,
        与java.text.SimpleDateFormat格式一样 ,d也可以写成 date-->
        <!-- [%thread] 为[当前线程名称] 也可以写成 [%t] -->
        <!-- %-5p 为输出日记界别,并且输出后,打印五个空格 %p亦可以写成  %le / %level -->
        <!-- %logger{36} 表示logger名字最长36个字符,否则按照句点分割。 -->
        <!-- %file 表示此条日记信息是在哪个文件输出的 ,也可以 %F-->
        <!-- %line 表示输出此日记的语句位于哪一行代码 也可以 %L-->
        <!-- %msg msg表示打印输出的信息 也可以写成 %m / %message -->
        <!-- %n 表示换行  -->
        <!-- 其他配置可见 PatternLayout.defaultConverterMap  -->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5le %logger{36} (%file:%line\)  -%msg  %n</pattern>
        <!-- 设置控制台输出编码 -->
        <charset>UTF-8</charset>
    </encoder>
</appender>

<!-- 设置一个可以滚动的文件appender -->
<appender name="ERROR_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 设置filter,决定什么时候执行 ThresholdFilter 为临界值过滤器,
    过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝-->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <!-- 说明是error级别以上的才执行 -->
        <level>ERROR</level>
    </filter>
    <!-- 设置文件输出路径和名称-->
    <File>${logPath}/error.log</File>

    <!-- 设置滚动策略 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- 设置名称模式 %i 索引,从0开始。。。。-->
        <fileNamePattern>/error-%d{yyyyMMdd}.log.%i</fileNamePattern>
        <!-- 设置出发滚动策略 使用时间和大小共同决定的策略-->
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <!-- 测试暂时设置1kb,正常开发可以按情况设置 -->
            <maxFileSize>1kb</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
        <!-- 日记保留多久(d) 上面说根据时间和大小来决定,但是上面的策略只设置了大小,为什么呢
        官方给出的解释是
        the maxHistory property is given to TimeBasedRollingPolicy instead of to
        the TimeBasedFileNamingAndTriggeringPolicy. This makes it more convenient
        for the user at the cost of inconsistency here.
        -->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <!-- 滚动策略都设置好了,设置输出布局 -->
   <!-- <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern>
    </layout>-->
    <!-- 其他的layout也可以使用下面的设置方式 -->
    <encoder>
        <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern>
        <charset>UTF-8</charset>
    </encoder>


</appender>

<!-- 指定某一个包或者某一个类的打印级别以及是否传入root进行打印 -->
<!-- additivity:是否向上级logger传递打印信息。默认是true。-->
<!-- <logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
<!-- name:用来指定受此logger约束的某一个包或者具体的某一个类。-->
<!-- level:
    用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,
    代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。-->

<!-- mybatis框架 数据库相关的日记信息 -->
<!--<logger name="jdbc.sqltiming" level="DEBUG"/>
<logger name="com.ibatis" level="DEBUG" />
<logger name="com.ibatis.common.jdbc.SimpleDataSource" level="DEBUG" />
<logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG" />
<logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="DEBUG" />
<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />-->

<!-- hibernate框架 数据库相关的日记信息 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="TRACE"/>
<logger name="org.hibernate.SQL" level="DEBUG"/>
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG"/>
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG"/>

<root level="INFO">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="ERROR_APPENDER"/>
</root>
</configuration>

三.自定义 类,应用变量到日志打印中

1.在需要运行的代码中加入ThreadContext.put("id", UUID.randomUUID().toString()); 这句话.

package com.howtodoinjava.log4j2.examples;
 
import java.util.UUID;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
 
public class Log4j2HelloWorldExample {
    private static final Logger LOGGER = LogManager.getLogger(Log4j2HelloWorldExample.class.getName());
    public static void main(String[] args) {
        //Add context information
        ThreadContext.put("dataSource", UUID.randomUUID().toString());
       
 
       
    }
}

2.在logback.xml中将该变量进行引用比如,如下图

 

以上能适应动态答应日志的变化.

 

更多软件安装包请加QQ群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值