Springboot日志框架logback与log4j2

news2024/11/17 17:30:49

目录

Springboot日志使用

Logback日志

日志格式

自定义日志格式

日志文件输出

Springboot启用log4j2日志框架


Springboot日志使用

Springboot底层是使用slf4j+logback的方式进行日志记录

Logback日志

trace:级别最低

debug:调试级别的,常用于跟踪程序的进展

info:普通的打印信息(默认的日志级别)

warn:警告级别,不影响使用,但应该注意

error:错误级别,错误日志信息打印

fatal:致命级别,因代码异常导致程序退出,级别最高

日志级别

Trace-> debug-> info-> warn-> error-> fatal

logger.trace("trace");跟踪

logger.debug("debug");调试

logger.info("info");信息

logger.warn("warn");告警

logger.error("error");异常

logging:
  level:
    root: trace

logging:
  level:
    com:
    example: trace

日志格式

1、时间日期:精确到毫秒

2、日志级别:ERROR,WARN,INFO,DEBUG,TRACE

3、进程ID:

4、分隔符:— 标识实际日志的开始

5、线程名:方括号括起来(可能会截断控制台输出)

6、Logger名:通常使用源代码的类名

7、日志内容:

自定义日志格式

%clr(%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}){yellow}

docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging

日志文件输出

默认情况下,springboot仅记录到控制台,不写日志文件。

若要输出日志文件,需设置logging.file.name或logging.file.path属性

logging:
  level:
    com:
    example: trace
  #logging.pattern.dateformat -> LOG_DATEFORMAT_PATTERN
  #https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging
  #pattern:
  #  dateformat: yyyy-MM-dd HH:mm:ss.SSS
  file:
    #log文件默认在项目的相对路下
    name: D:/test/log/demo.log

file:
    #默认文件名spring.log
#    name: D:/test/log/demo.log
    #log文件默认在项目的相对路下
    path: D:/test/log/

logging:
  level:
    com:
    example: trace
  #logging.pattern.dateformat -> LOG_DATEFORMAT_PATTERN
  #https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging
  #pattern:
  #  dateformat: yyyy-MM-dd HH:mm:ss.SSS
  file:
    #默认文件名spring.log
    name: D:/test/log/demo.log
    #log文件默认在项目的相对路下
#    path: D:/test/log/
    # 最大日志文件大小(默认为10MB,这里为了测试归档,暂时设置为5KB)
    max-size: 5KB
    # 要保留的日志备份的总大小(默认为0B)
    total-size-cap: 1GB
    # 保存存档日志文件的最大天数(默认为7天)
    max-history: 7

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
    <property name="log.path" value="${user.dir}/logs"/>
    <!-- 日志输出格式 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{100} - [%method,%line] - %msg%n"/>
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- 系统日志输出 -->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 系统日志输出 -->
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/debug.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>DUBUG</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 用户访问日志输出  -->
    <appender name="user" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/user.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滚 daily -->
            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
<!--    日志水平-->
    <root level="info">
        <appender-ref ref="console"/>
    </root>
    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="info"/>
        <appender-ref ref="debug"/>
        <appender-ref ref="error"/>
    </root>
    <!--系统用户操作日志-->
    <logger name="com.example" level="info">
        <appender-ref ref="user"/>
    </logger>
</configuration>

Springboot启用log4j2日志框架

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions><!-- 排除logback依赖 -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!--Log4j2场景启动器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

