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.properties
和 application-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 现在会自动加载相关的 属性 文件。
感谢所有提出解决方案的人!
最近我开始使用 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.properties
和 application-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 现在会自动加载相关的 属性 文件。
感谢所有提出解决方案的人!