Я использую SpringBoot с LogBack и пытаюсь направить все операторы журнала одного конкретного пакета (здесь обозначается как «com.example.somepackagename») в файл. Все остальные операторы журнала должны идти на стандартный вывод.
Сначала столкнулся с проблемой, что во время запуска был создан файл "LOG_FILE_IS_UNDEFINED". Затем я решил поискать эту проблему (например, это на github или это на StackOverflow и некоторых других), но ни одно из приложений не решило проблему.
На основании разн. описания Я придумал приведенную ниже конфигурацию, используя файл logback-spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}" />
<property name="LOG_FILE" value="${LOG_FILE:-ts-msgs.log}" />
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</encoder>
</appender>
<appender name="MSG_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE}</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n%wex</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOG_PATH}/archived/debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<logger name="com.example.somepackagename" additivity="false" level="debug">
<appender-ref ref="MSG_LOG_FILE" />
</logger>
<logger name="org.springframework" additivity="false" level="info">
<appender-ref ref="STDOUT" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>
При этом я больше не получаю файл с именем «LOG_FILE_IS_UNDEFINED», но LogBack теперь всегда сначала создает пустой файл «ts-msgs.log» в рабочем каталоге приложения, прежде чем он создает файл с тем же именем в временный каталог (куда этот файл должен идти). Таким образом, каким-то образом во время инициализации он уже создает файл с правильным именем, но правильный путь еще не установлен. Другими словами, порядок инициализации Logback в SpringBoot кажется нарушенным (или, по крайней мере, не интуитивным), и кажется невозможным избежать создания первого файла журнала до определения и применения правильного пути для файла-приложения.
Как можно предотвратить создание этого первого, начального и пустого файла журнала? Это необходимо, поскольку рабочий каталог, как правило, защищен от записи, и попытка создать там файл приведет к исключению (и, как правило, к завершению программы).
Любые советы или предложения?
Кстати: я уже пытался переименовать этот файл в logback.xml (который, кажется, обрабатывался ранее во время запуска SpringBoot), но это не решило проблему, поэтому я сохранил предложенное имя файла.