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系统服务输出的日 ...
随机推荐
- redis学习笔记(一)-安装
检查是否有redis yum 源 yum install redis 下载fedora的epel仓库 yum install epel-release 安装redis数据库 yum install r ...
- [tool] Visual Studio Code python配置
语言设置 安装中文插件即可成为中文 选择一个Python解释器 Python是一种解释型语言,为了运行Python代码并获取Python IntelliSense,您必须告诉VS Code使用哪个解释 ...
- 004_后端js编写工具
一.框架同事用的后端调试用的工具 google=>"webpack dev server" https://webpack.github.io/docs/webpack-de ...
- 多线程爬虫爬取详情页HTML
注意:如果想爬取详情页的信息请按须添加方法 import requests import os import re import threading from lxml import etree #爬 ...
- Java多线程(四)—— synchronized关键字续
1.synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,sy ...
- day93
虚拟机安装Liunx以及Xshell链接 首先安装VMware虚拟机软件 安装完成后打开会显示 选择创建新的虚拟机 我们选择自定义 来到一个选择虚拟机兼容性 下一步安装客户端操作系统这里我们先选择稍后 ...
- Scripts may close only the windows that were opened by it
关闭当前窗体报以下js错误: Scripts may close only the windows that were opened by it (脚本只能关闭由它打开的窗口) 使用场景,在js中关闭 ...
- 在.NET Framework中慎用DirectoryInfo.GetFiles方法
.NET Framework中的DirectoryInfo.GetFiles方法,可以在一个文件夹下通过通配符找出符合条件的文件. 我们首先在文件夹C:\DemoFolder下定义两个文件:demo. ...
- AbstractQueuedSynchronizer
1 简介 AbstractQueuedSynchronizer简称AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器.JDK1.5中提供的java.util.concurrent包中的大多数的 ...
- mybatis-plus学习笔记(一)
一.概述 概述见官网,不再赘述(简称mytatis-plus为MP) 在mybatis的基础之上,重点关注新特性:https://mp.baomidou.com/guide/#%E7%89%B9%E6 ...