Как присвоить значение аргумента логгеру slf4j

Приложение запускается следующим образом: java -jar app.jar logfile.txt. Аргумент получать умею, но как мне установить его логгеру в виде пути до файла? В файле конфигурации это выглядело бы следующим образом: logging.file.path, но изначально путь неизвестен.


Ответы (2 шт):

Автор решения: ulxanxv

В Spring все значения переопределяются через двойное тире --. Как-то пытаться делать это через код кажется мне очень плохой идеей. Такие вещи как путь до файла с логами в основном делают через переменные окружения или в команде запуска.

То есть команда запуска будет такая java -jar app.jar --logging.file.path=logfile.txt

А если через переменные окружения, то нужно отредактировать application.* ::

logging:
  file:
    path: ${LOGGIN_FILE_PATH:<DEFAULT_VALUE>}

И тогда Spring сам подхватит значение LOGGING_FILE_PATH из Environment (переменных окружения). Если же он не найдет значение, то будет использовать значение по умолчанию <DEFAULT_VALUE> (только писать без ковычек), которое вы задали после двоеточия

Через код это можно сделать так ::

public interface EnvironmentProperties {

    String LOGGING_FILE_PATH = "LOGGING_FILE_PATH";

}

И в методе main(String[] args) ::

@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        System.setProperty(EnvironmentProperties.LOGGING_FILE_PATH, args[0]);
        SpringApplication.run(TestApplication.class, args);
    }

}
→ Ссылка
Автор решения: Митяй

Получилось реализовать таким образом:

public static void main(String[] args) {
    String logfile = "";
    try { 
        logfile = args[1]; 
    } catch (Exception ignored) {}

    new SpringApplicationBuilder(VkApplication.class)
            .properties("logging.file.name=" + logfile).run(args);

    if(logfile.isEmpty()) {
        log.warn("Log file hasn't been present. Logging will out just in a console.");
    }
}

Свойства назначил через SpringApplicationBuilder.

→ Ссылка