SpringBoot集成Logback-Elasticsearch时索引缺失自定义字段问题
问题排查:Logback Access日志写入Elasticsearch后缺失自定义字段
版本信息
- springboot - 3.1.6
logback-elasticsearch-appender,版本:1.6logback-access-spring-boot-starter,版本:4.1.0
自定义logback-access-spring.xml配置
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"> <springProperty scope="context" name="elasticsearch_uris" source="spring.elasticsearch.uris" defaultValue="http://~~~~~~"/> <appender name="ELASTIC" class="com.internetitem.logback.elasticsearch.ElasticsearchAccessAppender"> <url>${elasticsearch_uris}/_bulk</url> <index>searchterm-%date{yyyy-MM-dd}</index> <properties> <property name="contentLength" value="length"/> <property name="remoteHost" value="%h"/> <property name="protocol" value="%H"/> <property name="referer" value="%i{Referer}"/> <property name="userAgent" value="%i{User-Agent}"/> <property name="requestMethod" value="%m"/> <property name="statusCode" value="%s"/> <property name="elapsedTime" value="%D"/> <property name="date" value="%t{yyyy-MM-dd'T'HH:mm:ss}"/> <property name="user" value="%u"/> <property name="queryString" value="%q"/> <property name="requestURI" value="%U"/> </properties> <headers> <header> <name>Content-Type</name> <value>application/json</value> </header> </headers> </appender> <appender-ref ref="ELASTIC" /> </configuration>
问题描述
使用Logback向Elasticsearch发送访问日志后,索引中仅生成@timestamp字段,配置中定义的自定义字段全部缺失,不符合预期。
实际结果
{ "_index": "searchterm-2023-12-13", "_id": "bO4gYowB_nCChb6LIW4h", "_score": 1, "_source": { "@timestamp": "2023-12-13T16:42:01.733+0900" } }
预期结果
{ "_index" : "application-accesslog-2023-02-06", "_type" : "_doc", "_id" : "sQsnJYYBczPF6ol6vVuF", "_score" : 1.0, "_source" : { "@timestamp" : "2023-02-06T14:16:46.531+0900", "contentLength" : "82", "remoteHost" : "0:0:0:0:0:0:0:1", "protocol" : "HTTP/1.1", "referer" : "-", "userAgent" : "PostmanRuntime/7.29.2", "requestMethod" : "POST", "statusCode" : "200", "elapsedTime" : "330", "date" : "2023-02-06T14:16:46", "user" : "-", "requestURI" : "/performance/documents" } }
原因分析及解决方案
核心原因
你使用的logback-elasticsearch-appender 1.6版本中,Logback Access日志的字段配置需要使用**accessProperties**标签,而非普通日志用的properties标签。properties标签仅对常规Logback Logger生效,Access日志的专属字段必须用accessProperties来定义。
修复后的配置示例
将配置里的<properties>替换为<accessProperties>即可,其他内容保持不变:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"> <springProperty scope="context" name="elasticsearch_uris" source="spring.elasticsearch.uris" defaultValue="http://~~~~~~"/> <appender name="ELASTIC" class="com.internetitem.logback.elasticsearch.ElasticsearchAccessAppender"> <url>${elasticsearch_uris}/_bulk</url> <index>searchterm-%date{yyyy-MM-dd}</index> <!-- 替换为accessProperties标签 --> <accessProperties> <property name="contentLength" value="length"/> <property name="remoteHost" value="%h"/> <property name="protocol" value="%H"/> <property name="referer" value="%i{Referer}"/> <property name="userAgent" value="%i{User-Agent}"/> <property name="requestMethod" value="%m"/> <property name="statusCode" value="%s"/> <property name="elapsedTime" value="%D"/> <property name="date" value="%t{yyyy-MM-dd'T'HH:mm:ss}"/> <property name="user" value="%u"/> <property name="queryString" value="%q"/> <property name="requestURI" value="%U"/> </accessProperties> <headers> <header> <name>Content-Type</name> <value>application/json</value> </header> </headers> </appender> <appender-ref ref="ELASTIC" /> </configuration>
额外验证点
- 查看应用启动日志(因配置了
debug="true"),确认Elasticsearch Access Appender是否成功加载,有没有字段解析相关的警告或错误。 - 校验
spring.elasticsearch.uris配置正确性,确保Appender能正常连接Elasticsearch。 - 若问题仍存在,检查Elasticsearch索引模板是否有冲突,确保新字段能被自动映射(也可手动创建对应索引模板)。
内容的提问来源于stack exchange,提问作者honeydanji
相关产品推荐
相关产品推荐

