春季启动的 logging.config 配置

Posted

技术标签:

【中文标题】春季启动的 logging.config 配置【英文标题】:logging.config configuration for spring boot 【发布时间】:2015-09-19 06:54:58 【问题描述】:

我想在我的 Spring Boot 应用程序中配置 log4j.xml 文件的位置。 为此,我已将 logging.config 属性添加到我的 application.properties 配置中,指示 log4j.xml 文件路径。 但似乎这个属性被忽略了。 但它应该根据 Spring Boot 文档工作:

logging.config= # location of config file (default classpath:logback.xml for logback)

我是不是做错了什么?

【问题讨论】:

logging.config 的房产价值是多少? 这是我的 logback.xml 的完整路径。 【参考方案1】:

Spring Boot 包含一些启动器,如果您想排除或交换特定的技术方面,可以使用这些启动器。它默认使用logback,如果你要使用log4j,请在你的类路径中添加spring-boot-starter-log4j。例如,使用 maven 会是这样的:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <version>1.2.4.RELEASE</version>
</dependency>

对于 log4j 1.x:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
            <version>1.2.4.RELEASE</version>
</dependency>

然后将logging.config 添加到您的application.properties

logging.config = classpath:path/to/log4j.xml

【讨论】:

【参考方案2】:

我发现在某些情况下,外部日志配置(logback.xml)不会被忽略:当应用程序从应用程序文件夹启动时,它可以正常工作。 关于这一点的一些澄清:应用程序是通过脚本运行的,可以从任何地方调用。 我还没有深入了解它为什么以这种方式工作,但是如果我在启动期间提供配置文件路径作为参数,它就会工作。所以我们只需将此参数添加到运行脚本中: --spring.config.location=/configPath/application.properties 可能这个问题是由 Spring 加载阶段引起的。 如果您知道这个问题的根本原因是什么,请分享:)

【讨论】:

【参考方案3】:

根据spring boot docs:

如果您使用 starter pom 来组装依赖项,这意味着您必须排除 Logback,然后包含您选择的 Log4j 版本。

像这样:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

【讨论】:

【参考方案4】:

我花了几天时间来了解这是否应该有效,我对此表示怀疑。尽管文档中明确提到了如何使用Custom Log Configuration,但有些人将其视为differently。关于此属性的许多问题在 spring github 问题跟踪器上到处都不起作用,例如 this 和 this。另一个有效点是,必须尽可能早地完成日志配置,以正确记录应用程序初始化。 因此系统属性在这里看起来是最精明的选项。您可以将其保存在您的应用程序代码中。唯一的要求是在 spring 上下文初始化之前设置它。

@SpringBootApplication
public class Application extends SpringBootServletInitializer 

    public static void main(String[] args) 
        // to start from command line
        System.setProperty("logging.config", "classpath:portal-log4j2.yaml");
        SpringApplication.run(Application.class, args);
    

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException 
        // to start within container
        System.setProperty("logging.config", "classpath:portal-log4j2.yaml");
        // this has SpringApplication::run() inside
        super.onStartup(servletContext);
    

因为 Tomcat Web 容器中的所有应用程序都加载在同一个 JVM 中,所以处理自定义 logging.config 没有任何意义,而是对整个容器使用默认文件名的单个配置。

【讨论】:

以上是关于春季启动的 logging.config 配置的主要内容,如果未能解决你的问题,请参考以下文章

转 使用Python的logging.config.fileConfig配置日志

springboot 中 logging.config 的 logback默认配置文件地址

python logging模块配置方法浅析

logging.config.fileConfig不产生日志

春季启动MongoDB配置

Spring Boot使用外部配置文件启动