Spring Boot无ELK时如何用logback appender直接异步上报日志到ElasticSearch
可行方案说明
方案1:使用开源logback-elasticsearch-appender实现
这是目前最贴合需求的成熟第三方appender,可直接在logback中配置完成日志到ElasticSearch的直连写入,无需额外部署Logstash、Beats类中间组件。
第一步:引入依赖
Maven依赖示例:
<dependency> <groupId>com.internetitem</groupId> <artifactId>logback-elasticsearch-appender</artifactId> <version>1.6</version> </dependency>
第二步:配置logback.xml
直接配置异步ES appender即可,示例配置如下:
<configuration> <!-- 配置ES直连appender --> <appender name="ELASTIC" class="com.internetitem.logback.elasticsearch.ElasticsearchAppender"> <!-- ES集群地址,多个节点用逗号分隔 --> <url>http://你的ES服务地址:9200/_bulk</url> <!-- 日志索引,支持按日期动态生成 --> <index>app-logs-%date{yyyy.MM.dd}</index> <!-- ES7+版本无需配置type参数,可删除下行 --> <type>doc</type> <!-- 错误日志重试次数 --> <maxRetries>3</maxRetries> <!-- 批量发送阈值,凑够指定条数再发,减少IO消耗 --> <bulkSize>500</bulkSize> <!-- 最大flush间隔,就算没凑够批量阈值,到时间也自动发送 --> <flushInterval>1000</flushInterval> <!-- 连接超时配置 --> <connectTimeout>5000</connectTimeout> <socketTimeout>10000</socketTimeout> <!-- 自定义日志字段,可按需添加 --> <field name="timestamp" pattern="%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ}" /> <field name="level" pattern="%level" /> <field name="thread" pattern="%thread" /> <field name="logger" pattern="%logger" /> <field name="message" pattern="%message" /> <field name="stackTrace" pattern="%ex{full}" /> <!-- 可加应用名、环境等固定字段 --> <field name="appName">你的应用名称</field> <field name="env">prod</field> <!-- ES有账号密码校验的话补充下行配置 --> <!-- <authentication>用户名:密码</authentication> --> </appender> <!-- 套一层logback自带的AsyncAppender,进一步隔离业务线程和日志发送逻辑,完全避免阻塞业务 --> <appender name="ASYNC_ELASTIC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="ELASTIC" /> <!-- 队列容量,可根据实际日志量调整 --> <queueSize>1024</queueSize> <!-- 队列剩余容量低于阈值后,自动丢弃低级别日志避免阻塞 --> <discardingThreshold>20</discardingThreshold> <!-- 保证ERROR级别日志不丢失,且永远不阻塞业务线程 --> <neverBlock>true</neverBlock> </appender> <!-- 根日志配置 --> <root level="INFO"> <appender-ref ref="ASYNC_ELASTIC" /> <!-- 建议保留本地文件appender作为兜底,避免ES不可用时日志丢失 --> <!-- <appender-ref ref="LOCAL_FILE" /> --> </root> </configuration>
方案2:自行封装简易ES Appender(灵活度更高)
如果现有开源appender不符合自定义需求,可以基于ElasticSearch官方的RestHighLevelClient自行实现logback的UnsynchronizedAppenderBase,配合内置队列实现异步批量发送,实现逻辑简单:
- 重写
start方法初始化RestHighLevelClient - 重写
append方法把日志事件存入内存队列 - 启动单独后台线程,批量从队列拉取日志构造BulkRequest写入ES
- 重写
stop方法关闭客户端,flush剩余未发送的日志
注意事项
- 生产环境建议保留本地文件日志作为兜底,避免ES不可用时日志丢失
- 如果ES开启了HTTPS访问,补充对应SSL证书配置即可
内容的提问来源于stack exchange,提问作者Harish Kumar Saini
相关产品推荐
相关产品推荐

