Spring boot+ logback环境下,日志存放路径未定义的问题
日志路径未定义
- 环境:Spring boot + logback
- 配置文件:
<configuration>
<springProfile name="dev">
<property name="LOGHOME" value="/logdir/dir"></property>
</springProfile>
<appender name="syslog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOGHOME}/sys.log
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:SSS} %p [%thread] (%file:%line)- %m%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender> - 问题:
- 描述:微服务项目启动时,项目src同级目录下会新建一个以日志路径变量名为命名的文件夹。例如上面File标签中的<File>LOG_HOME。
- 原因:logback先于Spring boot初始化(可以打开logback的debug查看项目初始化日志),logback初始化时会去查找LOG_HOME变量的值,但是上面的配置<springProfile>标签已经决定了该LOG_HOME的值由Spring来解析,所以先行初始化的logback找不到该变量的值,导致出现上面描述的情况。
- 补充:虽然logback在项目刚刚启动时,没有找到LOG_HOME的值,但是当Spring Boot初始化到文件解析出LOG_HOME的值时,LOG_HOME的值不再是IS_UNDEFINED的了,而是上面定义的我们想要的路径。
- 分析:据stackoverflow上的大神,logback不支持文件的懒加载(其实这个问题想都不用想,spring boot都开始加载了,logback怎么能不先初始化?)。我们这里的问题其实是因为动态改变导致的:开发在windows环境,部署在Linux环境,这就要求开发和生产环境的日志不在相同的路径,但是如果不依赖Java代码,logback是无法在xml文件中动态解析变量值的。
- 解决方案:
- 方案1:实现logback的接口,从文件中动态加载变量值,比如我们的application.yml文件里的环境属性dev、prod,以这些值为条件为logback的context添加变量LOG_HOME,及对应的值。这种方案,要新增logback相关代码,并且要在spring boot加载前执行,非常不好!
- 方案2:添加额外的jar包,在xml文件中进行条件判断。这种方案太麻烦了,xml文件新增好几倍。
- 方案3:在上面的文件中新增一个 <property name="LOG_HOME" value = "logdir">属性,作为logback初始化时LOG_HOME变量的默认值。这个默认值推荐采用部署服务器上的路径。这种方案最简单,成本最低:没有方案1的代码污染,没有方案2的jar包引入和一大堆xml标签。【最佳实践】
Spring boot+ logback环境下,日志存放路径未定义的问题的更多相关文章
- Spring Boot Logback几种日志详解
日志对于应用程序来说是非常重要的,Spring框架本身集成了不少其他工具,我们自身的应用也会使用到第三方库,所以我们推荐在Spring应用中使用SLF4J/Logback来记录日志. SLF4J与Lo ...
- Spring Boot Logback日志配置
logback的使用: Logback的默认配置 如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurat ...
- Spring Boot Logback应用日志
e Spring Boot Logback应用日志 2015-09-08 19:57 7673人阅读 评论(0) 收藏 举报 . 分类: Spring Boot(51) . 目录(?)[+] 日志对于 ...
- Spring Boot系列一:默认日志logback配置解析
前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...
- Spring Boot - Logback配置日志要考虑哪些因素
Spring Boot - Logback配置日志 出于性能等原因,Logback 目前是springboot应用日志的标配: 当然有时候在生产环境中也会考虑和三方中间件采用统一处理方式.@pdai ...
- Spring boot——logback 基础使用篇(一)
1 简单日志配置 spring boot内部使用Commons Logging来记录日志,但也保留外部接口可以让一些日志框架来进行实现,例如Java Util Logging,Log4J2还有Logb ...
- Spring Boot logback
前言 今天来介绍下spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...
- Spring Boot 学习摘要--关于日志框架
date: 2020-01-05 16:20:00 updated: 2020-01-08 15:50:00 Spring Boot 学习摘要--关于日志框架 学习教程来自:B站 尚硅谷 1. 关于日 ...
- hadoop之 hadoop日志存放路径
环境:[root@hadp-master hadoop-2.7.4]# hadoop versionHadoop 2.7.4 Hadoop的日志大致可以分为两类: (1).Hadoop系统服务输出的日 ...
随机推荐
- 5.01-requests_auth
import requests # 发送post请求 data = { } response = requests.post(url, data=data) # 内网 需要 认证 auth = (us ...
- 2.02-request_header_two
import urllib.request def load_baidu(): url= "http://www.baidu.com" #添加请求头的信息 #创建请求对象 requ ...
- YYModel HandyJson
数学基础: 以类型集合空间为基础,多阶向量结构间的同构映射: 若两个数学结构之间存在同构映射,那么这两个结构叫做是同构的. 基于集合空间的映射: 原理: 1.根据类型名称获得类型的元信息: 2.根据映 ...
- Python:Day17 生成器、time和random模块
列表生成式: a = [x*2 for x in range(10)] #这是最简单的列表生成式,range换成其它的序列也OK a = [f(x) for x in range(10)] #将里将前 ...
- masm的调试命令(debug)
-u命令:查看汇编代码: -t命令:执行下一条语句 -g + 的内存:跳转到该内存所对应的语句(再用t命令执行该条命令) -r命令:查看寄存器的内容(后可直接接寄存器的名称,就只查看该寄存器的内容) ...
- 002_浅析python 中__name__ = '__main__' 的作用
很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...
- 微信硬件平台(一) 公众号 ESP8266 Arduino LED
微信硬件平台 本文目的,使用微信公众号控制ESP8266的LED开和关.进一步使用微信当遥控器(避免写APP或者IOS或者小程序),控制一切设备.给两个关键的总教程参考. 官网教程 微信硬件平台 微 ...
- ActiveMQ的queue以及topic两种消息处理机制分析
1 queue与topic的技术特点对比 对比项 Topic Queue 概要 Publish Subscribe messaging 发布订阅消息 Point-to-Point 点对点 有无状 ...
- tar只解压tar包中某个文件
如果tar包很大,而只想解压出其中某个文件.方法如下: 只想解压出Redis-1.972.tar 中的Changes文件,来查看有哪些更改. [root@uplooking]# tar -tf Re ...
- bzoj2721 [Violet5]樱花
bzoj2721 [Violet 5]樱花 给出 \(n\) 求 \(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\) 的正整数解数量 \(\bmod (10^9+7)\) ...