Java日志框架——Logback

14 篇文章 0 订阅
3 篇文章 0 订阅

参考博客:长路

简介

1.1 Logback概述

   logback可以看作是log4j的升级版;logback分为三个模块, logback-corelogback-classiclogback-access,其中 logback-core是核心,其他两个模块依赖core。

  • logback-core 是其它两个模块的基础模块。
  • logback-access 访问模块与Servlet容器集成提供通过Http来访问日志的功能。
  • logback-classic 是 log4j 的一个改良版本。logback-classic完整实现SLF4J API。

1.2 日志级别

package ch.qos.logback.classic;

public final class Level implements Serializable {

    public static final Level OFF = new Level(2147483647, "OFF");
    public static final Level ERROR = new Level(40000, "ERROR");
    public static final Level WARN = new Level(30000, "WARN");
    public static final Level INFO = new Level(20000, "INFO");
    public static final Level DEBUG = new Level(10000, "DEBUG");
    public static final Level TRACE = new Level(5000, "TRACE");
    public static final Level ALL = new Level(-2147483648, "ALL");
	...
}

日志级别排序为:TRACE< DEBUG<INFO< WARN<ERROR

默认日志等级为Debug,其中OFFALL作为日志开关。

1.3 组件

Logger:日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。

Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。

Layout:负责把事件转换成字符串,格式化的日志信息的输出。

在 Logback 中 Layout 对象被封装在encoder中。 也就是说我们未来使用的 encoder 其实就是Layout。

配置介绍
``
<springProperty>通过该标签可以直接读取 application.yml 等配置文件中的配置
``

1.4 配置文件

Logback提供了3种配置文件

  • logback.groovy
  • logback-test.xml
  • logback.xml(常用)(Maven 项目通常放在resource文件夹中)

如果都不存在则采用默认的配置。(日志等级为DEBUG,默认输出到console)

1.5 日志输出格式

命令解释
%-5levellevel日志等级设置为 5 个字符,左对齐
%d{yyyy-MM-dd HH:mm:ss.SSS}日期(例如:2022-10-18 21:39:22.681)
%c当前类的完整名称(全限定名)
%M当前执行日志的方法
%L行号
%thread线程名称
%m或者%msg信息
%n换行

项目中应用步骤

注意:SpringBoot 配置文件的加载顺序如下:

logback.xml ——> application.properties ——> logback-spring.xml

2.1 依赖

<!--  slf4j核心依赖   -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.25</version>
</dependency>
<!-- Logback 日志实现 -->
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
<version>1.2.11</version>

2.2 日志输出到控制台

2.2.1 logback.xml 配置文件模板

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

    <!--  property 配置通用属性,方便后面的配置通过${name}形式引用  -->
    <!--  %-5level level级别案例为设置5个字符,左对齐
          %d{yyyy-MM-dd HH:mm:ss} 日期
          %c 当前类全限定名
          %M 当前执行日志的方法
          %L 行号
          %thread 线程名称
          %m或者%msg 信息
          %n 换行  -->
    <!--  配置日志输出格式  -->
    <!--  以property形式将日志输出格式配置为文件通用的属性,后面配置输出方式可以重复复引用该通用属性 -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m%n"/>

    <!--  配置控制台 appender  -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志输出目标的配置
             默认:System.out 表示黑色字体输出日志
             设置:System.err 表示红色字体输出日志
          -->
        <target>
            System.out
        </target>
        <!--  配置日志输出格式  -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--  引用 输出格式的 通用配置属性(引用上面的<property>标签中的日志格式)  -->
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    <!--  配置日志记录器  -->
    <root level="All">
        <!--  引入appender  -->
        <appender-ref ref="consoleAppender"></appender-ref>
    </root>
</configuration>

2.2.2 测试类

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * logback日志框架管理
 */
public class LogbackTest {

    @Test
    public void logTest(){
        Logger logger = LoggerFactory.getLogger(LogbackTest.class);
        logger.error("error 错误信息");
        logger.warn("warn 警告信息");
        logger.info("info 运行信息");
        logger.debug("debug 调试信息");
        logger.trace("trace 追踪信息");
    }

}

运行日志截图

2.3 日志输出到文件中

