Logback-学习笔记

maven 依赖

springboot 项目中已经集成了 Logback 依赖。

对于非 springboot 项目中,需要引入如下依赖:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.36</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.11</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.4.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>

基本使用

如下代码:

package cn.itsheng.logbacktest.test1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestLogback {

    private static final Logger logger = LoggerFactory.getLogger(TestLogback.class);

    public static void login(String username, String password){
        logger.info("用户 {} 登陆了系统", username);
        logger.info("用户名-{}, 密码-{}", username, password);
    }

    public static void main(String[] args) {
        TestLogback.login("itsheng", "123456");
    }
}

getLogger 的参数可以是 全路径名(比如:cn.itsheng.logbacktest.test1.TestLogback),也可以是 Class 类型的对象。

每一个 {} 都对应一个后面的参数,个数不限。

输出:

09:40:00.288 [main] INFO cn.itsheng.logbacktest.test1.TestLogback - 用户 itsheng 登陆了系统
09:40:00.292 [main] INFO cn.itsheng.logbacktest.test1.TestLogback - 用户名-itsheng, 密码-123456

配置 logback

logback 初始化配置:

  1. logback 会在类路径下寻找名为 logback-test.xml 的文件。
  2. 如果没有找到,logback 会继续寻找名为 logback.groovy 的文件。
  3. 如果没有找到,logback 会继续寻找名为 logback.xml 的文件。
  4. 如果没有找到,将会通过 JDK 提供的 ServiceLoader 工具在类路径下寻找文件 META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了 Configurator 接口的实现类的全限定类名。
  5. 如果以上都没有成功,logback 会通过 BasicConfigurator 为自己进行配置,并且日志将会全部在控制台打印出来。

logback.xml

一个最简单的 logback.xml(放在 resources 目录下,自动扫描):

<configuration>

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 输出日志格式 -->
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 设置日志输出级别 -->
    <root level="debug">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

内容结构

appender 标签中的 name 属性是给该日志配置命名(自定义的),class 属性是通过类的全限定名称定义输出类型:

  • ch.qos.logback.core.ConsoleAppender:控制台输出
  • ch.qos.logback.core.rolling.RollingFileAppender:文件输出

这里的设置日志输出级别中的 ref 属性值是映射到 appender 标签的 name 属性的;level 属性值代表日志级别。

共有 5 个级别,由低到高分别为:

  1. TRACE
  2. DEBUG
  3. INFO
  4. WARN
  5. ERROR

设置了某一个日志级别后,只会输出大于等于该级别的日志信息。

输出格式

  • %d{HH:mm:ss.SSS}:时间格式。
  • %thread:线程。
  • %-5level:日志级别,并且使用5个字符靠左对齐。。
  • %logger{36}:日志输出者名称。
  • %msg:日志消息。
  • %n:平台换行符。

关于颜色

highlight(),高亮函数,括号内内容为高亮显示;高亮颜色区分:

  • TRACE 和 DEBUGE:默认颜色。
  • INFO:蓝色。
  • WARN:红色。
  • ERROR:加粗红色。

自定义颜色:

例如加粗绿色显示日志发出者:

<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) [%boldGreen(%logger{56})] - %msg%n</pattern>

这里的 %boldGreen(%logger{56}) 就是这样的效果。

目前支持的颜色有:

函数颜色
%black()黑色
%red()红色
%green()绿色
%yellow()黄色
%blue()蓝色
%magenta()品红色
%cyan()青色
%white()白色
%gray()灰色
%boldRed()加粗红色
%boldGreen()加粗绿色
%boldYellow()加粗黄色
%boldBlue()加粗蓝色
%boldMagenta()加粗品红色
%boldCyan()加粗青色
%boldWhite()加粗白色

内容抽取

以上 logback.xml 可以写成如下格式:

<configuration>

    <!-- 控制台输出格式 -->
    <property name="CONSOLE_FORMAT" value="%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) [%cyan(%logger{56})] - %msg%n"/>

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 输出日志格式 -->
            <pattern>${CONSOLE_FORMAT}</pattern>
        </encoder>
    </appender>

    <!-- 设置日志输出级别 -->
    <root level="debug">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

