浅谈spring 后端项目配置logback日志

日志

Java boy 后端项目日志一般用 logback or Log4j & Log4j2,spring 默认集成logback,本文主要以logback 展开例子说明。
对于日志系统有什么样的需求?
1、本地环境需要打印Console日志。
2、测试环境最好实时打印日志。
3、生产环境打印日志不要阻塞系统(日志阻塞导致很多故障,特别是流量大的场景,小流量可以忽略)
4、可以实时修改,有些日志不关注,需要隔离一下。
5、分离日志…ERROR  ALL  not care…
… 等等信息。

日志需求分析

“小小”《环境》

现实开发场景中,很多都需要有环境的概念,redis 预发和生产 prefix key 不同.
test 环境和生产环境的调用的接口不同…  env=test env=prod 等等配置标识。

但是这些都不是非常的规范,在Spring Boot中,spring.profiles.active是一个非常重要的配置属性,它用于指定当前激活的配置文件(profiles)。通过这个属性,你可以控制应用程序在不同环境下的行为,例如开发、测试和生产环境。 SpringBoot激活profiles你知道几种方式?

  • application.properties
spring.profiles.active=dev
  • 系统参数
export SPRING_PROFILES_ACTIVE=dev
  • 命令行参数
java -jar your-application.jar --spring.profiles.active=prod

通过配置中心注入系统环境或者属性进行配置(放在公共配置,多应用统一使用),或者统一运维的部署脚本中指定,通过标准化的路径实现环境标准化,无需自定义。

环境隔离日志配置

这个是 logback-spring.xml 里面的配置
非生产、非预发、非测试 非开发环境打印console

springProfile 灵活的配置,可以让开发处理多环境的配置信息非常easy

 <springProfile name="!prod,!pre"><root level="INFO"><appender-ref ref="APPLICATION"/><appender-ref ref="FILE_ERROR"/><!--本地环境打印console 日志--><springProfile name="!test,!dev"><appender-ref ref="CONSOLE"/></springProfile></root></springProfile>

日志阻塞

之前见过很多系统由于日志阻塞导致系统功能受影响,响应耗时增加,这样的例子非常多。常见的场景的处理方式是配置为异步日志。 logback之 AsyncAppender 的原理、源码及避坑建议
在普通的日志RollingFileAppender 基础上包装一个异步日志 ,如下配置。

<appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/application.log</file><encoder><pattern>${PATTERN}</pattern></encoder><!-- 滚动策略 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 路径 --><fileNamePattern>logs/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>1GB</maxFileSize><maxHistory>30</maxHistory><totalSizeCap>10GB</totalSizeCap></rollingPolicy>
</appender>
<appender name="ASYNC_APPLICATION" class="ch.qos.logback.classic.AsyncAppender"><neverBlock>true</neverBlock><queueSize>5120</queueSize><discardingThreshold>20</discardingThreshold><includeCallerData>true</includeCallerData><appender-ref ref="APPLICATION"/>
</appender>

异步日志,由于打印日志是异步的,导致测试环境跟踪的时候查看日志非实时写文件的,用起来非常恼火,特别是调试的时候,测试环境是否可以非异步的?
通过上面介绍的spring环境隔离即可完成,如下配置。

   <!--    prod 和 pre 进行异步日志--><springProfile name="prod,pre"><appender name="ASYNC_APPLICATION" class="ch.qos.logback.classic.AsyncAppender"><neverBlock>true</neverBlock><queueSize>5120</queueSize><discardingThreshold>20</discardingThreshold><includeCallerData>true</includeCallerData><appender-ref ref="APPLICATION"/></appender><root level="INFO"><appender-ref ref="ASYNC_APPLICATION"/></root></springProfile><!--test 环境和本地 不进行异步日志--><springProfile name="!prod,!pre"><root level="INFO"><appender-ref ref="APPLICATION"/><!--本地环境打印console 日志--><springProfile name="!test,!dev"><appender-ref ref="CONSOLE"/></springProfile></root></springProfile>

怎么判断异步日志是否配置OK? debug ?arthas 也行?
查看一下异步日志的实例是否存在

