最近在别人基础上写代码,但是发现一个框架中写了好多日志输出的配置文件,比如logback-dev.xml,logback-beta.xml,logback-prod.xml,其实总结起来就是 除了日志输出目录不同外,其余的全部相同。于是呼我就开始了优化。思想如下:
1.springboot项目默认便是logback日志框架,默认配置文件是logback-spring.xml【优点:该名称日志文件,是默认加载的,不用配置logging.config属性,且加载顺序是在属性配置文件之后加载,也就是说,logback-spring.xml 可以读取到 application.yml文件中的属性】
2.所有日志配置文件用logback-spring.xml文件接受,日志输出目录作为变量传入即可。
然,所有的成功绝非一蹴而就,启动的时候总是在当前目录的根目录下自动生成一个目录:LOG_PATH_IS_UNDEFINED
以前玩那么多遍了,今天却栽了跟头,虽然不影响功能,但是“莫名其妙”多增加了一个日志目录心里还是不舒服的。凭着一股子牛劲,研究吧。
1.新搭建一个干净的框架,发现功能好使,没有额外目录生成。--》结论:maven不知引用了某个依赖,所以导致日志配置文件加载顺序在属性文件之前启动了。
2.回想最近新增的依赖,开始逐个删除,并反复测试日志输出,最后在移除spring-cloud-starter-netflix-eureka-client依赖时,日志输出正常。--》结论:eureka影响了logback-spring日志文件
3.向度娘请教,最后发现springcloud优先加载bootstrap.properties/bootstrap.yml,因为我没有该配置文件,找不到我定义的日志输出目录参数,所以日志配置文件先生成了默认的日志目录以及 默认文件。
4.思考:为什么没有bootstrap.yml文件时,会生成一个默认LOG_PATH_IS_UNDEFINED,而其后还会生成我指定的日志输出目录和文件呢?我理解的是不会再生成我指定的目录了
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_PATH}/${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<cleanHistoryOnStart>${LOG_FILE_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
<fileNamePattern>${LOG_PATH}/${ROLLING_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-7}</maxHistory>
<totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP:-0}</totalSizeCap>
</rollingPolicy>
</appender>
<logger name="org.springframework" level="error" additivity="false"/>
<logger name="org.hibernate" level="error" additivity="false"/>
<logger name="com.mchange" level="error" additivity="false"/>
<logger name="org.apache" level="error" additivity="false"/>
<logger name="net.sf" level="error" additivity="false"/>
<springProfile name="dev | test">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
</configuration>
logging.
path: /usr/logs
file: test.log
最近在别人基础上写代码,但是发现一个框架中写了好多日志输出的配置文件,比如logback-dev.xml,logback-beta.xml,logback-prod.xml,其实总结起来就是 除了日志输出目录不同外,其余的全部相同。于是呼我就开始了优化。思想如下:1.springboot项目默认便是logback日志框架,默认配置文件是logback-spring.xml【优点:该名称日志文件,是默认加载的,不用配置logging.config属性,且加载顺序是在属性配置文件之后加载,也就是说,logb
springboot
logback
的源码分析请参考这篇,讲的很好:https://juejin.im/post/5cd0cdcc6fb9a0323120a3f4
一、日志常规配置
直接贴出
logback
-
spring
.xml,基本满足了对日志的常规需求:
1、控制台日志(带颜色显示)
2、全部日志文件(包括全别日志级别的日志,每天一个,自动压缩)
3、错误日志文件(仅抽取ERROR级别日志,每天一个,自动压缩)
a. 日志存放目录需要在application.yml中配置:logging.
springboot
本身集成了
logback
,所以无需引入依赖;
在resources下建立
logback
.xml文件,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" sc...
对于不使用
Spring
Cloud Context 的
Spring
Cloud 程序,最好把
Spring
Cloud Context 禁用掉,因为如果不禁用的话会导致某些配置
加载
出错。禁用方法:
在
SpringBoot
主函数加上 System.setProperty("
spring
.cloud.bootstrap.enabled", "false"); 这句代码,示例如下:
最近在项目中对服务器磁盘读写性能做了一个测试,发现服务器性能实在太差了,写入速度一般在13-15M/s的范围,速度太小了
因为这个是新项目来的,想着提高服务性能,减少磁盘io,因此,准备对项目日志进行改造,改为异步写入磁盘
基于
springcloud
alibaba,版本如下:
<
spring
-boot.version>2.2.10.RELEASE</
spring
-boot.version>
<
spring
-cloud.versio
1、首先在bootstrap.yml文件添加如下配置:
logging.config: classpath:
logback
-
spring
.xml //配置各个环境使用的log配置文件
logback
.path: /home/work/logs //配置相应的环境log打印路径
2、不同环境动态配置日志路径和级别
动态配置日志打印路径:使用
spring
Property属性,source配置对应的yml文件的配置
<
spring
Property scope="context" na
原来的日志在服务器上采用的是cronolog组件按天分割的日志,没什么大问题,因为本地也就控制台看下;到服务端才需要正在的日志文件来核查问题。但是介于
spring
本来自带不用,用第三方的插件太麻烦(测试嫌麻烦)。所以优化源代码采用
logback
-
spring
.xml的配置来打日志。
直接上代码:
对应pom
<dependency>
<!-- logbac......