Tomcat Access Logs in Spring Boot for different operating systems

Tomcat Access Logs in Spring Boot for different operating systems

最近我开始使用 Spring Boot 并有以下问题:

我们有不同的环境(如舞台、开发、生产),所有这些都可以在 windows 或 linux 上 运行。 所以我创建了 application-stage.properties、application-prod.properties、application-devl.properties 来指定数据库连接等内容,因为它 OS 不可知(与 windows 和 linux).

现在我想为嵌入式 Tomcat 服务器启用访问日志。 因此,根据各种指南,我在 application.properties 文件中使用了以下内容:

server.tomcat.accesslog.directory=logs
server.tomcat.accesslog.enabled=true

我被迫指定一个相对路径,因为我们同时使用 linux 和 windows,但是我希望根据 OS 在不同的地方创建访问日志. 例如,我们将日志存储在 c:\<product>\logs 下的 windows 中,而在 linux 中我们使用 /var/log/<product>/...

对于通常的日志,我们使用 logbacks 并且它允许这样的事情,但是由于访问日志实际上不是 logback 驱动的而是使用 Valves,我的问题是: 我们如何才能在这里实现相同级别的灵活性?

我认为我不应该为此提供额外的配置文件并像这样使用它:

--spring.profiles.active=windows / linux

因为我相信 spring boot 对此有一些解决方案:) 非常感谢

我最喜欢的解决方案是在 Tomcat 中使用额外的类路径并从那里加载特定于环境的属性。
IE。 Tomcat 的 'common.loader' 属性 在 conf/catalina.properties

此外,我通常将默认属性保留在 .war 文件中,这样您将只指定环境特定的差异。

如果相对路径不好,您将不得不执行某种特定于环境的操作。从 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html 开始,您可以使用配置文件,也可以使用环境变量或系统 属性。正如另一个答案所说,如果这对您来说最有意义,您可以从环境特定文件加载属性。

这是我想出的解决方案。也许它会对某人有所帮助。

有 2 个步骤。

步骤 1 我在 src/main/resources 中创建了 application-windows.propertiesapplication-linux.properties 文件。这些文件包含 OS 依赖配置。

例如在Linux中我指定了这样的东西:

server.tomcat.accesslog.directory=/var/log/access_logs 

对于windows可以是(例如):

server.tomcat.accesslog.directory=C:\Temp\access_logs 

步骤 2

spring 引导应用程序(带有 main 方法的文件)通常如下所示:

// maybe some additional annotations
@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) throws Exception {
       SpringApplication.run(..., args); 
    }
}

第 25.2 段中 spring 引导的 documentation 声明可以通过编程方式添加配置文件 所以我稍微改变了主要的 class 以允许这个编程添加:

// maybe some additional annotations
@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) throws Exception {
       SpringApplication myApp = new SpringApplication(...);
       myApp.setAdditionalProfiles(getOSName());
       myApp.run(args); 
    }

    private static String getOSName() {
     String os = System.getProperty("os.name");
     if (os.toLowerCase().contains("win")) {
         return "windows";      
     }
     else {
          return "linux";
     }
    }
}

就是这样,现在不需要在 --spring.profiles.active 属性 中指定配置文件了(我通常用这个来指定环境,如暂存、生产等。 spring 现在会自动加载相关的 属性 文件。

感谢所有提出解决方案的人!