[arthas@34932]$ vmtool -x  1 --action getInstances --className ch.qos.logback.classic.AsyncAppender  --limit 5
@AsyncAppender[][@AsyncAppender[ch.qos.logback.classic.AsyncAppender[ASYNC_LOG_FILE_OKHTTP]],@AsyncAppender[ch.qos.logback.classic.AsyncAppender[ASYNC_LOG_FILE_MIDDLEWARE]],@AsyncAppender[ch.qos.logback.classic.AsyncAppender[ASYNC_ERROR]],@AsyncAppender[ch.qos.logback.classic.AsyncAppender[ASYNC_APPLICATION]],
]

logback 配置文件不推荐放在配置中心

配置文件和源码放在一起,通过环境变量区分不同环境的处理方式比较好,方便修改
某些场景需要隐藏某些日志,放在配置中心非常不方便,修改起来也非常麻烦,修改错误了也不知道,只有发布的时候才能感知。
eg: kafka的日志不要放在all 日志里面,需要在线日志系统订阅关键的业务日志信息,减少费用。

<logger name="org.apache.kafka" level="INFO" additivity="false"><appender-ref ref="LOG_FILE_MIDDLEWARE"/>
</logger>

eg: 我要禁用日志 ,这种想法可能跟随者业务需求进行变化。

 <logger name="org.redisson.connection.DNSMonitor" level="OFF"/>

分离日志

  • additivity=“false”  不加入总日志信息
  • error 日志分离
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/application_error.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>${PATTERN}</pattern></encoder><!-- 滚动策略 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 路径 --><fileNamePattern>logs/application_error.%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>1GB</maxFileSize><maxHistory>3</maxHistory><totalSizeCap>3GB</totalSizeCap></rollingPolicy>
</appender>

总结

日志系统平常开发过程中经常遇到,日志打印刷屏、日志太多、日志治理等发生在日常的开发过程中,养成一个好的习惯,好的日志更快速的排查到问题。
线上环境error日志重点关注,前提是error日志要少,如果一个error一天几百个G,会有人看?

附上完整日志配置

<?xml version="1.0" encoding="UTF-8" ?>
<configuration><include resource="org/springframework/boot/logging/logback/defaults.xml"/><property name="PATTERN"value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}]  %X{method} %-5level [%thread] [%logger:%line] :%m %n"/><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!-- 采用Spring boot中默认的控制台彩色日志输出模板 --><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern></encoder></appender><appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/application.log</file><encoder><pattern>${PATTERN}</pattern></encoder><!-- 滚动策略 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 路径 --><fileNamePattern>logs/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>1GB</maxFileSize><maxHistory>30</maxHistory><totalSizeCap>10GB</totalSizeCap></rollingPolicy></appender><appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/application_error.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>${PATTERN}</pattern></encoder><!-- 滚动策略 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 路径 --><fileNamePattern>logs/application_error.%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>1GB</maxFileSize><maxHistory>3</maxHistory><totalSizeCap>3GB</totalSizeCap></rollingPolicy></appender><appender name="LOG_FILE_OKHTTP" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false"><file>logs/application_okhttp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>logs/application_okhttp.%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>1GB</maxFileSize><maxHistory>2</maxHistory><totalSizeCap>2GB</totalSizeCap></rollingPolicy><!-- 格式化输出 --><encoder><pattern>${PATTERN}</pattern><charset>UTF-8</charset></encoder></appender><appender name="LOG_FILE_MIDDLEWARE" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false"><immediateFlush>false</immediateFlush><file>logs/application_middleware_client.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>logs/application_middleware_client.%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>1GB</maxFileSize><maxHistory>2</maxHistory><totalSizeCap>2GB</totalSizeCap></rollingPolicy><!-- 格式化输出 --><encoder><pattern>${PATTERN}</pattern><charset>UTF-8</charset></encoder></appender><logger name="okhttp3.OkHttpClient" level="INFO" additivity="false"><appender-ref ref="LOG_FILE_OKHTTP"/></logger><logger name="org.apache.kafka" level="INFO" additivity="false"><appender-ref ref="LOG_FILE_MIDDLEWARE"/></logger><logger name="org.apache.zookeeper" level="INFO" additivity="false"><appender-ref ref="LOG_FILE_MIDDLEWARE"/></logger><logger name="org.apache.curator" level="INFO" additivity="false"><appender-ref ref="LOG_FILE_MIDDLEWARE"/></logger><!--    prod 和 pre 进行异步日志--><springProfile name="prod,pre"><appender name="ASYNC_APPLICATION" class="ch.qos.logback.classic.AsyncAppender"><neverBlock>true</neverBlock><queueSize>5120</queueSize><discardingThreshold>20</discardingThreshold><includeCallerData>true</includeCallerData><appender-ref ref="APPLICATION"/></appender><appender name="ASYNC_ERROR" class="ch.qos.logback.classic.AsyncAppender"><neverBlock>true</neverBlock><queueSize>5120</queueSize><discardingThreshold>20</discardingThreshold><includeCallerData>true</includeCallerData><appender-ref ref="FILE_ERROR"/></appender><appender name="ASYNC_LOG_FILE_MIDDLEWARE" class="ch.qos.logback.classic.AsyncAppender"><neverBlock>true</neverBlock><queueSize>1024</queueSize><discardingThreshold>20</discardingThreshold><includeCallerData>false</includeCallerData><appender-ref ref="LOG_FILE_MIDDLEWARE"/></appender><appender name="ASYNC_LOG_FILE_OKHTTP" class="ch.qos.logback.classic.AsyncAppender"><queueSize>1024</queueSize><discardingThreshold>20</discardingThreshold><neverBlock>true</neverBlock><includeCallerData>false</includeCallerData><appender-ref ref="LOG_FILE_OKHTTP"/></appender><root level="INFO"><appender-ref ref="ASYNC_APPLICATION"/><appender-ref ref="ASYNC_ERROR"/></root></springProfile><!--test 环境和本地 不进行异步日志--><springProfile name="!prod,!pre"><root level="INFO"><appender-ref ref="APPLICATION"/><appender-ref ref="FILE_ERROR"/><!--本地环境打印console 日志--><springProfile name="!test,!dev"><appender-ref ref="CONSOLE"/></springProfile></root></springProfile><!-- 日志通过系统环境变量配置spring active: export SPRING_PROFILES_ACTIVE=devhttps://blog.csdn.net/weixin_42033269/article/details/102805546 --></configuration>

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

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

