logback 不同类的日志打印在不同的文件中

2023-11-10

在Spring Boot中,您可以使用Logback为不同的类配置不同的日志文件。以下是一个基本的 logback.xml 配置示例,展示了如何为两个类 com.example.Class1com.example.Class2 配置不同的日志文件。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="CLASS1_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/class1.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="CLASS2_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/class2.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.example.Class1" level="info" additivity="false">
        <appender-ref ref="CLASS1_FILE" />
    </logger>

    <logger name="com.example.Class2" level="info" additivity="false">
        <appender-ref ref="CLASS2_FILE" />
    </logger>

    <root level="error">
        <appender-ref ref="CLASS1_FILE" />
        <appender-ref ref="CLASS2_FILE" />
    </root>
</configuration>

这个配置定义了两个 appender,分别命名为 “CLASS1_FILE” 和 “CLASS2_FILE”。每个appender会将日志输出到指定的文件中,这里分别是 logs/class1.loglogs/class2.log

然后,定义了两个 logger,分别对应 com.example.Class1com.example.Class2 类。这两个 logger 的日志级别都设置为 “info”,并将日志输出到对应的 appender 中。additivity="false" 的设置是为了防止日志被父 logger(在这里是 root logger)也处理。

最后,root logger 设置为只处理 “error” 级别以上的日志,它的日志输出到两个 appender 中。

以上配置示例可以根据你的具体需求进行调整,例如你可以修改日志级别、日志模式、日志文件的路径等。

<appender>标签

<appender>标签在Logback配置文件中定义了日志输出的目的地和格式。换句话说,它确定了日志消息的输出方式和地点。例如,这可能是一个文件,一个数据库,一个控制台窗口等等。

每个 <appender> 标签包含以下主要部分:

  • name属性:此属性定义了appender的名称,你可以随意命名,但需要确保在配置文件中唯一。
  • class属性:此属性定义了appender的类型。例如,ch.qos.logback.core.ConsoleAppender 是将日志发送到控制台,ch.qos.logback.core.rolling.RollingFileAppender 是将日志发送到文件,并提供滚动特性。
  • 子标签 <encoder><layout>:这些标签定义了日志输出的格式。PatternLayoutEncoderPatternLayout 可以让你自定义日志的格式。

举个例子:

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

在这个例子中,名为 “STDOUT” 的appender是 ConsoleAppender 类型,这意味着它将日志输出到控制台。 <encoder> 标签定义了日志的输出格式。%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 表示日志包含时间戳、线程名、日志级别、logger名和消息内容。

<logger>标签在Logback配置文件中定义了一个logger实例,这个实例会拦截、处理日志消息,并将日志传递到适当的appender中进行记录。

每个 <logger> 标签通常包含以下部分:

  • name属性:此属性定义了logger的名称,通常与你想要记录日志的类或包的名称匹配。例如,如果你有一个名为 com.example.MyClass 的类,并且你想要特别记录这个类的日志,那么你可以创建一个名称为 com.example.MyClass 的logger。
  • level属性:此属性定义了该logger接受的最低日志级别。可选的级别有 TRACE, DEBUG, INFO, WARN, ERROR, OFF。例如,如果设置为INFO,那么该logger将只记录INFO、WARN、ERROR级别的日志。
  • additivity属性:此属性决定日志是否应传递给父logger进行处理。如果设为 false,则日志仅由此logger处理,不会被传递到父logger;如果设为 true 或不设置,日志既由此logger处理,也会被传递到父logger。
  • 子标签 <appender-ref>:此标签用于将logger与appender关联起来。appender的引用名称必须与之前定义的appender的名称匹配。

例如:

<logger name="com.example.MyClass" level="info" additivity="false">
    <appender-ref ref="STDOUT" />
</logger>

这个示例定义了一个名为 com.example.MyClass 的logger,其日志级别设置为 info,并且不会把日志传递给父logger。日志将被发送到名为 STDOUT 的appender中进行处理。

