springboot 日志配置

2023-11-04

logback.xml与logback-spring.xml

配置文件的加载顺序

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

如果同时存在logback.xml和logback-spring.xml,或者同时存在logback.xml和自定义的配置文件,则会先加载logback.xml,再根据application配置加载指定配置文件,或加载logback-spring,xml。

# application.properties加载指定配置文件
logging.config=classpath:logback-spring.xml

如果使用的是 logback.xml,里面引用了application.yml的变量,那么会获取不到,需要改为logback-spring.xml。

logback.xml一般用于非Spring Boot项目,logback-spring.xml用于Spring Boot项目

 存放的位置

logback-spring.xml存放的位置是在SpringApplication主类所在的项目的resources目录,也就是application.yml或者application.properties所在的目录。
logback.xml存放的位置是在你启动的那个类所在的项目的resources目录。

本文使用的是logback-spring.xml。

application.yml

日志级别 logging.level

日志级别 trace<debug<info<warn<error<fatal

默认级别为info,即默认打印info及其以上级别的日志。

logging.level设置日志级别,后面跟生效的区域,比如root表示整个项目,也可以设置为某个包下,也可以具体到某个类名(日志级别的值不区分大小写)

参考:https://www.cnblogs.com/yanguobin/p/11487667.html

logging.path 或者 logging.file

注意:它们不会同时生效,只配置其中一个就好了。若同时指定logging.path和logging.file,则logging.path不会生效,只会按照logging.file生成

例如:

logging.path = ./logs

 logging.file,只指定文件名,会生成在当前总项目目录下;同时指定目录和文件名,会在指定目录下生成指定文件名的日志文件(相对路径,则会生成在当前总项目目录下)。

注意:但当只指定已存在的目录时,是不起作用的,是无效的,若后面跟上不存在的目录或文件,则会生成日志文件。

#/logDemo,目录已存在的时,无法生成日志文件
logging.file=/logDemo

参考:https://www.cnblogs.com/yanguobin/p/11486584.html

logback-spring.xml引用application.yml变量

${LOG_PATH:-.}对应logging.path日志文件路径

<property name="LOG_PATH" value="${LOG_PATH:-.}"></property>

<fileNamePattern>${LOG_PATH}/info.%d.%i.log</fileNamePattern>

参考:解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题_log_path:-_chlearning125的博客-CSDN博客

完整示例

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration>
    <!--输出到控制台-->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n
            </pattern>
        </layout>
    </appender>

    <!--输出到文件-->
    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n
            </pattern>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>/var/log/main-module/info.%d.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>/var/log/main-module/error.%d.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>

</configuration>

 配置项

一个父标签:configuration
两种属性:contextName和property
三个节点:appender、root、logger

configuration

scan
当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod
设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug
当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 

contextName

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
如果同时存在logback.xml和logback-spring.xml。如果这两个配置文件的contextName不同,就会报错。 

property

用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
例如使用定义日志目录,然后在设置日志文件时使用。

append节点

appender的意思是追加器,在这里可以理解为一个日志的渲染器(或者说格式化日志输出)。比如渲染console日志为某种格式,渲染文件日志为另一种格式。

appender中有name和class两个属性:name表示该渲染器的名字;class表示使用的输出策略。

常见的有控制台输出策略(class="ch.qos.logback.core.ConsoleAppender")和文件输出策略(class="ch.qos.logback.core.rolling.RollingFileAppender")。 

控制台输出

<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<property name="pattern-color" value="%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %red(%logger{50}) - %yellow(%msg) %n"/>

<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>debug</level>
  </filter>
  <encoder>
    <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
    <!-- 设置日志的颜色和高亮 -->
    <!-- <pattern>${pattern-color}</pattern> -->
    <!-- 设置字符集 -->
    <charset>UTF-8</charset>
  </encoder>
</appender>

文件输入

 rollingPolicy表示日志记录器的滚动策略

