解決方案:需要通過springProperty標籤來引用:
<springProperty scope="context" name="elkLoggerUrl" source="elk.logger.destination"/>
這裏的name和上面property標籤一樣不多說,source其實就是上面的value啦,只不過要注意:千萬不要加${}。
在接入elk中,發現將 ${elkLoggerUrl} 放在 <destination>${elkLoggerUrl}</destination> 中間會報錯,
加上默認值,改成下面就可以了
<springProperty scope="context" name="elkLoggerUrl" source="elk.logger.destination" defaultValue="145.168.36.23:4567"/>
附:logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--該日誌將日誌級別不同的log信息保存到不同的文件中 -->
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<springProperty scope="context" name="springAppName" source="spring.application.name" />
<springProperty scope="context" name="elkLoggerUrl" source="elk.logger.destination"
defaultValue="145.168.36.23:4567"/>
<!-- 日誌在工程中的輸出位置 -->
<property name="log.path" value="/data/logs/${springAppName}" />
<!-- 控制檯的日誌輸出樣式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- 日誌輸出到文件的輸出樣式 -->
<property name="pattern" value="[${springAppName}] %d %-5level [%X{ctxLogId}][%thread] %logger{5}.%M[%L] - %msg%n"/>
<!-- 控制檯輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<!-- 日誌輸出編碼 -->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!--輸出到文件-->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌文件的路徑及文件名 -->
<file>${log.path}/${elkHost}_info.log</file>
<!--日誌文件輸出格式-->
<encoder>
<pattern>${pattern}</pattern>
<charset>utf8</charset>
</encoder>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日誌歸檔路徑以及格式 -->
<fileNamePattern>${log.path}/info.log.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>200MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日誌文件保留天數-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!-- 此日誌文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 時間滾動輸出 level爲 ERROR 日誌 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在記錄的日誌文件的路徑及文件名 -->
<file>${log.path}/error.log</file>
<!--日誌文件輸出格式-->
<encoder>
<pattern>${pattern}</pattern>
<charset>utf8</charset>
</encoder>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error.log.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>200MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日誌文件保留天數-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!-- 此日誌文件只記錄ERROR級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 爲logstash輸出的JSON格式的Appender -->
<appender name="logstash"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${elkLoggerUrl}</destination>
<!-- 日誌輸出編碼 -->
<encoder
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<mdc />
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"severity": "%level",
"applicationName": "${springAppName:-}",
"requestId": "%X{requestId:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"message": "%message"
}
</pattern>
</pattern>
<stackTrace>
<throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
<maxDepthPerThrowable>50</maxDepthPerThrowable>
<maxLength>4048</maxLength>
<shortenedClassNameLength>50</shortenedClassNameLength>
<exclude>^sun\.reflect\..*\.invoke</exclude>
<exclude>^net\.sf\.cglib\.proxy\.MethodProxy\.invoke</exclude>
<rootCauseFirst>true</rootCauseFirst>
</throwableConverter>
</stackTrace>
</providers>
</encoder>
</appender>
<!-- 測試環境輸出級別 -->
<springProfile name="local,test,test2,work,dev">
<root level="INFO">
<appender-ref ref="logstash" />
<appender-ref ref="ERROR_FILE" />
</root>
</springProfile>
<!-- 線上環境輸出級別 -->
<springProfile name="uat,prd">
<root level="INFO">
<appender-ref ref="logstash" />
<appender-ref ref="ERROR_FILE" />
</root>
</springProfile>
<root level="INFO">
<appender-ref ref="console" />
</root>
</configuration>