2.3.1 logback.xml 配置文件模板

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

    <!--  property 配置通用属性,方便后面的配置通过${name}形式引用  -->
    <!--  %-5level level级别案例为设置5个字符,左对齐
          %d{yyyy-MM-dd HH:mm:ss} 日期
          %c 当前类全限定名
          %M 当前执行日志的方法
          %L 行号
          %thread 线程名称
          %m或者%msg 信息
          %n 换行  -->
    <!--  配置日志输出格式  -->
    <!--  以property形式将日志输出格式配置为文件通用的属性,后面配置输出方式可以重复复引用该通用属性 -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m%n"/>

    <!-- 配置文件输出路径 (将日志信息输出到项目类路径下的logs目录中的log.txt文件中) -->
    <property name="logDirectory" value="./logs/log.txt" />

    <!-- 配置控制台 appender -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志输出目标的配置
             默认:System.out 表示黑色字体输出日志
             设置:System.err 表示红色字体输出日志
          -->
        <target>
            System.out
        </target>
        <!--  配置日志输出格式  -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--  引用 输出格式的 通用配置属性(引用上面的<property>标签中的日志格式)  -->
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- 配置文件 appender -->
    <appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
        <!-- 引入文件位置 -->
        <file>${logDirectory}</file>
        <!--  配置日志输出格式  -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--  引用 输出格式的 通用配置属性(引用上面的<property>标签中的日志格式)  -->
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--  配置日志记录器  -->
    <root level="All">
        <!--  引入控制台 appender  -->
        <appender-ref ref="consoleAppender" />
        <!--  引入文件 appender  -->
        <appender-ref ref="fileAppender" />
    </root>
</configuration>

运行效果:

2.4 按照日志级别输出日志到指定文件夹

yml 配置:

# logback日志存放位置
log:
 path:
 	windows: /home/data/logs

# 打印sql日志
mybatis-plus:
 configuration:
  log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

备注
mybatis-plus日志配置,使用org.apache.ibatis.logging.stdout.StdOutImpl只能打印SQL日志在控制台;如果想要SQL日志d印在日志文件中需要使用org.apache.ibatis.logging.slf4j.Slf4jImpl

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <!-- 	<include resource="org/springframework/boot/logging/logback/base.xml" /> -->
    <!-- 不直接引用base.xm, 改为引入依赖的文件, 防止多个app部署同一套环境,导致/tmp/spring.log 权限问题 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml"/>

    <!-- 日志格式化模板 ,输出样例如下: -->
    <property name="FILE_LOG_PATTERN" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m%n"/>

    <!-- APP 名称配置, 每个App都需要配置 -->
    <property name="APP_NAME" value="monitor" />
    <!-- APP安装Home目录配置, 每个App都需要配置 -->
    <springProperty scope="context" name="APP_HOME" source="log.path.linux" />

    <property name="LOG_HOME_PATH" value="${APP_HOME}/${APP_NAME}" />

    <property name="DEBUG_LOG_FILE" value="${LOG_HOME_PATH}/debug/${APP_NAME}_debug"/>
    <property name="INFO_LOG_FILE" value="${LOG_HOME_PATH}/info/${APP_NAME}_info"/>
    <property name="WARN_LOG_FILE" value="${LOG_HOME_PATH}/warn/${APP_NAME}_warn"/>
    <property name="ERROR_LOG_FILE" value="${LOG_HOME_PATH}/error/${APP_NAME}_error"/>
    <property name="SQL_LOG_FILE" value="${LOG_HOME_PATH}/sql/${APP_NAME}_sql"/>
    
    <!-- Error 级别 日志配置 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${ERROR_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>60</MaxHistory>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- INFO 级别 日志配置 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${INFO_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>60</MaxHistory>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- WARN 级别 日志配置 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${WARN_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>60</MaxHistory>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印WARN日志 -->
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- DEBUG 级别 日志配置 -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${DEBUG_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>60</MaxHistory>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="SQL_FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${SQL_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
            <MaxHistory>60</MaxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
            <level>DEBUG</level>
        </filter>
    </appender>

    <logger name="com.jpin.water.dal.mapper" level="DEBUG" additivity="false">
        <appender-ref ref="SQL_FILE" />
    </logger>

    <!-- 按包名称拆分日志级别后输出文件(指定不同的appender);
    	 <loger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
    	 <loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
    		name:用来指定受此loger约束的某一个包或者具体的某一个类。 
    		level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO,WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
    		addtivity:是否向上级loger传递打印信息。默认是true。 -->

    <!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 
    		level:用来设置打印级别, 大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL,默认是DEBUG.;
    	另外Spring Boot 最好开启 INFO 级别或以上 日志,否则基础Debug日志会相当多,影响性能 -->

    <root level="INFO">
        <appender-ref ref="DEBUG_FILE"/>
        <appender-ref ref="INFO_FILE"/>
        <appender-ref ref="WARN_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </root>

</configuration>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值