Я пробую экстернализацию logback-spring.xml
для своего приложения Springboot. Файл logback-spring.xml
добавляет журналы к двум приложениям: appender файла и logsta sh appender.
Этот файл включает внешний файл logback-external.yml
. Как logback-spring.xml
, так и включенный файл logback-external.yml периодически сканируются на предмет изменений, как показано ниже.
Некоторые из переменных, определяемых приложением c, выбираются из application.yml
по <springProperty>
. Для scope = “context”
, scope= “local”
или scope= “system”
переменные <springProperty>
имеют вид ‘logstash_port_IS_UNDEFINED’
(см. Снимок журналов), и все приложения не работают.
Однако для scope= “system”
есть загвоздка. Как упоминалось в логбэке do c, «свойство с системной областью действия вставляется в системные свойства JVM и действует до тех пор, пока JVM или пока оно не будет очищено» , кажется чтобы дополнения регистрации продолжали работать со старыми рабочими значениями для этих переменных.
Кто-нибудь еще, кто пытался получить параметры регистрации c приложения в файл logback-spring. xml, и столкнулся с похожей проблемой проблема при включенном автоматическом сканировании? Могу ли я сделать ставку на scope = «system» для реализации экстернализации и автоматического сканирования logback?
logback-spring. xml
<configuration debug="true" scan="true" scanPeriod="15 seconds">
<property resource="application.yml" />
<springProperty scope="system" name="logstash_host"
source="myapp.logging.logstash.host" />
<springProperty scope="system" name="logstash_port"
source="myapp.logging.logstash.port" />
<springProperty scope="system" name="base_log_dir"
source="base_log" />
<springProperty scope="system" name="app_name"
source="spring.application.name" />
<springProperty scope="system" name="app_port"
source="server.port"/>
<springProperty scope="system" name="max_history"
source="logback.max_history_size" />
<springProperty scope="system" name="max_log_file_size"
source="max_log_size" />
<include optional="false"
file="external-logback-file-location/logback-external.xml" />
</configuration>
logback-external.yml
<?xml version="1.0" encoding="UTF-8"?>
<included>
<appender name="FILE-ROLLING-ALL"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator
class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>metrics</marker>
</evaluator>
<onMatch>DENY</onMatch>
</filter>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${base_log_dir}/${app_name}/${app_name}_-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxFileSize>${max_log_file_size}</maxFileSize>
<maxHistory>${max_history}</maxHistory>
<!---other rolling specific policies here ---->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level
%logger{36}.%M [%line] - %msg%n
</pattern>
</encoder>
</appender>
<appender name="LOGSTASH"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${logstash_host}:${logstash_port}</destination>
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>
{
"custom-field":"custom-field-value"
}
</customFields>
</encoder>
</appender>
<root level="info">
<appender-ref ref="FILE-ROLLING-ALL"/>
<appender-ref ref="LOGSTASH" />
</root>
<!-- in the absence of the class attribute, assume ch.qos.logback.core.hook.DefaultShutdownHook -->
<shutdownHook
class="ch.qos.logback.core.hook.DelayingShutdownHook" />
</included>
Журналы ошибок из Logback
22:37:02,388 |-ERROR in ch.qos.logback.core.joran.util.PropertySetter@4c9c7665 - Failed to invoke valueOf{} method in class [ch.qos.logback.core.util.FileSize] with value [max_log_file_size_IS_UNDEFINED]
22:37:02,388 |-WARN in ch.qos.logback.core.joran.util.PropertySetter@4c9c7665 - Failed to set property [maxFileSize] to value "max_log_file_size_IS_UNDEFINED". ch.qos.logback.core.util.PropertySetterException: Conversion to type [class ch.qos.logback.core.util.FileSize] failed.
at ch.qos.logback.core.util.PropertySetterException: Conversion to type [class ch.qos.logback.core.util.FileSize] failed.
22:37:02,389 |-WARN in ch.qos.logback.core.joran.util.PropertySetter@99ee192 - Failed to set property [maxHistory] to value "max_history_IS_UNDEFINED". ch.qos.logback.core.util.PropertySetterException: Conversion to type [int] failed.
22:37:02,391 |-ERROR in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@945654245 - maxFileSize property is mandatory.
Caused by: java.lang.IllegalArgumentException: Invalid destination 'logstash_host_IS_UNDEFINED:logstash_port_IS_UNDEFINED': unparseable value (expected format 'host[:port]').
at at net.logstash.logback.appender.destination.DestinationParser.parse(DestinationParser.java:62)
at at net.logstash.logback.appender.AbstractLogstashTcpSocketAppender.addDestination(AbstractLogstashTcpSocketAppender.java:892)
at ... 23 common frames omitted
22:37:02,395 |-ERROR in net.logstash.logback.appender.LogstashTcpSocketAppender[LOGSTASH] - No destination was configured. Use <destination> to add one or more destinations to the appender