Журналы доступа Tomcat в Spring Boot для разных операционных систем

Недавно я начал работать с 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>/....

Для обычных журналов мы используем журналы, и это позволяет делать подобные вещи, но поскольку журнал доступа на самом деле не управляется журналами, а вместо этого использует Valves, мой вопрос: как мы можем достичь такого же уровня гибкости здесь?

Я не думаю, что мне следует предоставлять дополнительный профиль для этого и использовать его как:

--spring.profiles.active=windows / linux

Потому что я считаю, что у весенней загрузки есть какое-то решение для этого :) Большое спасибо заранее


person Mark Bramnik    schedule 08.07.2017    source источник


Ответы (3)


Вот решение, которое я придумал. Может быть, это поможет кому-то.

Есть 2 шага.

Шаг 1 Я создал файлы application-windows.properties и application-linux.properties в src/main/resources. Эти файлы содержат конфигурацию, зависящую от ОС.

Например, в Linux я указываю что-то вроде этого:

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

Для окон это может быть (например):

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

Шаг 2

Приложение весенней загрузки (файл с основным методом) обычно выглядит так:

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

документация весны boot в параграфе 25.2 говорится, что профили можно добавлять программно. Поэтому я немного изменил основной класс, чтобы разрешить это программное добавление:

// 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 теперь автоматически загрузит соответствующий файл свойств.

Спасибо всем людям, которые предложили свои решения!

person Mark Bramnik    schedule 09.07.2017

Мое любимое решение — использовать дополнительный путь к классам в Tomcat и загружать оттуда свойства, специфичные для среды.
Т.е. Свойство Tomcat common.loader в conf/catalina.properties

Кроме того, я обычно сохраняю свойства по умолчанию внутри файла .war, таким образом вы будете указывать только различия в свойствах, специфичных для среды.

person Alexander    schedule 08.07.2017
comment
Однажды я написал об этом сообщение в блоге: codrspace.com/Khovansa/spring-java- конфигурация проекта - person Alexander; 08.07.2017
comment
Извините, я не уверен, что понимаю: мы используем jar, а не war, и кот встроен в приложение. Это одно из преимуществ использования Spring Boot, по крайней мере, как я его вижу ... Не могли бы вы привести какой-нибудь технический пример, чтобы проиллюстрировать вашу точку зрения? - person Mark Bramnik; 08.07.2017
comment
Вы можете использовать свойство loader.path, например, системное свойство. java -Dloader.path=... -jar .... См., например, здесь: stackoverflow.com/a/40500659/1847482< /а> - person Alexander; 08.07.2017
comment
Или просто погуглите «дополнительный путь к классам весенней загрузки» — на эту тему есть много хороших ресурсов. - person Alexander; 08.07.2017

Вам нужно будет выполнить какое-то конкретное действие env, если относительные пути не годятся. Из https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html вы можете использовать профили или использовать переменную среды или системное свойство. Как говорится в другом ответе, вы можете загружать свойства из файла, специфичного для среды, если это имеет для вас наибольшее значение.

person Rob Baily    schedule 08.07.2017