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系统服务输出的日 ...
随机推荐
- LDAP安装配置(windows)
目录 概述 测试环境 安装过程 配置启动 客户端介绍 多级DC的ldif文件的配置 [一].概述 什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台 ...
- 第二十六篇:USB3.0高带宽ISO(48KBytes/125us)实战
USB3.1技术已经推出, 10Gbps的速率足以满足数据, HD视频传输的要求. 要步入USB3.1的研发, 还得将USB3.0的基础打扎实. 微软提供的SUPER MUTT仅仅包括一个接口0, 其 ...
- java递归删除文件夹
递归删除文件夹 public static void delete(File file) { if(!file.exists()){ return; } if(file.isFile() || fil ...
- 【转】curl命令总结,Http Post_Get 常用
curl命令总结 curl 是一个利用URL语法在命令行方式下工作的文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE ...
- ssm框架的整合搭建(一)
一个转行菜鸟半年多工作的开始学习历程............ 我是自学,也是我的记录,我学习的见证,如果你有幸看见,不要吐槽,不足之处请指点,相互学习,谢谢!! 请一起共勉!!!!!!!! 使用技术: ...
- Vim 中使用 vimim 来输入中文
Vim 中输入中文,要来回切换中英文,偶尔不慎的切换和按键,可能导致误删不能恢复的错误,一直是个很头疼的问题.现在有了 vimim 这个插件,整个世界清净了. 插件官方网站:http://www.vi ...
- 异常:NoNodeAvailableException
现象 1.启动时候出现 node null not part of the cluster Cluster [********], ignoring... 2.启动时正常,但是请求时出现 NoNode ...
- Docker安装MySQL并配置远程访问
1.docker search mysql 查看mysql版本 2.docker pull mysql 要选择starts最高的那个name 进行下载 3.docker images 查看下载好的镜像 ...
- Java NIO4:缓冲区Buffer(续)
一.什么是缓冲区 一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索.缓冲区像前篇文章讨论的那样被写满和释放,对于每个非布尔原始数据 ...
- Python学到什么程度才可以去找工作?掌握这4点足够了!
大家在学习Python的时候,有人会问"Python要学到什么程度才能出去找工作",对于在Python培训机构学习Python的同学来说这都不是问题,因为按照Python课程大纲来 ...