Tomcat Access在Spring Boot中记录不同的操作系统

时间:2017-07-08 09:49:45

标签: java spring spring-boot access-log

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

我们有不同的环境(如舞台,开发,制作),所有这些环境都可以在Windows或Linux上运行。 所以我创建了application-stage.properties,application-prod.properties,application-devl.properties来指定数据库连接之类的内容,因为它与操作系统无关(对于windows和linux来说都是一样)。

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

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

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

对于通常的日志,我们使用logbacks并且它允许这样的东西,但由于访问日志实际上不是由logback驱动而是使用Valves,我的问题是: 我们如何实现相同的目标这里的灵活程度如何?

我认为我不应该为此提供额外的个人资料,并将其用作:

--spring.profiles.active=windows / linux

因为我相信春季靴子的袖子有一些解决方案:) 非常感谢提前

3 个答案:

答案 0 :(得分:2)

这是我提出的解决方案。也许它会帮助别人。

有两个步骤。

第1步 我在application-windows.properties中创建了application-linux.propertiessrc/main/resources个文件。这些文件包含与操作系统相关的配置。

例如在Linux中我指定了这样的内容:

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

对于Windows,它可以是(例如):

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

第2步

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

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

第25.2段中弹簧引导的documentation表示可以通过编程方式添加配置文件 所以我稍微修改了主类以允许这种程序化添加:

// 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属性中指定配置文件(我通常使用它来指定环境,如分段,生产等。 春天现在会自动加载相关的属性文件。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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