公司有个项目想通过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);}
}