公司有個項目想通過Appender接入公司的統一日志系統,在讀取Apollo配置時候遇到問題,最后在大家的努力下有了解決方案
1.application.properties的配置
注意logging.config要使用自定義的名稱
# apollo配置中心
app.id=app.id
apollo.meta=http://127.0.0.1:30225
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application
apollo.bootstrap.eagerLoad.enabled=true
#日志配置要放在Apollo配置之后,不要使用默認的logback.xml名稱。
logging.config=classpath:logback-custom.xml
2.logback-custom.xml的配置,其中ordercenter.order.elk.log.url為Apollo配置
<!-- elk日志路徑 -->
<springProperty scope="context" name="ordercenter.order.elk.log.url" source="ordercenter.order.elk.log.url"></springProperty>
<!-- ELK日志 -->
<appender name="elkLog" class="com.XXXX.ordercenter.commonservice.logAppender.ElkAppender">
<layout>
<Pattern>%d [%level] %logger{36} %line - %msg%n</Pattern>
</layout>
<orderElkLogUrl>${ordercenter.order.elk.log.url}</orderElkLogUrl>
</appender><!-- ELK日志異步執行 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>2048</queueSize>
<appender-ref ref="elkLog" />
</appender><!-- 基於dubug處理日志:具體控制台或者文件對日志級別的處理還要看所在appender配置的filter,如果沒有配置filter,則使用root配置 -->
<root level="info">
<appender-ref ref="ASYNC" />
</root>
3.ElkAppender.java 為自定義Appender,添加orderElkLogUrl屬性
@Data
public class ElkAppender extends AppenderBase<ILoggingEvent> {
/**
* 讀取Apollo配置
* 由logback-custom.xml傳入
*/
private String orderElkLogUrl;
private Layout<ILoggingEvent> layout;
@Override
public void start() {
if (this.layout == null) {
addError("No layout set for the appender named [" + name + "].");
return;
}
super.start();
}
@Override
protected void append(ILoggingEvent event) {System.out.println(this.orderElkLogUrl);}
}
