使用springboot logback动态获取application的配置项
springboot logback动态获取application的配置项
在多环境的情况下,logback的日志路径需要进行针对性配置,也就是需要通过application.yml文件中进行配置。
logback自身支持以下方式配置
<property name="USER_HOME" value="/home/sebastien" />
但是怎样才能灵活的配置“/home/sebastien”参数呢,如果不同的环境此参数值不同,那么就需要通过application.yml文件的配置项进行指定。
但是logback.xml加载早于application.yml,如果直接通过${参数key}的形式获取是无法获取到对应参数值的。
因此只能使用spring提供的标签来对此参数进行配置
<springProperty scope="context" name="LOG_HOME" source="logback.file"/>
对照上面的配置,其中property替换成了springProperty标签。两个配置属性name效果是一样的,只不过后者的source指向了application.yml文件中的key。注意此处不需要${}形式获取。
springboot logback配置及动态配置log目录
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<contextName>xxx-server</contextName>
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<property name="pattern-color" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
<define name="LOG_HOME" class="com.youzu.dc.dcopsserver.config.LoggerConfig" />
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 控制台输出-带颜色 -->
<appender name="CONSOLE-WITH-COLOR" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern-color}</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/xxxx.%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE-WITH-COLOR"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
子节点一 appender
appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。
控制台输出appender
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
encoder表示输出格式,具体说明如下:
- %d表示时间
- %thread表示线程名
- %-5level 表示日志级别,允许以五个字符长度输出
- %logger{50}表示具体的日志输出者,比如类名,括号内表示长度
- %msg表示具体的日志消息,就是logger.info(“xxx”)中的xxx
- %n表示换行
文件输入appender
文件输出主要包括配置:以指定格式将日志输出到指定文件夹下的文件中,可以配置该文件的名称、最大大小、保存时间
例如:
<property name="LOG_HOME" value="logs"/>
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/all.%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
上述配置的主要内容是:以指定的格式向logs文件下的文件输出日志,文件名称格式被指定为logs/all.日期.索引号.log,日志文件最大大小为10MB,超出则创建新文件,日志文件保留三十天
索引从0开始递增
rollingPolicy指滚动粗略,具体配置如上。
关于日志文件大小限制也可以使用1GB配置。
root节点-启用配置
root节点实际上是配置启用哪种appender,可以添加多个appender。
比如:
<root level="INFO">
<appender-ref ref="CONSOLE-WITH-COLOR"/>
<appender-ref ref="FILE"/>
</root>
表示level为info级别,启用渲染器CONSOLE-WITH-COLOR和FILE。
按照这样配置,输出日志时,控制台会按照CONSOLE定义的格式输出,而日志文件会按照CONSOLE-WITH-COLOR的配置去输出。
动态配置log目录
import ch.qos.logback.core.PropertyDefinerBase
class LoggerConfig : PropertyDefinerBase() {
override fun getPropertyValue(): String {
return "${ServerConfig.applicationPath}/logs"
}
}
获取jar目录路径
fun getApplicationPath(): String {
val h = ApplicationHome(FileUtils::class.java)
return h.source.parentFile.toString()
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网.
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341