You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot集成Logback-Elasticsearch时索引缺失自定义字段问题

问题排查:Logback Access日志写入Elasticsearch后缺失自定义字段

版本信息

  • springboot - 3.1.6
  • logback-elasticsearch-appender,版本:1.6
  • logback-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>

额外验证点

  1. 查看应用启动日志(因配置了debug="true"),确认Elasticsearch Access Appender是否成功加载,有没有字段解析相关的警告或错误。
  2. 校验spring.elasticsearch.uris配置正确性,确保Appender能正常连接Elasticsearch。
  3. 若问题仍存在,检查Elasticsearch索引模板是否有冲突,确保新字段能被自动映射(也可手动创建对应索引模板)。

内容的提问来源于stack exchange,提问作者honeydanji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:08:11