相关文章

全国职业院校技能大赛(大数据赛项)-平台搭建Spark、Scala笔记

Spark作为一个开源的分布式计算框架拥有高效的数据处理能力、丰富的生态系统、多语言支持以及广泛的行业应用。Scala是一种静态类型的编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性&#xff0c;被誉为通用的“大数据语言”。而二者的结合更能迸发出新奇的化学反…

Dify创建自定义工具,调用ASP.NET Core WebAPI时的注意事项(出现错误:Reached maximum retries (3) for URL ...)

1、要配置Swagger using Microsoft.AspNetCore.Mvc; using Microsoft.OpenApi.Models;var builder WebApplication.CreateBuilder(args);builder.Services.AddCors(options > {options.AddPolicy("AllowSpecificOrigin",builder > builder.WithOrigins("…

Transformers | 在自己的电脑上开启预训练大模型使用之旅!

本文内容主要包括两部分&#xff1a; Hugging Face 社区介绍 如何使用 Transformers 库的模型 1. Hugging Face 社区介绍 Hugging Face (https://huggingface.co/) 是一个 Hub 社区&#xff0c;它和 GitHub 相同的是&#xff0c;他们都是基于 Git 进行版本控制的存储库社区&…

SRS流媒体服务器在宝塔面板下的安装

目录 一、安装 1、安装Docker 2、安装srs 二、测试 1、进入后台 2、推流 3、播放测试: (1)网页 (2)拉流 之前一篇文章,我们介绍了SRS流媒体服务器在CentOS下的安装,安装流程还是比较麻烦且耗时的,其实SRS支持Docker部署,今天我们介绍在宝塔面板的Docker中部署…

【C++篇】~类和对象(中)

类和对象&#xff08;中&#xff09; 1.类的默认成员函数​ 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前…

深入探索PostgreSQL优化器的代价模型(建议收藏)

PawSQL优化引擎的实现深受PostgreSQL优化器的影响&#xff0c;本文我们来揭密PostgreSQL的代价模型。PawSQL专注于数据库性能优化自动化和智能化&#xff0c;提供的解决方案覆盖SQL开发、测试、运维的整个流程&#xff0c;广泛支持MySQL、PostgreSQL、OpenGauss、Oracle等主流商…

数据脱敏-快速使用

1.数据脱敏定义 数据脱敏百度百科中是这样定义的&#xff1a; 数据脱敏&#xff0c;指对某些敏感信息通过脱敏规则进行数据的变形&#xff0c;实现敏感隐私数据的可靠保护。 因为在真正的生产环境中,很多数据是不能直接返回,但是我们工作的时候可能经常性的需要返回一些用户信…

历年大厂校招 网络安全面试题(80+经验贴)

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

为什么要使用多线程

为什么要使用多线程 任务分解&#xff1a;耗时的操作&#xff0c;任务分解&#xff0c;实时响应。数据分解&#xff1a;充分利用多核CPU处理数据。数据流分解&#xff1a;读写分离&#xff0c;解耦合设计。 #include <iostream> #include<thread> using namespac…

【Unity编辑器扩展】解决uGUI动效痛点 零代码可视化快速制作UI动效 DOTween Sequence可视化

UI动效痛点&#xff1a; UI动效一直是Unity游戏开发的一大痛点&#xff0c;大部分项目都在使用Animator/Animation制作UI动效。而Animation是以节点路径记录动画&#xff0c;一旦UI层级、节点名变更就会导致动效返工&#xff0c;且Animation编辑器缓动曲线很难控制&#xff0c…

【论文速看】DL最新进展20240923-长尾综述、人脸防伪、图像分割

目录 【长尾学习】【人脸防伪】【图像分割】 【长尾学习】 [2024综述] A Systematic Review on Long-Tailed Learning 论文链接&#xff1a;https://arxiv.org/pdf/2408.00483 长尾数据是一种特殊类型的多类不平衡数据&#xff0c;其中包含大量少数/尾部类别&#xff0c;这些类…

C:内存函数

目录 前言&#xff1a; 一、memcpy 函数的使用及实现 1、memcpy函数的介绍 1.1 memcpy函数参数解读 2、memcpy函数的使用 3、memcpy函数的模拟实现 二、memmove函数的使用及模拟 1、memmove函数的使用 2、memmove函数的模拟实现 三、memset 函数的使用 1、memset函数的…

PyCharm下载和安装教程

Python、C/C、C#、DSL、Go、Groovy、Java、JavaScript、Objective-C、PHP 等编程语言。 图 1 JetBrains 开发工具 PyCharm下载和安装 进入 PyCharm官方下载页面(如图 2 所示)&#xff0c;可以看到 PyCharm 有 2 个版本&#xff0c;分别是 Professional(专业版)和 Community(社…

Mybatis百万数据插入(含导出)

1 一般一次性插入多条数据 传统的sql语句&#xff1a; INSERT INTO table1 ( field1, field2 ) VALUES( "data1", "data2" ); INSERT INTO table1 ( field1, field2 ) VALUES( "data1", "data2" ); INSERT INTO table1 ( field1, fi…

DirectX修复助手

在日常使用电脑时&#xff0c;我们可能会遇到提示缺少DLL文件&#xff0c;如0xc000007b错误、缺少d3dxxx.dll等问题&#xff0c;这些会影响软件运行甚至导致系统不稳定。以下是一些常见的DLL问题原因和一个修复工具&#xff0c;希望能帮到你。 DLL文件问题的常见原因 软件安装…

20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示&#xff0c;设置电流阈值为80&#xff0c;电流小阈值为50&#xff0c;电压阈值为60&#xff0c;温度阈值…

24. Revit API: 几何对象(五)- (Sur)Face

一、前言 虽然Face是GeometryObject的子类&#xff0c;Surface不是&#xff0c;但这两者之间还是挺有关联的&#xff0c;每个Face都有一个对应的Surface&#xff0c;类似于Edge和Curve的关系。 Surface是数学意义上的面&#xff0c;纯定义。 Face是几何形状&#xff08;实体&a…

css如何设置间距

在CSS中设置间距是非常常见的需求&#xff0c;可以通过多种属性来实现。以下是一些常用的CSS属性及其用法&#xff0c;用于设置元素之间的间距&#xff1a; 内边距&#xff08;Padding&#xff09; padding 属性用于设置元素内容与元素边框之间的距离。可以分别设置四个方向的…

视频质量评价SimpleVQA

目录 一、研究意义 例子 二、介绍 三、文章解读 3.1 论文动机 3.2论文思路 3.3方法 3.3.1网络框架 3.3.2公式解读 3.3.3核心创新 3.3.4理解 &#xff01;&#xff01;&#xff01;作者对模型的改进 本人算法框体 3.3.5实验细节&#xff1a; 四、代码复现 4.1代码文件简介 4.2数…

leetcode第二十六题:删去有序数组的重复项

给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你…