输出到文件

配置概览

主要通过配置 logback.xml 文件来实现。

<configuration>

	<!-- 日志存放目录 -->
	<property name="LOG_HOME" value="./logs"/>

	<!-- 信息日志文件名 -->
	<property name="INFO_FILE_NAME" value="${LOG_HOME}/system_info.%d{yyyy-MM-dd}.log"/>

	<!-- 警告日志文件名 -->
	<property name="WARN_FILE_NAME" value="${LOG_HOME}/system_warn.%d{yyyy-MM-dd}.log"/>

	<!-- 错误日志文件名 -->
	<property name="ERROR_FILE_NAME" value="${LOG_HOME}/system_error.%d{yyyy-MM-dd}.log"/>


	<!-- 控制台输出格式 -->
	<property name="CONSOLE_FORMAT" value="%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) [%cyan(%logger{56})] - %msg%n"/>

	<!-- 文件输出格式 -->
	<property name="FILE_FORMAT" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{56} - %msg%n"/>


	<!-- 控制台输出 -->
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<!-- 输出日志格式 -->
			<pattern>${CONSOLE_FORMAT}</pattern>
		</encoder>
	</appender>

	<!-- info 日志文件输出 -->
	<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>INFO</level>
		</filter>
		<encoder charset="UTF-8">
			<pattern>${FILE_FORMAT}</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${INFO_FILE_NAME}</fileNamePattern>
			<!--日志文件保留天数-->
			<MaxHistory>15</MaxHistory>
		</rollingPolicy>
	</appender>

	<!-- warn 日志文件输出 -->
	<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>WARN</level>
		</filter>
		<encoder charset="UTF-8">
			<pattern>${FILE_FORMAT}</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${WARN_FILE_NAME}</fileNamePattern>
			<!--日志文件保留天数-->
			<MaxHistory>20</MaxHistory>
		</rollingPolicy>
	</appender>

	<!-- error 日志文件输出 -->
	<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>ERROR</level>
		</filter>
		<encoder charset="UTF-8">
			<pattern>${FILE_FORMAT}</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${ERROR_FILE_NAME}</fileNamePattern>
			<!--日志文件保留天数-->
			<MaxHistory>30</MaxHistory>
		</rollingPolicy>
	</appender>


	<!-- 设置日志输出级别 -->
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="INFO_FILE" />
		<appender-ref ref="WARN_FILE" />
		<appender-ref ref="ERROR_FILE" />
	</root>
</configuration>

拦截指定级别

主要通过 <filter> 标签实现:

<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <!-- 只接收 INFO 级别的日志消息 -->
        <level>INFO</level>
        <!-- 不匹配 INFO 级别的日志消息时拒绝 -->
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>

    <encoder>
        <!-- 输出日志格式 -->
        <pattern>${TEXTAREA_FORMAT}</pattern>
    </encoder>
    <target>System.out</target>
</appender>

以上配置代表只接收 INFO 级别的日志。

<onMatch>ACCEPT</onMatch> 代表接受匹配的日志等级。

<onMismatch>DENY</onMismatch> 代表拒绝不匹配的日志等级。

指定日志名称

<!-- 程序执行消息 -->
<logger name="ProgramMessage" level="info" additivity="false">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="NORMAL_INFO_FILE" />
    <appender-ref ref="NORMAL_WARN_FILE" />
    <appender-ref ref="NORMAL_ERROR_FILE" />
</logger>

这里的 ProgramMessage 字符串是这个 logger 的名称,在定义 logger 时,可以使用该字符串指定该组 appender:

private final Logger logger = LoggerFactory.getLogger(LoggerConst.PROGRAM_MESSAGE);

其中的 level="info" 代表该组 appender 的起始级别(只拦截该级别及其以上的日志)。

additivity="false" 代表匹配到该名称后就不会往下继续匹配。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

临安剑客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值