<?xml version="1.0" encoding="UTF-8"?>
<!--status:Log4j2内部日志的输出级别,设置为TRACE对学习Log4j2非常有用 -->
<!--monitorInterval:定时检测配置文件的修改,有变化则自动重新加载配置,时间单位为秒,最小间隔为5s -->
<Configuration status="WARN" monitorInterval="1800">
    <!--properties:设置全局变量 -->
    <properties>
        <!--LOG_HOME:指定当前日志存放的目录 -->
        <property name="LOG_HOME">./logs</property>
        <!--FILE_NAME:指定日志文件的名称 -->
        <property name="FILE_NAME">test</property>
    </properties>
    <!--Appenders:定义日志输出目的地,内容和格式等 -->
    <Appenders>
        <!--Console:日志输出到控制台标准输出 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--pattern:日期,线程名,日志级别,日志名称,日志信息,换行 -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [线程名%t] [日志级别%-5level] [日志名称%L] - [日志信息:%msg]%n" />
        </Console>
        <!--RollingFile:日志输出到文件,下面的文件都使用相对路径 -->
        <!--fileName:当前日志输出的文件名称 -->
        <!--filePattern:备份日志文件名称,备份目录为logs下面以年月命名的目录,备份时使用gz格式压缩 -->
        <RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%L] - %msg%n" />
            <!--Policies:触发策略决定何时执行备份 -->
            <Policies>
                <!--TimeBasedTriggeringPolicy:日志文件按照时间备份 -->
                <!--interval:每1天生成一个新文件,时间单位需要结合filePattern时间%d{yyyy-MM-dd} -->
                <!--同理,如果要每1小时生成一个新文件,则改成%d{yyyy-MM-ddHH} -->
                <!--modulate:对备份日志的生成时间纠偏,纠偏以0为基准进行,"0+interval"决定启动后第一次备份时间 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <!--SizeBasedTriggeringPolicy:日志文件按照大小备份 -->
                <!--size:指定日志文件最大为100MB,单位可以为KB、MB或GB -->
                <SizeBasedTriggeringPolicy size="200MB" />
            </Policies>
            <!--DefaultRolloverStrategy:翻转策略决定如何执行备份 -->
            <!--max:最多保存5个备份文件,结合时间使用后,在每个时间段内最多有5个备份,多出来的会被覆盖 -->
            <!--compressionLevel:配置日志压缩级别,范围0-9,0不压缩,1压缩速度最快,9压缩率最好,目前只对于zip压缩文件类型有效 -->
            <DefaultRolloverStrategy max="5" compressionLevel="1">
                <!--Delete:删除匹配到的过期备份文件 -->
                <!--maxDepth:由于备份文件保存在${LOG_HOME}/$${date:yyyy-MM},所以目录深度设置为2 -->
                <Delete basePath="${LOG_HOME}" maxDepth="2">
                    <!--IfFileName:匹配文件名称 -->
                    <!--glob:匹配2级目录深度下的以.log.gz结尾的备份文件 -->
                    <IfFileName glob="*/*.log.gz" />
                    <!--IfLastModified:匹配文件修改时间 -->
                    <!--age:匹配超过180天的文件,单位D、H、M、S分别表示天、小时、分钟、秒-->
                    <IfLastModified age="180D" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <!--Loggers:定义日志级别和使用的Appenders -->
    <Loggers>
        <!--name: 打印日志的类的包路径 -->
        <!--additivity: true当前的Logger打印的日志附加到Root,false仅仅打印到RollingFile -->
        <Logger name="com.example" level="info" additivity="true">
            <AppenderRef ref="RollingFile" />
        </Logger>
        <!--Root:日志默认打印到控制台 -->
        <!--level日志级别: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
        <Root level="ERROR">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

Apache Log4j2 (Log4j – Apache Log4j 2)是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并参考了Logback中优秀的设计,同时修复了Logback架构中的一些问题。被誉为是目前最优秀的Java日志框架;企业中通常使用SLF4j门面+Log4j2来记录日志。

 

SLF4J: Found provider [ch.qos.logback.classic.spi.LogbackServiceProvider@11c20519]

SLF4J: Found provider [org.apache.logging.slf4j.SLF4JServiceProvider@70beb599]

存在依赖冲突,解决办法

<exclusions><!-- 排除logback依赖 -->

<exclusion>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-logging</artifactId>

</exclusion>

</exclusions>

 

排查发现

spring-boot-starter-actuator

springfox-swagger2

springfox-swagger-ui

spring-boot-starter-web

需排除logback依赖否则会与log4j2产生依赖冲突

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

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

相关文章

Google play 应用批量下架的可能原因及应对指南

想必大多数上架马甲包或矩阵式上架的开发者们&#xff0c;都遭遇过应用包批量被下架、账号被封的情况。这很令人苦恼&#xff0c;那造成这种情况的可能原因有哪些呢&#xff1f;以及如何降低这种情况发生&#xff1f; 1、代码问题 通常上架成功后被下架的应用&#xff0c;很可…

基于局部信息提取的人脸标志检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 人脸检测 4.2 局部区域选择 4.3 特征提取 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .........................................…

2024最新 8 款电脑数据恢复软件推荐分享

数据恢复是一个涉及从设备硬盘驱动器检索已删除文件的过程。这可能需要存储在工作站、笔记本电脑、移动设备、服务器、相机、闪存驱动器上的数据——任何在独立或镜像/阵列驱动器上存储数据的东西&#xff0c;无论是内部还是外部。 在某些情况下&#xff0c;文件可能被意外或故…

“天舟七号”发射成功,三思显示科技助力中国航天大发展!

海南文昌&#xff0c;椰林深处&#xff0c;一道耀眼尾焰点亮夜空。1月17日22时27分&#xff0c;搭载天舟七号货运飞船的长征七号遥八运载火箭&#xff0c;在我国文昌航天发射场圆满成功发射&#xff0c;将与在轨运行的空间站组合体进行交会对接。据悉&#xff0c;“天舟七号”装…

Postman基本使用、测试环境(Environment)配置

文章目录 准备测试项目DemoController测试代码Interceptor模拟拦截配置 Postman模块简单介绍Postman通用环境配置新建环境(Environment)配置环境(Environment)设置域名变量引用域名变量查看请求结果打印 Postman脚本设置变量登录成功后设置全局Auth-Token脚本编写脚本查看conso…

SQL SERVER无法连接到服务器解决过程记录