综合logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--为了防止进程退出时,内存中的数据丢失,请加上此选项-->
    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="E:/code/logs/springboot_temple" />
    <property name="LOG_NAME_BEGIN" value="springboot_temple" />
    <property name="moduleName" value="springboot-temple" />
    <property name="maxFileSize" value="100MB" />
    <property name="totalSizeCap" value="2GB" />
    <property name="MaxHistory" value="30" />
    <!-- 彩色日志格式 -->
    <property name="COLOUR_LOG_PATTERN"
              value="%magenta(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([TRACE_ID:%X{TRACE_ID}])  %blue([%thread]) %highlight(%-5level) %green(%logger) - %msg%n"/>
    <!-- Console 输出设置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${COLOUR_LOG_PATTERN}</pattern>-->
            <charset>utf8</charset>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <!-- 所有级别日志 appender  -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--按大小+时间的策略保存日志-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-all-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <!--每100m分一个文件-->
            <maxFileSize>${maxFileSize}</maxFileSize>
            <!--总大小不超过2G-->
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
            <!--日志文件保留天数-->
            <MaxHistory>${MaxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>${COLOUR_LOG_PATTERN}</pattern>
        </encoder>
    </appender>


    <!-- warn日志 appender  -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-info-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <!--每100m分一个文件-->
            <maxFileSize>${maxFileSize}</maxFileSize>
            <!--总大小不超过2G-->
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
            <!--日志文件保留天数-->
            <MaxHistory>${MaxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${COLOUR_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印info日志 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- debug日志 appender  -->
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-debug-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <!--每100m分一个文件-->
            <maxFileSize>${maxFileSize}</maxFileSize>
            <!--总大小不超过2G-->
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
            <!--日志文件保留天数-->
            <MaxHistory>${MaxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${COLOUR_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印debug日志 -->
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- error日志 appender  -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-error-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <!--每100m分一个文件-->
            <maxFileSize>${maxFileSize}</maxFileSize>
            <!--总大小不超过2G-->
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
            <!--日志文件保留天数-->
            <MaxHistory>${MaxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${COLOUR_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印error日志 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- warn日志 appender  -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-warn-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <!--每100m分一个文件-->
            <maxFileSize>${maxFileSize}</maxFileSize>
            <!--总大小不超过2G-->
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
            <!--日志文件保留天数-->
            <MaxHistory>${MaxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${COLOUR_LOG_PATTERN}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印warn日志 -->
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>



<!--    类级别日志输出-->
    <appender name="CLASS1_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--按大小+时间的策略保存日志-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-class1-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <!--每100m分一个文件-->
            <maxFileSize>${maxFileSize}</maxFileSize>
            <!--总大小不超过2G-->
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
            <!--日志文件保留天数-->
            <MaxHistory>${MaxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>${COLOUR_LOG_PATTERN}</pattern>
        </encoder>
    </appender>


    <appender name="CLASS2_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--按大小+时间的策略保存日志-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-class2-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <!--每100m分一个文件-->
            <maxFileSize>${maxFileSize}</maxFileSize>
            <!--总大小不超过2G-->
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
            <!--日志文件保留天数-->
            <MaxHistory>${MaxHistory}</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>${COLOUR_LOG_PATTERN}</pattern>
        </encoder>
    </appender>


    <logger name="com.example.demo_wwxx_dep.service.ClassLog1" level="info" additivity="true">
        <appender-ref ref="CLASS1_FILE" />
    </logger>

    <logger name="com.example.demo_wwxx_dep.service.ClassLog2" level="info" additivity="false">
        <appender-ref ref="CLASS2_FILE" />
    </logger>



    <!-- 日志输出级别 -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
        <appender-ref ref="ERROR" />
        <appender-ref ref="DEBUG" />
        <appender-ref ref="INFO" />
        <appender-ref ref="WARN" />
    </root>
</configuration>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

logback 不同类的日志打印在不同的文件中 的相关文章

随机推荐

  • ElasticSearch实现聚合结果的筛选

    小编我想实现这样一个操作 c group id取值格式为 100 101 102 103 而我想做的操作是 聚合时候只返回编号是 101 格式的数据 实现的核心代码是 在聚合下面加一个 include 101 就可以 aggs字段提供了过滤
  • JavaScript-----轮播图案例展示

    前言 这一期我们去通过JavaScript的代码实现轮播图的制作 下面有效果展示和代码资源 其中的图片资源和代码资源我都上传上去了 如果需要运行的话 你们可以去直接下载下来 希望各位喜欢 效果展示 1694164869515 功能说明 这个
  • 响铃:从《中国汽车四十年》看4S店的“革命之路”

    文 曾响铃 来源 科技向令说 xiangling0815 除了贾跃亭造车 特斯拉私有化等舆论热点 作为最大的制造业领域 汽车这个行当从来就不缺话题 最近 一本 中国汽车四十年 突然火爆起来 怀旧夹杂着新生 受到汽车行业及相关的从业者热捧 而
  • Mybatis学习

    Mybatis配置步骤 总体配置目录结构 在resources下面新建mybatis config xml
  • 采矿权EXCEL文件坐标串矢量化和信息提取

    解决思路 1 采矿权文件坐标格式规则 百度出来的规则 2 将规则输入chatgpt中 让其给出arcpy的代码 如下结果 不得不说 chatgpt确实很强大 事半功倍 检查测试下了代码 xy坐标互换了下 解析坐标时列值有点不正确 index
  • springboot实现单文件上传和多文件上传(注释详细,最新版本)

    关于文件 我一般都是存在oss里面的 因为比赛可能要用到 所以又去学了一下存在服务器里面 关于这里 我是存本地目录的 单文件上传 首先创建一个springBoot项目 这个就不说了 然后创建一个文件上传的html页面
  • 超实用的python技巧:python读写Excel表格的实例代码(简单实用)

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了python读写Excel表格的方法 本文通过实例代码给大家介绍的非常详细 具有一定的参考借鉴价值 需要的朋友可以参考下 安装两个库 pip instal
  • 前端vue项目一键换肤主题技术方案

    一 技术核心 通过切换 css 选择器的方式实现主题样式的切换 在组件中保留不变的样式 将需要变化的样式进行抽离 提供多种样式 给不同的主题定义一个对应的 CSS 选择器 根据不同主题通过切换CSS选择器设置不同的样式 二 实现方法 提取公
  • 数学建模之Python-随机森林算法

    理论 代码 coding utf 8 author Administrator step1 调用包 import pandas as pd from sklearn model selection import train test spl
  • Arduino UNO R3

    Arduino 常见型号 当然还有 LilyPad 附图 最常见的自然是UNO 最新版是第三版R3 国内也有一些改进的板子 我用的是一般的板子 拿到货也只能默默了 简介 The Uno is a microcontroller board
  • SyntaxError: unexpected EOF while parsing

    报错在eval 函数 正确代码段 with open COCO train json r as f data f readline data data strip split del data 0 del data 1 for i in d
  • 华为HCIA(五)

    Vlan id 在802 1Q中 高级ACL不能匹配用户名和源MAC 2 4G频段被分为14个交叠的 错列的20MHz信道 信道编码从1到14 邻近的信道之间存在一定的重叠范围 STA通过Probe获取SSID信息 Snmp报文 网络管理设
  • Java-1.1

    题目描述 编写程序 显示Welcome to Java Welcome to Computer Science Programming is fun 代码 public class PrintfMessage public static v
  • 首次访问(域名)过程

    1 解析出域名对应的ip地址 先知道默认的网关 使用arp协议获取默认网关的mac地址 组织数据发送给默认网关 ip还是dns服务器的ip但是mac地址是默认网关的mac地址 默认网关拥有转发数据的能力把数据转发给路由器 路由器根据自己的路
  • 网络编程之字节序

    字节序 计算机数据表示存在两种字节顺序 网络字节顺序NBO Network Byte Order 与主机字节顺序HBO Host Byte Order 或者是大端模式和小端模式 网络字节序 大端模式 网络字节顺序NBO 按从高到低的顺序存储
  • 普通人学Python有意义吗?

    普通人学Python有意义吗 Python作为一种跨平台的计算机程序设计语言 近些年来越来越受到企业和IT从业者的青睐 那么 普通人是否需要学习Python呢 学会Python有什么意义呢 今天小编就和大家聊一聊这个话题 Python有效提
  • 拿手机干什么

    前段时间在知乎网上收集了一下人们主要拿手机干什么 收到的反馈是 除了记事本 短信聊天 QQ聊天 回复邮件 发微博 回复帖子需要简短敲字外 大部分就是索取信息 看来无线移动上网 屏幕增大 键盘消失是需求大趋势 因为索取信息比提交数据要多 提交
  • wayland 之opengl es

    EGL 是 OpenGL ES 渲染 API 和本地窗口系统 native platform window system 之间的一个中间接口层 它主要由系统制造商实现 使用 EGL 绘图的基本步骤 Display EGLDisplay 是对
  • html里link使用方法,html的link标签怎么使用?

    html的link标签怎么使用 link标签是放在与之间的 把link放入这对符号中间 lt gt 写成这样 然后在link后面添加属性和属性对应的值 新手同学看到这里估计一头雾水 别担心 如乐老师举个例子你就懂了 比如 这段代码的作用是给
  • logback 不同类的日志打印在不同的文件中

    在Spring Boot中 您可以使用Logback为不同的类配置不同的日志文件 以下是一个基本的 logback xml 配置示例 展示了如何为两个类 com example Class1 和 com example Class2 配置不