【SpringBoot】10 日志持久化(log4j2)

news2024/11/24 9:14:16

介绍

日志概念

日志是系统生成的数据,用于记录网络、端点、物联网、应用程序、操作系统等,在运行时所发生事件的信息,便于开发人员或维护人员进行故障排查、性能优化、安全审计等工作。

日志作用

问题追踪及调试:当程序出现问题时,可以通过查看日志定位问题、辅助排查问题。
监控运行状态:通过日志查看分析程序运行状态。
安全审计:在需要记录用户行为、系统操作的场合,日志可以作为审计的依据。

常见日志框架

日志框架主要可分为日志门面、日志实现。
在这里插入图片描述

日志门面

日志门面定义了一组日志接口规范,并不提供底层的具体实现逻辑。
门面模式(外观模式):Facade Pattern,设计模式中的一种,核心思想是外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。
门面模式体现了Java中的封装特性,对外的接口要尽可能的简单易用。
常见的日志门面框架:JCL、Slf4j
JCL:Jakarta Commons Logging,是Apache提供的一个通用日志API。
Slf4j:Simple Logging Facade For Java,简单日志门面,主要为了给Java日志访问提供一套标准、规范的API框架。提供了一套接口,具体的实现交由其他日志框架(如:log4j、logback、log4j2等)。(https://www.slf4j.org/)

日志实现

日志实现是日志具体的实现,包括级别控制、打印格式、输出形式(输出到数据库、文件、控制台等)。
常见的日志实现框架:JUL、Log4j、Log4j2、Logback
JUL:Java Util Logging,Java原生日志框架,功能相对简单,性能一般。
Log4j:Log For Java,是Apache的开源项目,一个老牌的日志框架,功能强大。随着时间的推移,Log4j 逐渐被新开发的 Log4j2 所取代,如果是旧项目使用 Log4j 运行良好,无特殊需求无需迁移到 Log4j2。
Log4j2:由Apache开发的一套日志框架,相比于 Log4j,Log4j2 在性能上有显著提升,同时保持了丰富的功能,支持异步日志处理,适合高性能的需求场景。Log4j2提供了对Slf4j日志门面的桥接支持,因此被视为Slf4j的具体实现。
Logback:是 Log4j 创始人开发的一套新的日志框架,Spring Boot 的默认日志框架,有轻量级、性能优秀、功能齐全等优点。

官网

log4j2(https://logging.apache.org/log4j/2.x/)

参考链接

超详细的log4j2配置说明(https://zhuanlan.zhihu.com/p/701595014)
log4j properties配置实例 log4j2 配置详解properties(https://blog.51cto.com/u_16213708/10654195)

需求

将程序运行时的日志保存到磁盘中,并每日或是超出配置的最大日志文件大小时,进行文件切分,归档入当天的目录中。

log4j2 配置使用详情

Configuration:配置文件的根标签
    name:日志配置的名称
    status:日志打印级别(trace,debug,info,warn,error,fatal)
    monitorInterval:配置该参数,项目运行时,会按照参数配置定期扫描日志配置,动态改变日志的配置。单位为秒。
    
Properties:定义全局变量
    Property:单个变量
    
Appenders:日志输出位置(常见的有ConsoleAppender,FileAppender,AsyncAppender)
    Console:输出到控制台
        ThresholdFilter:过滤器(用于判断该appender用于处理何种日志事件)
            level: 控制台只输出level及以上级别的日志信息
            onMatch:#过滤器匹配时要采取的操作。可以是ACCEPT(接受)、DENY(拒绝)、NEUTRAL(中立。可以让日志经过后续的过滤器),默认是 NEUTRAL。
            onMismatch:#当过滤器不匹配时要采取的操作。可以是ACCEPT、DENY、NEUTRAL,默认是DENY。
        ignoreExceptions:在输出日志时,是否忽略异常,默认是true
        PatternLayout:布局策略
            charset:编码方式
            pattern: 指定日志输出的具体格式            
                %c{x}   Logger的名称,x 为精度说明符。说明符由十进制整数或以十进制整数开头的模式组成。
                                当精度说明符为整数值时,它将减小 Logger 名称的大小。如果数字为正,则布局将打印相应数量的最右边 Logger 名称组件。如果为负,则布局将删除相应数量的最左边的 Logger 名称组件。
                                如果精度包含任何非整数字符,则布局会根据模式缩写名称。如果精度整数小于 1,则布局仍将完整打印最右边的标记。默认情况下,布局将完整打印 Logger 名称。
                                    org.apache.commons.Foo
                                    %c{1}    -> Foo
                                    %c{2}    -> commons.Foo
                                    %c{10}   -> org.apache.commons.Foo
                                    %c{-1}   -> apache.commons.Foo
                                    %c{-2}   -> commons.Foo
                                    %c{-10}  -> org.apache.commons.Foo
                                    %c{1.}   -> o.a.c.Foo
                                    %c{.}    -> ...Foo
                                %C{x}   调用者的完全限定类名, x 为精度说明符.生成调用方的类名(location information)是一项昂贵的操作,可能会影响性能。请谨慎使用
                                %d{x}   日期,x为日期格式
                                %enc{pattern}{HTML/JSON/XML} 转义特定标记语言的特殊字符
                                %ex     输出绑定到日志记录事件的 Throwable 跟踪,默认情况下,它将输出完整调用链
                                %exception
                                %throwable
                                    %throwable{short}   输出异常的第一行
                                    %throwable{short.className} 输出发生异常的类的名称
                                    %throwable{short.methodName} 输出发生异常的方法名称
                                    %throwable{short.lineNumber} 输出发生异常的行号
                                    %throwable{short.message} 输出输出消息
                                    %throwable{n}       输出堆栈跟踪的前 n 行
                                    %throwable{none}       禁止输出异常
                                    %throwable{0}       禁止输出异常
                                %f      记录日志的文件名
                                %highlight  突出显示,根据当前事件的日志记录级别,将ANSI颜色添加到模式的结果中
                                %l      类的全路径和调用处的行号
                                %L      行号
                                %m      日志内容
                                %M      打印该条日志的方法名
                                %n      换行
                                %N      当前时间的毫微秒。如同调用:System.nanotime()
                                %pid    应用的进程ID
                                %r      输出自应用启动到输出该log信息耗费的毫秒数
                                %p      日志级别
                                %T      线程ID
                                %t      线程名称
                                %sn     日志调用的次数
                                %X      按MDC(Mapped Diagnostic Context 线程映射表)输出日志. ThreadContext
                                %X{key} 输出指定key
                                %x      按NDC(Nested Diagnostic Context 线程堆栈)输出日志
    RollingFile:日志持久化
        name:appender的名称
        fileName:输出的文件名
        ignoreExceptions:在输出日志时,是否忽略异常,默认是true
        filePattern:日志文件归档后的名称格式
        Policies:指定滚动日志的策略。即何时进行归档、新建新日志文件操作的时间。
            TimeBasedTriggeringPolicy:基于时间的滚动策略
                interval:时间间隔,默认1h。
                modulate:是否调制时间,如果值是true,interval为5,当前时间是10am,下次滚动的时间就是
            SizeBasedTriggeringPolicy:基于文件大小的滚动策略
                size:#单个日志文件最大容量,超过后将归档
            DefaultRolloverStrategy:配置日志的文件个数上限,默认为7,超过会覆盖前面的文件
                max:filePattern中-%i的最大值
    Loggers:全局配置,默认所有的Logger都继承此配置
             用来配置LoggerConfig,包含一个root logger和若干个普通logger。
             additivity指定是否同时输出log到父类的appender,缺省为true。
             一个Logger可以绑定多个不同的Appender。只有定义了logger并引入的appender,appender才会生效。
        Root: 用于配置默认的日志事件打印
            level: 指定默认的日志打印级别
            RegexFilter:日志过滤器
            AppenderRef:要异步调用的 Appender 的名称。可以配置多个 AppenderRef 元素。
            includeLocation:如果使用<asyncRoot> 或 <asyncLogger>,includeLocation="true"是必须要设置才会有类路径等一些信息打印出来
        AsyncLogger:官方推荐的异步方式。
                     异步日志有两种选择:全局异步和混合异步。

效果图

配置的最大文件大小为30M,每30M切分成一个文件,切分的文件归档进按日期分类的目录中。
在这里插入图片描述
过了凌晨0点,归档前一天的日志进前一天的目录中,新建一个新的日志文件存放当天的日志信息。
在这里插入图片描述

依赖

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <!-- 去掉SpringBoot默认的Logback配置 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

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

<!-- 加上这个才能辨认到log4j2.yml文件 -->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

配置文件

application.yml

logging:
  config: classpath:log4j2.yml
  level:
    com.lm.system.mapper: debug

log4j2.yml

Configuration:
  status: debug  #日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
  monitorInterval: 30 #Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数

  Properties: #定义全局变量
    Property:
      - name: log.level.console
        value: info
      - name: log.path
        value: ${sys:catalina.home:-.}/logs/${project.name} #加上 :-. 兼容Windows系统
      - name: project.name
        value: system
      - name: info.file.name
        value: info
      - name: error.file.name
        value: error
      - name: level.info.file.name
        value: info
      - name: level.error.file.name
        value: error

  Appenders: #日志输出位置
    Console: #输出到控制台
      name: CONSOLE
      target: SYSTEM_OUT
      ThresholdFilter: #过滤器,控制台只输出level及以上级别的日志信息
        level: ${sys:log.level.console} #sys:表示如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值
        onMatch: ACCEPT #过滤器匹配时要采取的操作。可以是ACCEPT(接受)、DENY(拒绝)、NEUTRAL(中立。可以让日志经过后续的过滤器),默认是 NEUTRAL。
        onMismatch: DENY #当过滤器不匹配时要采取的操作。可以是ACCEPT、DENY、NEUTRAL,默认是DENY。
      PatternLayout: #布局策略
        pattern: "%clr{%d{yyyy-MM-dd HH:mm:ss}}{blue} %clr{%5p} %clr{${sys:PID}}{magenta}  %clr{%l}{cyan} %clr{:}{faint} %m%n %xwEx"

    RollingFile: #日志持久化
      - name: ${info.file.name}
        fileName: ${log.path}/${info.file.name}.log #日志保存时的名称
        ignoreExceptions: false #在输出日志时,是否忽略异常,默认是true
        filePattern: "${log.path}/$${date:yyyy-MM-dd}/${info.file.name}-%d{yyyy-MM-dd}-%i.log" #日志文件归档后的名称格式
        PatternLayout:
          pattern: "%d{yyyy-MM-dd HH:mm}:%4p %t (%F:%L) - %m%n"
        Filters:
          ThresholdFilter: #注意顺序
            - level: error
              onMatch: DENY
              onMismatch: NEUTRAL
            - level: ${level.info.file.name}
              onMatch: ACCEPT
              onMismatch: DENY
        Policies: #指定滚动日志的策略。即何时进行归档、新建新日志文件操作的时间。
          #一天一存,即使文件不满足30MB
          TimeBasedTriggeringPolicy: #基于时间的滚动策略
            interval: "1" #时间间隔,默认1h
            modulate: "true" #是否调制时间
          SizeBasedTriggeringPolicy: #基于文件大小的滚动策略
            size: "30 MB" #单个日志文件最大30MB,超过后将归档
        DefaultRolloverStrategy: #配置日志的文件个数上限,默认为7
          max: 100 #filePattern中-%i的最大值
      - name: ${error.file.name}
        ignoreExceptions: false
        fileName: ${log.path}/${error.file.name}.log
        filePattern: "${log.path}/$${date:yyyy-MM-dd}/${error.file.name}-%d{yyyy-MM-dd}-%i.log"
        PatternLayout:
          pattern: "%d{yyyy-MM-dd HH:mm}:%4p %t (%F:%L) - %m%n"
        Filters:
          ThresholdFilter:
            - level: ${level.error.file.name}
              onMatch: ACCEPT
              onMismatch: DENY
        Policies:
          TimeBasedTriggeringPolicy:
            interval: "1"
            modulate: "true"
  Loggers: #全局配置,默认所有的Logger都继承此配置
    Root:
      level: debug
      AppenderRef:
        - ref: CONSOLE
        - ref: ${info.file.name}
        - ref: ${error.file.name}
      Logger:
        - name: com #指定具体要打印的日志的包路径
          additivity: false #是否继承父记录器的appender,默认为true
          level: debug
          AppenderRef:
            - ref: CONSOLE
            - ref: ${info.file.name}
            - ref: ${error.file.name}

项目目录结构图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; //计算a的b次方 int mypow(int a, int b){a a % 1337; // 防止a过大超出规模int ret 1;for(int i 0; i < b; i){ret * a;ret ret % 1337; //防止超出规模}return ret; } //整体计算 int superPow(int a, int* b, int bSize){if(a 1…

Android Jitpack制作远程仓库aar流程

开发高效提速系列目录 软件多语言文案脚本自动化方案Android Jitpack制作远程仓库aar流程 Android Jitpack制作远程仓库aar流程 背景aar制作与使用1. aar制作2. aar使用 异常解决总结 博客创建时间&#xff1a;2023.08.24 博客更新时间&#xff1a;2023.08.24 以Android stud…

leetcode刷题之二分算法

目录 简介 第一个错误的版本 算法思路 代码实现 两个数组的交集 算法思路 代码实现 两个数组的交集2 算法思路 代码实现 有效的完全平方数 算法思路 代码实现 猜数字大小 算法思路 代码实现 排列硬币 算法思路 代码实现 寻找比目标字母大的最小字母 代码实…

XTuner微调个人小助手认知实战

1 微调前置基础 本节主要重点是带领大家实现个人小助手微调&#xff0c;如果想了解微调相关的基本概念&#xff0c;可以访问XTuner微调前置基础。 2 准备工作 环境安装&#xff1a;我们想要用简单易上手的微调工具包 XTuner 来对模型进行微调的话&#xff0c;第一步是安装 XTun…

YOLO+Sort实现目标追踪

在前面的目标检测、实例分割的学习中&#xff0c;我们多是对单张图像进行处理&#xff0c;而事实上在我们的实际应用中多数需要对视频进行操作&#xff0c;当然这个操作也是讲视频转换为一帧帧的图像&#xff0c;但博主发现在ultralytics这个算法平台中&#xff0c;针对视频的处…

docker容器基本命令、docker进入容器的指令、容器的备份、镜像底层原理、使用commit命令制造镜像、将镜像推送到阿里云镜像仓库与私服仓库

除了exit 还有 ctrlpq exit退出停止 ctrlpq 退出不停止 将本地镜像推到阿里云 登入阿里云 容器镜像服务 实力列表 镜像仓库 创建镜像仓库 安装里面步骤来 这里192.168.10.145这部分用自己ifconfig地址

虚惊一场的一次事故,在事故中学习

上周日吃着晚饭时&#xff0c;“叮叮”两声&#xff0c;老板在QQ上单独M我。 “服务器好像崩了” “昨天和前天在线人数猛猛下滑 现在更是只有879人在线了” 看完消息&#xff0c;我震惊了&#xff0c;忙用筷子将碗中剩下的饭菜一股脑扒拉到嘴里&#xff0c;来到书桌前坐下&a…

华为OD机试-转盘寿司(C++ Java Python)

题目描述:寿司店周年庆&#xff0c;正在举办优惠活动回馈新老客户。寿司转盘上总共有n盘寿司&#xff0c;prices[i]是第i盘寿司的价格&#xff0c;如果客户选择了第i盘寿司&#xff0c;寿司店免费赠送客户距离第i盘寿司最近的下一盘寿司j&#xff0c;前提是prices[j]<prices…

RISC-V (七)外部设备中断

中断的分类 -本地中断 -software interrupt&#xff08;软终端&#xff09; -timer interrupt&#xff08;定时器中断&#xff09; -全局中断 -external interrupt&#xff08;外部中断 &#xff09; qemu主要是参考FU540-C000这款芯片做出来的&#xff0c;可以经常看一下这款…

学习yolo+Java+opencv简单案例(三)

主要内容&#xff1a;车牌检测识别&#xff08;什么颜色的车牌&#xff0c;车牌号&#xff09; 模型作用&#xff1a;车牌检测&#xff0c;车牌识别 文章的最后附上我的源码地址。 学习还可以参考我前两篇博客&#xff1a; 学习yoloJavaopencv简单案例&#xff08;一&#xff0…

ES5到ES6 js的语法更新

js是一门弱语言类型&#xff0c;为了实现更有逻辑的代码&#xff0c;需要不断更新语法规范&#xff0c;es就是用来规范js语法的标准。 09年发布了es5&#xff0c;到15年发布es6&#xff0c;到现在es6泛指es5.1以后的版本es2016&#xff0c;es2017。 var、let、const 关键字&…

Promise学习之基本方法

前言 上一篇章我们学习了Promise的概念、基本使用、状态等等&#xff0c;对于Promise也有了基础的了解&#xff0c;那本章就对与Promise的方法作基本学习&#xff0c;去了解了解Promise提供了什么方法。 一、then then处理Promise返回结果&#xff0c;接收两个回调函数 第一…

新建一个基于标准新建一个基于标准固件库的工程模板固件库的工程模板(实现LED单灯闪烁)

实验报告原件在资源可选择性下载 一、实验目的&#xff1a; 1.了解STM32固件库&#xff1b; 2.掌握STM32固件库关键子目录及固件库关键文件&#xff1b; 3.能够新建一个基于标准固件库的工程模板并完成编译 二、实验器材&#xff1a; 笔记本或电脑。 三、实验内容&#…

大投资模型 arxiv 量化论文

郭建与沉向阳 摘要 传统的量化投资研究面临着回报递减以及劳动力和时间成本上升的问题。 为了克服这些挑战&#xff0c;我们引入了大型投资模型&#xff08;LIM&#xff09;&#xff0c;这是一种新颖的研究范式&#xff0c;旨在大规模提高绩效和效率。 LIM 采用端到端学习和通…

数据结构系列-归并排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 归并排序 递归版本 首先&#xff0c;我们来看一下归并的示意图&#xff1a; 这是归并排序当中分解的过程。 然后便是两个两个进行排序&#xff0c;组合的过程。 归并完美的诠释…

docker镜像,ip,端口映射,持久化

docker 镜像的迁移&#xff1a;导出和导入镜像 查看镜像&#xff1a; [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB 打包 将镜像打包&#xff0c;找到save,可以将…

远程在电脑上玩PS5《黑神话:悟空》?借助极空间实现PS5远程串流攻略

远程在电脑上玩PS5《黑神话&#xff1a;悟空》&#xff1f;借助极空间实现PS5远程串流攻略 哈喽小伙伴们好&#xff0c;我是Stark-C~ 这两天的《黑神话&#xff1a;悟空》可谓是火爆出圈呀&#xff01;虽说我也是第一时间体验到了这款可以说是划时代意义的首款国产3A大作&…

maven 依赖管理(4)

依赖就是项目里运行的jar 一个项目可以设置多个依赖 这种的 1.依赖传递 直接依赖&#xff1a;就是当前自己的项目pom里的依赖 间接依赖&#xff1a;在自己pom文件引入别人的项目 就能共享到别人项目的依赖 2.依赖传递冲突问题 路径优先&#xff1a;出现相同依赖&#xff0…

华为数通方向HCIP-DataCom H12-821题库(更新单选真题:1-10)

第1题 1、下面是一台路由器的部分配置,关于该配置描述正确的是? [HUAWEllact number 2001 [HUAWEl-acl-basic-2001]rule 0 permit source 1.1.1.1 0 [HUAWEl-acl-basic-2001]rule 1 deny source 1.1.1.0 0 [HUAWEl-acl-basic-2001]rule

SSRF+Redis+Fastcgi

目录 1、打redis 2、打fastcgi 3、SSRF绕过 4、SSRF防御 1、打redis ssrfme靶场实战 页面直接给出了代码&#xff0c;过滤了file: dict ,等等 但是下面我们看到只要有info就能打印phpinfo() 通过phpinfo()打印的信息&#xff0c;发现有内网其他服务器的ip 直接访问 发现…