很久没用sql server了&#xff0c;这几天打算更新SQL SERVER数据库&#xff1a;SQL看这一篇就看够了&#xff08;附详细代码及截图&#xff09; 这篇文章&#xff0c;发现连接不上服务器。 找一下解决办法。 一、打开服务界面 在键盘上按“WINR”快捷键&#xff0c;打开运行…

记一次go应用在k8s pod已用内存告警不准确分析

一、背景 起因&#xff1a; 自监控应用凌晨告警&#xff1a;Pod 内存使用率大于80%&#xff08;规格为1c1G&#xff09;。内存缓慢增长&#xff0c;持续到早上内存使用率停止在81%左右。 疑点&#xff1a; 此模块是一个轻任务模块&#xff08;基于go开发&#xff09;&#xff0…

ConcurrentHashMap 原理

ConcurrentHashMap ConcurrentHashMap的整体架构ConcurrentHashMap的基本功能ConcurrentHashMap在性能方面的优化 concurrentHashMap&#xff1a; ConcurrentHashMap的整体架构 concurrentHashMap是由数组链表红黑树组成 当我们初始化一个ConcurrentHashMap实例时&#xff0c…

Gin 框架之用户密码加密

文章目录 一、引入二、密码加密位置三、如何加密四、bcrypt 库加密4.1 介绍4.2 优点&#xff1a;4.3 使用 五、小黄书密码加密实践 一、引入 Gin是一个用Go语言编写的Web框架&#xff0c;而用户密码的加密通常是在应用程序中处理用户身份验证时的一个重要问题。 通常敏感信息…

刘阳,定格历史,守护中华文化!

2021年2月24日&#xff0c;#圆明园365张珍贵老照片#的话题凭3.7亿阅读量冲上热搜。这批时代跨越80年的老照片仿佛重启记忆的按钮&#xff0c;让人梦回“夏宫”&#xff1b;少有人知道&#xff0c;它们的拥有者&#xff0c;却是一位不折不扣的80后。 刘阳&#xff0c;土生土长北…

Python初学者须知(9)Return有什么用——初识Return语句

本系列博客主要针对的是Python初学者。Python语言简洁、强大的特性吸引了越来越多的技术人员将他们的项目转移到Python上。目前&#xff0c;Python已经成为计算机行业最流行的编程语言之一。笔者考虑到Python初学者的多元化&#xff08;Python学习者可能是对编程感兴趣的中学生…

mysql数据迁移报错Specified key was too long; max key length is 767 bytes

目录 场景&#xff1a; 说明&#xff1a; 疑问&#xff1a; 解决&#xff1a; 验证&#xff1a; 场景&#xff1a; 线上项目支持的过程中遇到mysql库表结构和数据由A库迁移到B库上提示Specified key was too long; max key length is 767 bytes报错&#xff0c;第一次遇到特此…

【保姆级教程|YOLOv8改进】【3】使用FasterBlock替换C2f中的Bottleneck

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

20. 从零用Rust编写正反向代理,四层反向代理stream(tcp与udp)实现

wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器&#xff0c;四层TCP/UDP转发&#xff0c;内网穿透&#xff0c;后续将实现websocket代理等&#xff0c;会将实现过程分享出来&#xff0c;感兴趣的可以一起造个轮子 项目地址 gite: https:…

Acrel-1000DP分布式光伏系统在某重工企业18MW分布式光伏中应用

摘 要&#xff1a;分布式光伏发电特指在用户场地附近建设&#xff0c;运行方式以用户侧自发自用、余电上网&#xff0c;且在配电系统平衡调节为特征的光伏发电设施&#xff0c;是一种新型的、具有广阔发展前景的发电和能源综合利用方式&#xff0c;它倡导就近发电&#xff0c;就…

回溯算法篇-01:全排列

力扣46&#xff1a;全排列 排列和组合的区别在于&#xff0c;排列对“顺序”有要求。比如 [1,2] 和 [2,1] 是两个不同的结果。 这就导致了同一个元素 在同一条路径中不可重复使用&#xff0c;在不同的路径中可以重复使用。 比如数组 [1,2,3] &#xff0c;在第一条路径 [1,2,…

【jQuery入门】基础使用-入口函数、顶级对象$

文章目录 前言一、基础使用1.1 jQuery的下载1.2 简单的使用 二、顶级对象$总结 前言 jQuery是一款广泛应用于前端开发的JavaScript库&#xff0c;它简化了许多常见任务的操作&#xff0c;使得代码编写更加便捷。本文将介绍jQuery的基础使用&#xff0c;包括入口函数和顶级对象…

IPFoxy运营干货|谷歌广告Google Ads建立广告需要注意什么?

编辑投放谷歌广告需要多少个步骤和什么准备工作&#xff0c;本文将来讲述&#xff0c;主要分5个内容&#xff1a;一、投放前竞对研究&#xff1b;二、投放前广告账户设置&#xff1b;三、建立广告系列&#xff1b;四、建立广告组&#xff1b;五、广告长期策略。接下来我们来开始…