SizeBasedTriggeringPolicy:基于文件大小进行滚动;

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
	<file>test.log</file> 
    <!--表示按照固定窗口模式生成日志文件,当文件大于5MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。-->
	<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
		<fileNamePattern>tests.%i.log.zip</fileNamePattern> 
		<minIndex>1</minIndex> 
		<maxIndex>3</maxIndex> 
	</rollingPolicy> 
    <!--当文件大小超过5MB时,通知RollingPolicy轮转-->
	<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
		<maxFileSize>5MB</maxFileSize> 
	</triggeringPolicy> 
	<encoder> 
		<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
	</encoder> 
</appender> 

TimeBasedRollingPolicy:根据时间定义翻转策略,例如按天或按月。TimeBasedTriggeringPolicy实现了RollingPolicy和TriggeringPolicy接口,既负责滚动也负责触发滚动。

<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!-- 正在记录的日志文件的路径及文件名:保存当天的日志记录 -->
	<file>${log.path}/log_debug.log</file>
	<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
		<fileNamePattern>${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
		<maxHistory>30</maxHistory>
		<!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件-->
		<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
			<maxFileSize>10MB</maxFileSize>
		</timeBasedFileNamingAndTriggeringPolicy>
	 </rollingPolicy>
	 <!--此日志文件只记录debug级别的 -->
	<filter class="ch.qos.logback.classic.filter.LevelFilter">
		<level>debug</level>
		<onMatch>ACCEPT</onMatch>
		<onMismatch>DENY</onMismatch>
	</filter>
</appender> 

SizeAndTimeBasedRollingPolicy:TimeBasedRollingPolicy的一个子类,实现了基于时间和日志文件大小的翻滚策略。按日期归档文件,但同时限制每个日志文件的大小。最常用的滚动策略。

<!--输出到文件-->
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<!-- 正在记录的日志文件的路径及文件名:保存当天的日志记录 -->
	<file>${log.path}/log_debug.log</file>
	<!--日志文件输出格式 -->
	<encoder>
		<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
		<charset>UTF-8</charset> <!-- 设置字符集 -->
	</encoder>
	<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
	<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
		<!--将当天的日志记录在<file>,然后将昨天的日志归档到下面的文件中-->
		<!--按天切分  %d{yyyy-MM-dd} %i指定索引-->
		<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
		<!--单个日志文件最大100M,超过后再创建一个日志文件,日志文件的名字最后+1-->
		<maxFileSize>100MB</maxFileSize>
		<!--日志文件保留天数-->
		<maxHistory>30</maxHistory>
		<!--所有的日志文件最大20G,超过就会删除旧的日志-->
		<totalSizeCap>20GB</totalSizeCap>
	</rollingPolicy>
	<!--此日志文件只记录debug级别的 -->
	<filter class="ch.qos.logback.classic.filter.LevelFilter">
		<level>debug</level>
		<onMatch>ACCEPT</onMatch>
		<onMismatch>DENY</onMismatch>
	</filter>
</appender>

encoder表示日志文件的格式

%d表示时间
%thread表示线程名
%-5level 表示日志级别,允许以五个字符长度输出
%logger{50}表示具体的日志输出者,比如类名,括号内表示长度
%msg表示具体的日志消息,就是logger.info("xxx")中的xxx
%n表示换行

onMatch和onMismatch都有三个属性值,分别为Accept、DENY、NEUTRAL

onMatch="ACCEPT"    匹配该级别及以上
onMatch="DENY"        不匹配该级别及以上
onMatch="NEUTRAL" 该级别及以上的由下一个filter处理

                                    如果当前是最后一个,则是匹配该级别及以上

onMismatch="ACCEPT"   匹配该级别以下

onMismatch="DENY"       不匹配该级别以下
onMismatch="NEUTRAL" 该级别及以下的由下一个filter处理

                                         如果当前是最后一个,则不匹配该级别以下的

当需要将info以上级别的都输出到info日志中,可以使用ch.qos.logback.classic.filter.ThresholdFilter这个过滤器。

<!--临界值日志过滤级别配置 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
	<!-- 在日志配置级别的基础上过滤掉info级别以下的日志 -->
	<level>INFO</level>
</filter>

 <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。

<!-- 追加方式记录日志 -->
<append>true</append>

root

root节点实际上是配置启用哪种appender,可以添加多个appender。
root配置必须在appender下边。
root节点的level是总的日志级别控制:
如果appender的日志级别设定比root的高,会按照appender的日志级别打印日志,
如果appender的日志级别比root的低,会按照root设定的日志级别进行打印日志
也就是说root设定的日志级别是最低限制,如果root设定级别为最高ERROR,那么所有appender只能打印最高级别的日志。

logger

对单个包或类添加配置:name:用来指定受此loger约束的某一个包或者具体的某一个类。
addtivity:是否向上级loger传递打印信息。默认是true。

<logger name="com.pikaqiu.logbackdemo" level="debug" additivity="false">
  <appender-ref ref="CONSOLE" />
</logger>
<logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="INFO">
  <appender-ref ref="STDOUT"/>
</logger>

root和logger是父子的关系。
logger的appender根据参数additivity决定是否要叠加root的appender,logger的级别是其自身定义的级别,和root的级别没什么关系。
logger对单个包或类添加配置,相当于局部配置,root相当于全局配置
如果logger里面配置了additivity=“false”,就会覆盖root的,只打印一遍;但是additivity=“true”,就会向上层再次传递,不会覆盖,而是打印两遍! 

环境配置

配置多环境日志输出  可以在application.properties中配置选择哪个profiles : spring.profiles.active=dev

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds">
    <!--生产环境:输出到文件-->
    <springProfile name="pro">
        <root level="info">
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="WARN_FILE" />
        </root>
    </springProfile>
    <!--开发环境:打印控制台-->
    <springProfile name="dev">
        <root level="debug">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>
</configuration>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot 日志配置 的相关文章

随机推荐

  • 把照片改成指定像素基于PS(证件照修改为制定像素大小)

    下图所示的图片当前宽度为1064像素 高度为1972像素 右键图片打开 属性 对话框可查看尺寸 接下来我们想将图片尺寸改为宽度1000像素 高度1000像素 同时图片不能变形 操作步骤 1 打开PS软件 按Ctrl N组合键打开 新建文档
  • [译]Android 中 Kotlin 与 RecyclerView 高性能列表

    翻译说明 原标题 Kotlin RecyclerView for High Performance Lists in Android 原文地址 www andreasjakl com 原文作者 Andreas Jakl RecyclerVi
  • nginx 配置 http, https可以同时访问(报错: The plain HTTP request was sent to HTTPS port)

    Aphorism full stack 前言 最近微信项目升级 https 域名 购买好域名后 开放 443 端口后 http 访问竟然出错了 The plain HTTP request was sent to HTTPS port 导致
  • crypto-js 加密、解密使用方法,复制就能用

    一 安装crypto js npm install crypto js 二 封装加密方法 单独在js中封装一个js存放这个方法 后期使用再引入 import CryptoJS from crypto js let aesKeyInfo ke
  • algorithm头文件下的函数

    非修改性序列操作 12个 循环 对序列中的每个元素执行某操作 for each 查找 在序列中找出某个值的第一次出现的位置 find 在序列中找出符合某谓词的第一个元素 find if 在序列中找出一子序列的最后一次出现的位置 find e
  • anaconda

    卸载 直接删除 下载 ENTER anaconda3 和 conda 然后清除 bashrc 中conda相关的字段 安装 sudo Anaconda3 5 2 0 Linux x86 64 sh u u表示覆盖安装 中是默认值 询问过程要
  • proc文件系统探索 之 根目录下的文件[七]

    主要参考内核文档和红帽文档对 gt cat proc meminfo 读出的内核信息进行解释 下篇文章会简单对读出该信息的代码进行简单的分析 MemTotal 507480 kBMemFree 10800 kBBuffers 34728 k
  • 【C语言】课程设计实训——人事管理系统

    目录 题目 总体设计 详细设计 系统实现 题目 1 需求分析 人事档案信息采用文件存储 要提供文件的输入输出操作 根据学院人事的变动情况 可添加或删除记录 因而要提供文件的添加删除操作 能根据编号和姓名进档案查询 所提供文件的查找操作 可以
  • NC01--股票(一次交易)、合并k个有序链表、字符串的排列、接雨水问题、输出二叉树的右视图

    1 股票 一次交易 https www nowcoder com practice 64b4262d4e6d4f6181cd45446a5821ec tpId 117 tqId 37717 rp 1 ru activity oj qru t
  • 递归的基本运用与实践

    一 递归的概念 简单的说 递归就是方法自己调用自己 每次调用时传入不同的变量 递归有利于编程者解决复杂的问题 同时可以让代码变得简洁 二 递归调用机制 入门案例 累加代码实现 public static int accumulation i
  • 基于Java对STOMP服务端进行测试

    目录 一 目标 二 服务端改动 三 测试程序 3 1 依赖 3 1 用户量和消息数 3 2 测试端口是否可用 3 3 客户端连接 订阅测试 3 4 数据发布 断开连接测试 四 消费者会话处理程序 五 生产者会话处理程序 六 测试结果 一 目
  • B/S三层架构[转载]

    三层架构 3 tier application 通常意义上的三层架构就是将整个业务应用划分为 表现层 UI 业务逻辑层 BLL 数据访问层 DAL 区分层次的目的即为了 高内聚 低耦合 的思想 表现层 UI 通俗讲就是展现给用户的界面 即用
  • 多态的理解

    多态的概念 多态的概念 简单来讲 多态的意思就是多种形态 或者说 去完成某个行为 当不同的对象去完成时会产生出不同的状态 也可以理解为我们人去完成同一件事情 但是每一个人去完成 都会产生不一样的结果 多态构成的条件 1 必须通过父类的指针或
  • qt实现9×9数独游戏

    qt实现的数独小游戏 资源有可下载直接跑的exe enigma已经打包好 源码可私信 部分代码 include widget h include ui widget h include form h include
  • python中request请求库与BeautifulSoup解析库的用法

    python中request请求库与BeautifulSoup解析库的用法 request 安装 打开cmd窗口 检查python环境 需要python3 7版本及以上 然后输入 下载requests库 pip install reques
  • element中使用v-if指令导致表单出现自动验证的问题

    当使用了element中的表单验证的时候 需注意是否在同一个标签中使用了 v if的指令 当时使用了v if时 切换显示效果时 表单出现了自动验证 解决办法 使用v show代替 在页面元素不多的话使用v show代替即可解决表单自动验证的
  • VS2017 无法连接到Web服务器“IIS Express”终极解决方案

    VS2017 无法连接到Web服务器 IIS Express 终极解决方案 今天日了gou了 一大早打开VS2017的时候出现无法连接到Web服务器 IIS Express 的错误 然后必应了一下 再谷歌了一下找到的解决方法也都千篇一律 奈
  • 框架分析(4)-Spring

    框架分析 4 Spring 专栏介绍 Spring 核心特点 控制反转 IoC 面向切面编程 AOP 组件化 集成 简化开发 总结 优缺点 优点 高度可扩展 控制反转 IoC 面向切面编程 AOP 集成支持 轻量级 测试友好 社区活跃 缺点
  • props和state的区别

    区别 1 props是传递给组件的 类似于函数的形参 而state是在组件内部被组件自己管理的 类似于在一个函数内声明的变量 2 props是不可以被修改的 state是多变的 可被修改的 开发react组件 最常用到的两个引起组件渲染的可
  • springboot 日志配置

    logback xml与logback spring xml 配置文件的加载顺序 logback xml gt application properties gt logback spring xml 如果同时存在logback xml和l