该文章主要内容

1、maven依赖

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-access</artifactId>
	<version>1.2.2</version>
</dependency>
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-core</artifactId>
	<version>1.2.2</version>
</dependency>
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.2.2</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.25</version>
</dependency>

引用了spring-boot-starter自带logback依赖,如果没有引用,建议优先引用spring-boot-starter,没有使用springBoot的工程建议再引用以上开始的logback依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

2 常用节点结构图

logback.xml常用配置详解
常用节点结构图:
在这里插入图片描述

2.1 根节点configuration

包含下面三个属性:
scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
  例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
    <!--其他配置省略--> 
</configuration> 

2.2 子节点contextName

用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
  例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
     <contextName>myAppName</contextName> 
    <!--其他配置省略-->
</configuration>    

2.3 子节点property

用来定义变量值,它有两个属性namevalue,通过定义的值会被插入到logger上下文中,可以使“${}”来使用变量。
    name: 变量的名称
    value: 的值时变量定义的值
  例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
   <property name="APP_Name" value="myAppName" /> 
   <contextName>${APP_Name}</contextName> 
   <!--其他配置省略--> 
</configuration>

2.4 子节点appender

负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名
ConsoleAppender 把日志输出到控制台,有以下子节点:
      <encoder>:对日志进行格式化。(具体参数稍后讲解 )
      <target>:字符串System.out(默认)或者System.err(区别不多说了)
例如:

<configuration> 
       <!--输出到控制台-->
    <appender name = "CONSOLE" class = "ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%C] [%t] [%L] [%p] %m%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

   <root level="DEBUG"> 
      <appender-ref ref="CONSOLE" /> 
   </root> 
</configuration>

上述配置表示>=DEBUG级别的日志都输出到控制台

pattern中格式化日志参考如下
想要自定义输出格式,因此需要设置class = “ch.qos.logback.core.ConsoleAppender”
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

%m 输出代码中指定的消息;

%M 输出打印该条日志的方法名;

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;

%r 输出自应用启动到输出该log信息耗费的毫秒数;

%c 输出所属的类目,通常就是所在类的全名;

%t 输出产生该日志事件的线程名;

%n 输出一个回车换行符,Windows平台为"rn",Unix平台为"n";

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;

%l 输出日志事件的发生位置,及在代码中的行数;

参考文章:
基于java配置log4j日志详解

2.5 子节点logger

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

<!-- 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"/>
<!--打印sql配置-->
<logger name="com.XX.its.myAppName.module.dao" level="DEBUG"/>

上述配置表示和数据库交互>=DEBUG级别的日志都输出到控制台或者记录日志,一般这么配置就是想把sql打印出来,但是logback有一个问题就是到没法使用通配符指定到dao层
即没法使用name=“com.XX.its.myAppName.*.dao”,这点要注意

2.6 子节点root

它也是<logger>元素,但是它是根logger,是所有<logger>的上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。
    level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能设置为INHERITED或者同义词NULL。 默认是DEBUG。

3 配置使用案例

resources目录下新建logback.xml
在这里插入图片描述

<?xml version = "1.0" encoding = "UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<configuration scan="true" scanPeriod="10 seconds">

    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="module" value="myModuleName" />
    <property name="log.path" value="/logs/springboot-${module}/logs" />
    <!--归档压缩包存放路径-->
    <property name="log.zip.path" value="/logs/springboot-${module}/logs/insp_info" />


    <!--输出到控制台-->
    <appender name = "CONSOLE" class = "ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%C] [%t] [%L] [%p] %m%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 按照每天生成日志文件 -->
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!-- 日志日常打印文件 -->
        <file>${log.path}/${module}.log</file>

        <!-- 配置日志所生成的目录以及生成文件名的规则-->
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
           <!--日志文件输出的文件名-->
            <FileNamePattern>${log.zip.path}/%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>
           <!-- 日志总保存量为1GB -->
           <totalSizeCap>1024MB</totalSizeCap>
           <!-- 如果按天来回滚,则最大保存时间为365天,365天之前的都将被清理掉 -->
           <maxHistory>30</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--文件达到 最大128MB时会被压缩和切割 -->
                <maxFileSize>128 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.sss}] [%C] [%t] [%L] [%p] %m%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

    </appender>
    <appender name="ERROR" class="ch.qos.logback.core.FileAppender">
        <File>${log.path}/${module}-err.log</File>

        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.sss}],%m%n</pattern>
        </encoder>
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <logger name="com.XX.its.myAppName.module.dao" level="DEBUG"/>

    <root level = "WARN">
        <appender-ref ref = "FILE"/>
        <appender-ref ref="ERROR"/>
        <appender-ref ref = "CONSOLE"/>
    </root>
</configuration>

替换module为你的使用模块即可
生产环境日志打印建议选在WARN级别,日常调试打印日志使用info或者debug级别

4 java中调用

java中使用有两种方式

4.1 使用@Slf4j调用

在这里插入图片描述

4.2 使用自定义内部log变量调用

private static Log log = LogFactory.getLog(SendMessage2KafkaServiceTest.class);
在这里插入图片描述

5 生产环境日志配置注意事项

在生成环境启动脚本中有的会带上自定义的日志打印位置,如果在logback中配置了从根目录/log开始,则启动脚本中不需要带带入日志打印命令,否则会优先使用启动脚本中的日志存放位置,使得logback日志配置整体失效
在这里插入图片描述

参考文章:
1、官方文档
http://logback.qos.ch/documentation.html

2、logback的使用和logback.xml详解

3、基于java配置log4j日志详解

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