Elasticsearch_基本操作

本文详细介绍如何使用Java API操作Elasticsearch,包括创建连接、增删改查文档、批量操作等核心功能,并提供多种JSON构建方法。

/**

 * 系统环境: vm12 下的centos 7.2

 * 当前安装版本: elasticsearch-2.4.0.tar.gz

 */

默认进行了elasticsearch安装和ik安装, 超时配置, 分页压力配置等

添加maven依赖

复制代码
<dependency>  
            <groupId>org.elasticsearch</groupId>  
            <artifactId>elasticsearch</artifactId>  
            <version>2.4.0</version>  
        </dependency>    
        <dependency>  
            <groupId>com.fasterxml.jackson.core</groupId>  
            <artifactId>jackson-databind</artifactId>  
            <version>2.1.3</version>  
 </dependency>  
复制代码

  注: 因为spring-data-elasticsearch目前只支持到2.4.0, 所以, 暂不使用5.2.0版本

    关于版本控制可见: https://github.com/spring-projects/spring-data-elasticsearch

    

 

第一部分, 使用java操作elasticsearch

  创建客户端的两种方式可见spring-data-elasticsearch的源码, 官方, 需要合起来才能使用, 浪费我一下午的时间....

org.springframework.data.elasticsearch.client 包下, 2种创建客户端的方式

 

  1, 创建一个node节点, 加入集群中, 通过这个node获取cilent (不建议使用)

      这种方式相当于创建了一个节点, 不存储数据, 可通过claspath下的elasticsearch.yml设置, 也可通过编程的方式配置, 

复制代码
Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.ping_timeout", 1000)
                .put("discovery.zen.ping.multicast.enabled", "false").put("timeout", 1)
                .putArray("discovery.zen.ping.unicast.hosts", "l-flightdev18.f.dev.cn0.qunar.com:9300", "l-flightdev17.f.dev.cn0.qunar.com:9300")
                .build();
        Node node = NodeBuilder.nodeBuilder().clusterName("flight_fuwu_order_index").client(true).settings(settings).node();
        Client client = node.client();
复制代码

     获取了所有node节点的client, 发送请求时遍历可用的client, 

复制代码
Elasticsearch为Java用户提供了两种内置客户端:
节点客户端(node client):

节点客户端以无数据节点(none data node)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。
传输客户端(Transport client):

这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。
两个Java客户端都通过9300端口与集群交互,使用Elasticsearch传输协议(Elasticsearch Transport Protocol)。集群中的节点之间也通过9300端口进行通信。如果此端口未开放,你的节点将不能组成集群。+

TIP

Java客户端所在的Elasticsearch版本必须与集群中其他节点一致,否则,它们可能互相无法识别。
复制代码

 https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.4/index.html

下面介绍第二种连接方式: 

 
  2, 通过transportClient来连接集群

复制代码
package com.wenbronk.javaes;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.elasticsearch.action.bulk.BackoffPolicy;
import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.bulk.BulkProcessor.Listener;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.script.Script;
import org.junit.Before;
import org.junit.Test;

import com.alibaba.fastjson.JSONObject;

/**
 * 使用java API操作elasticSearch
 * 
 * @author 231
 *
 */
public class JavaESTest {

    private TransportClient client;
    private IndexRequest source;
    
    /**
     * 获取连接, 第一种方式
     * @throws Exception
     */
//    @Before
    public void before() throws Exception {
        Map<String, String> map = new HashMap<String, String>();  
        map.put("cluster.name", "elasticsearch_wenbronk");  
        Settings.Builder settings = Settings.builder().put(map);  
        client = TransportClient.builder().settings(settings).build()  
                        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("www.wenbronk.com"), Integer.parseInt("9300"))); 
    }
    
    /**
     * 获取连接, 第二种方式
     * @throws Exception
     */
    @Before
    public void before11() throws Exception {
        // 创建客户端, 使用的默认集群名, "elasticSearch"
//        client = TransportClient.builder().build()
//                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("www.wenbronk.com"), 9300));

        // 通过setting对象指定集群配置信息, 配置的集群名
        Settings settings = Settings.settingsBuilder().put("cluster.name", "elasticsearch_wenbronk") // 设置集群名
//                .put("client.transport.sniff", true) // 开启嗅探 , 开启后会一直连接不上, 原因未知
//                .put("network.host", "192.168.50.37")
                .put("client.transport.ignore_cluster_name", true) // 忽略集群名字验证, 打开后集群名字不对也能连接上
//                .put("client.transport.nodes_sampler_interval", 5) //报错,
//                .put("client.transport.ping_timeout", 5) // 报错, ping等待时间,
                .build();
         client = TransportClient.builder().settings(settings).build()
                 .addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("192.168.50.37", 9300)));
         // 默认5s
         // 多久打开连接, 默认5s
         System.out.println("success connect");
    }
    
    /**
     * 查看集群信息
     */
    @Test
    public void testInfo() {
        List<DiscoveryNode> nodes = client.connectedNodes();
        for (DiscoveryNode node : nodes) {
            System.out.println(node.getHostAddress());
        }
    }
    
    /**
     * 组织json串, 方式1,直接拼接
     */
    public String createJson1() {
        String json = "{" +
                "\"user\":\"kimchy\"," +
                "\"postDate\":\"2013-01-30\"," +
                "\"message\":\"trying out Elasticsearch\"" +
            "}";
        return json;
    }
    
    /**
     * 使用map创建json
     */
    public Map<String, Object> createJson2() {
        Map<String,Object> json = new HashMap<String, Object>();
        json.put("user", "kimchy");
        json.put("postDate", new Date());
        json.put("message", "trying out elasticsearch");
        return json;
    }
    
    /**
     * 使用fastjson创建
     */
    public JSONObject createJson3() {
        JSONObject json = new JSONObject();
        json.put("user", "kimchy");
        json.put("postDate", new Date());
        json.put("message", "trying out elasticsearch");
        return json;
    }
    
    /**
     * 使用es的帮助类
     */
    public XContentBuilder createJson4() throws Exception {
        // 创建json对象, 其中一个创建json的方式
        XContentBuilder source = XContentFactory.jsonBuilder()
            .startObject()
                .field("user", "kimchy")
                .field("postDate", new Date())
                .field("message", "trying to out ElasticSearch")
            .endObject();
        return source;
    }
    
    /**
     * 进行连接测试
     * @throws Exception
     */
    @Test
    public void test1() throws Exception {
        XContentBuilder source = createJson4();
        // 存json入索引中
        IndexResponse response = client.prepareIndex("twitter", "tweet", "1").setSource(source).get();
//        // 结果获取
        String index = response.getIndex();
        String type = response.getType();
        String id = response.getId();
        long version = response.getVersion();
        boolean created = response.isCreated();
        System.out.println(index + " : " + type + ": " + id + ": " + version + ": " + created);
    }

    /**
     * get API 获取指定文档信息
     */
    @Test
    public void testGet() {
//        GetResponse response = client.prepareGet("twitter", "tweet", "1")
//                                .get();
        GetResponse response = client.prepareGet("twitter", "tweet", "1")
                .setOperationThreaded(false)    // 线程安全
                .get();
        System.out.println(response.getSourceAsString());
    }
    
    /**
     * 测试 delete api
     */
    @Test
    public void testDelete() {
        DeleteResponse response = client.prepareDelete("twitter", "tweet", "1")
                .get();
        String index = response.getIndex();
        String type = response.getType();
        String id = response.getId();
        long version = response.getVersion();
        System.out.println(index + " : " + type + ": " + id + ": " + version);
    }
    
    /**
     * 测试更新 update API
     * 使用 updateRequest 对象
     * @throws Exception 
     */
    @Test
    public void testUpdate() throws Exception {
        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.index("twitter");
        updateRequest.type("tweet");
        updateRequest.id("1");
        updateRequest.doc(XContentFactory.jsonBuilder()
                .startObject()
                // 对没有的字段添加, 对已有的字段替换
                    .field("gender", "male")
                    .field("message", "hello")
                .endObject());
        UpdateResponse response = client.update(updateRequest).get();
        
        // 打印
        String index = response.getIndex();
        String type = response.getType();
        String id = response.getId();
        long version = response.getVersion();
        System.out.println(index + " : " + type + ": " + id + ": " + version);
    }
    
    /**
     * 测试update api, 使用client
     * @throws Exception 
     */
    @Test
    public void testUpdate2() throws Exception {
        // 使用Script对象进行更新
//        UpdateResponse response = client.prepareUpdate("twitter", "tweet", "1")
//                .setScript(new Script("hits._source.gender = \"male\""))
//                .get();
        
        // 使用XContFactory.jsonBuilder() 进行更新
//        UpdateResponse response = client.prepareUpdate("twitter", "tweet", "1")
//                .setDoc(XContentFactory.jsonBuilder()
//                        .startObject()
//                            .field("gender", "malelelele")
//                        .endObject()).get();
        
        // 使用updateRequest对象及script
//        UpdateRequest updateRequest = new UpdateRequest("twitter", "tweet", "1")
//                .script(new Script("ctx._source.gender=\"male\""));
//        UpdateResponse response = client.update(updateRequest).get();
        
        // 使用updateRequest对象及documents进行更新
        UpdateResponse response = client.update(new UpdateRequest("twitter", "tweet", "1")
                .doc(XContentFactory.jsonBuilder()
                        .startObject()
                            .field("gender", "male")
                        .endObject()
                    )).get();
        System.out.println(response.getIndex());
    }
    
    /**
     * 测试update
     * 使用updateRequest
     * @throws Exception 
     * @throws InterruptedException 
     */
    @Test
    public void testUpdate3() throws InterruptedException, Exception {
        UpdateRequest updateRequest = new UpdateRequest("twitter", "tweet", "1")
            .script(new Script("ctx._source.gender=\"male\""));
        UpdateResponse response = client.update(updateRequest).get();
    }
    
    /**
     * 测试upsert方法
     * @throws Exception 
     * 
     */
    @Test
    public void testUpsert() throws Exception {
        // 设置查询条件, 查找不到则添加生效
        IndexRequest indexRequest = new IndexRequest("twitter", "tweet", "1")
            .source(XContentFactory.jsonBuilder()
                .startObject()
                    .field("name", "qergef")
                    .field("gender", "malfdsae")
                .endObject());
        // 设置更新, 查找到更新下面的设置
        UpdateRequest upsert = new UpdateRequest("twitter", "tweet", "1")
            .doc(XContentFactory.jsonBuilder()
                    .startObject()
                        .field("user", "wenbronk")
                    .endObject())
            .upsert(indexRequest);
        
        client.update(upsert).get();
    }
    
    /**
     * 测试multi get api
     * 从不同的index, type, 和id中获取
     */
    @Test
    public void testMultiGet() {
        MultiGetResponse multiGetResponse = client.prepareMultiGet()
        .add("twitter", "tweet", "1")
        .add("twitter", "tweet", "2", "3", "4")
        .add("anothoer", "type", "foo")
        .get();
        
        for (MultiGetItemResponse itemResponse : multiGetResponse) {
            GetResponse response = itemResponse.getResponse();
            if (response.isExists()) {
                String sourceAsString = response.getSourceAsString();
                System.out.println(sourceAsString);
            }
        }
    }
    
    /**
     * bulk 批量执行
     * 一次查询可以update 或 delete多个document
     */
    @Test
    public void testBulk() throws Exception {
        BulkRequestBuilder bulkRequest = client.prepareBulk();
        bulkRequest.add(client.prepareIndex("twitter", "tweet", "1")
                .setSource(XContentFactory.jsonBuilder()
                        .startObject()
                            .field("user", "kimchy")
                            .field("postDate", new Date())
                            .field("message", "trying out Elasticsearch")
                        .endObject()));
        bulkRequest.add(client.prepareIndex("twitter", "tweet", "2")
                .setSource(XContentFactory.jsonBuilder()
                        .startObject()
                            .field("user", "kimchy")
                            .field("postDate", new Date())
                            .field("message", "another post")
                        .endObject()));
        BulkResponse response = bulkRequest.get();
        System.out.println(response.getHeaders());
    }
    
    /**
     * 使用bulk processor
     * @throws Exception 
     */
    @Test
    public void testBulkProcessor() throws Exception {
        // 创建BulkPorcessor对象
        BulkProcessor bulkProcessor = BulkProcessor.builder(client, new Listener() {
            public void beforeBulk(long paramLong, BulkRequest paramBulkRequest) {
                // TODO Auto-generated method stub
            }
            
            // 执行出错时执行
            public void afterBulk(long paramLong, BulkRequest paramBulkRequest, Throwable paramThrowable) {
                // TODO Auto-generated method stub
            }
            
            public void afterBulk(long paramLong, BulkRequest paramBulkRequest, BulkResponse paramBulkResponse) {
                // TODO Auto-generated method stub
            }
        })
        // 1w次请求执行一次bulk
        .setBulkActions(10000)
        // 1gb的数据刷新一次bulk
        .setBulkSize(new ByteSizeValue(1, ByteSizeUnit.GB))
        // 固定5s必须刷新一次
        .setFlushInterval(TimeValue.timeValueSeconds(5))
        // 并发请求数量, 0不并发, 1并发允许执行
        .setConcurrentRequests(1)
        // 设置退避, 100ms后执行, 最大请求3次
        .setBackoffPolicy(
                BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3))
        .build();
        
        // 添加单次请求
        bulkProcessor.add(new IndexRequest("twitter", "tweet", "1"));
        bulkProcessor.add(new DeleteRequest("twitter", "tweet", "2"));
        
        // 关闭
        bulkProcessor.awaitClose(10, TimeUnit.MINUTES);
        // 或者
        bulkProcessor.close();
    }
}
<match **> @type elasticsearch @id out_es @log_level info include_tag_key true host "#{ENV['FLUENT_ELASTICSEARCH_HOST']}" port "#{ENV['FLUENT_ELASTICSEARCH_PORT']}" path "#{ENV['FLUENT_ELASTICSEARCH_PATH']}" scheme "#{ENV['FLUENT_ELASTICSEARCH_SCHEME'] || 'http'}" ssl_verify "#{ENV['FLUENT_ELASTICSEARCH_SSL_VERIFY'] || 'true'}" ssl_version "#{ENV['FLUENT_ELASTICSEARCH_SSL_VERSION'] || 'TLSv1'}" user "#{ENV['FLUENT_ELASTICSEARCH_USER'] || use_default}" password "#{ENV['FLUENT_ELASTICSEARCH_PASSWORD'] || use_default}" reload_connections "#{ENV['FLUENT_ELASTICSEARCH_RELOAD_CONNECTIONS'] || 'false'}" reconnect_on_error "#{ENV['FLUENT_ELASTICSEARCH_RECONNECT_ON_ERROR'] || 'true'}" reload_on_failure "#{ENV['FLUENT_ELASTICSEARCH_RELOAD_ON_FAILURE'] || 'true'}" log_es_400_reason "#{ENV['FLUENT_ELASTICSEARCH_LOG_ES_400_REASON'] || 'false'}" logstash_prefix "#{ENV['FLUENT_ELASTICSEARCH_LOGSTASH_PREFIX'] || 'logstash'}" logstash_dateformat "#{ENV['FLUENT_ELASTICSEARCH_LOGSTASH_DATEFORMAT'] || '%Y.%m.%d'}" logstash_format "#{ENV['FLUENT_ELASTICSEARCH_LOGSTASH_FORMAT'] || 'true'}" index_name "#{ENV['FLUENT_ELASTICSEARCH_LOGSTASH_INDEX_NAME'] || 'logstash'}" target_index_key "#{ENV['FLUENT_ELASTICSEARCH_TARGET_INDEX_KEY'] || use_nil}" type_name "#{ENV['FLUENT_ELASTICSEARCH_LOGSTASH_TYPE_NAME'] || 'fluentd'}" include_timestamp "#{ENV['FLUENT_ELASTICSEARCH_INCLUDE_TIMESTAMP'] || 'false'}" template_name "#{ENV['FLUENT_ELASTICSEARCH_TEMPLATE_NAME'] || use_nil}" template_file "#{ENV['FLUENT_ELASTICSEARCH_TEMPLATE_FILE'] || use_nil}" template_overwrite "#{ENV['FLUENT_ELASTICSEARCH_TEMPLATE_OVERWRITE'] || use_default}" sniffer_class_name "#{ENV['FLUENT_SNIFFER_CLASS_NAME'] || 'Fluent::Plugin::ElasticsearchSimpleSniffer'}" request_timeout "#{ENV['FLUENT_ELASTICSEARCH_REQUEST_TIMEOUT'] || '5s'}" application_name "#{ENV['FLUENT_ELASTICSEARCH_APPLICATION_NAME'] || use_default}" <buffer> flush_thread_count "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_FLUSH_THREAD_COUNT'] || '8'}" flush_interval "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_FLUSH_INTERVAL'] || '5s'}" chunk_limit_size "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_CHUNK_LIMIT_SIZE'] || '2M'}" queue_limit_length "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_QUEUE_LIMIT_LENGTH'] || '32'}" retry_max_interval "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_RETRY_MAX_INTERVAL'] || '30'}" retry_forever true </buffer> </match> 怎么确定fluentd的日志已经输出到es集群,es集群通过怎么命令查看,helm部署的es,然后kibana怎么配置展示
最新发布
04-02
<think>好的,用户的问题是关于如何确认Fluentd的日志是否成功输出到Elasticsearch集群,以及如何通过命令查看ES集群中的数据,还有Helm部署的ES如何配置Kibana展示日志。我需要一步一步地分析,确保回答结构清晰,符合用户的要求。 首先,我需要回忆Fluentd和Elasticsearch的相关知识。用户提供的配置文件中,用的是Elasticsearch插件,所以首先应该检查Fluentd的日志是否有错误。通常,Fluentd如果无法连接ES,或者认证失败,或者索引创建有问题,会在日志里显示错误信息。所以第一步建议用户查看Fluentd的日志,用systemctl或者kubectl logs命令,具体取决于部署方式。 接下来,确定日志是否写入ES,用户需要直接查询ES的API。常用的命令是curl,比如检查索引是否存在,或者搜索特定数据。例如,使用curl -XGET加上ES的地址和索引名称。这里需要注意,如果ES启用了安全认证,用户需要提供用户名和密码,比如用-u参数。可能需要提醒用户根据实际环境替换变量,比如主机名、端口、索引名称等。 然后,用户提到是Helm部署的ES,这可能需要考虑如何访问ES服务。如果是Kubernetes环境,可能需要通过port-forward或者Ingress来访问ES的API。例如,使用kubectl port-forward命令将本地端口转发到ES的Pod,这样本地的curl命令才能访问到集群内部的ES服务。 关于Kibana的配置,用户需要确认Kibana是否正确连接到ES。Helm部署的Kibana可能需要设置ES的URL,或者处理身份验证。然后,在Kibana中创建索引模式,通常是logstash-*,基于时间戳的字段,比如@timestamp。之后才能在Discover页面查看日志数据。 另外,用户可能遇到的问题包括网络连接问题、认证错误、索引名称不匹配、时间戳格式不对等。需要提醒用户检查这些方面,例如确认环境变量是否正确设置,特别是FLUENT_ELASTICSEARCH_HOST和PORT,还有用户名密码是否正确。如果使用了SSL,证书是否有效,是否需要禁用验证(比如ssl_verify设为false)。 在回答中,应该分步骤说明,先检查Fluentd日志,再验证ES中的数据,最后配置Kibana。每个步骤给出具体的命令和检查点,例如具体的curl命令示例,以及Kibana中的操作步骤。同时,需要注意用户提供的配置中有logstash_format为true,所以索引名称应该是logstash-前缀加上日期,所以提醒用户在Kibana中使用logstash-*作为模式。 可能还需要提到,如果ES集群有多个节点,或者分片设置问题,导致数据不可见,但这种情况相对较少,主要还是先检查基本连接和索引创建。另外,buffer配置中的重试机制,如果Fluentd暂时无法连接ES,会不断重试,所以可能日志不会立即出现,但最终会写入。 总结回答的结构:先讲如何确认Fluentd到ES的连接,再讲如何用ES命令查看数据,最后是Kibana配置。每个部分分步骤,给出具体命令和注意事项。同时,提醒用户替换变量和处理可能的安全认证问题。</think>以下是分步验证Fluentd日志输出到Elasticsearch及查看配置的详细指南: --- ### 一、验证Fluentd输出状态 #### 1. 查看Fluentd运行日志 ```bash # Kubernetes环境查看Pod日志 kubectl logs -f [fluentd-pod-name] -n [namespace] # 非K8s环境查看服务状态 journalctl -u fluentd -f ``` 检查是否有以下关键日志: - `Connection opened to Elasticsearch cluster` 表示连接成功 - `Failed to connect to Elasticsearch` 或 `401 Unauthorized` 表示认证/连接失败 #### 2. 检查Buffer队列状态 在Fluentd日志中观察buffer行为: - `buffer flush interval: 5s` 表示每5秒尝试刷新缓冲区 - `retry succeeded` 表示重试成功 - `chunk bytes too large` 表示需要调整 `chunk_limit_size` --- ### 二、Elasticsearch数据验证 #### 1. 获取ES访问凭证(Helm部署默认配置) ```bash # 获取elastic用户密码(假设release名为elastic) kubectl get secret elastic-elasticsearch-elastic-user -o=jsonpath='{.data.elastic}' -n [namespace] | base64 --decode ``` #### 2. 端口转发建立本地访问 ```bash kubectl port-forward svc/elastic-elasticsearch 9200:9200 -n [namespace] ``` #### 3. 执行ES API查询 ```bash # 查看所有索引(替换密码) curl -u elastic:your_password http://localhost:9200/_cat/indices?v # 查询特定索引数据(按logstash-*日期格式) curl -u elastic:your_password -XGET "http://localhost:9200/logstash-2024.06.25/_search?pretty" -H 'Content-Type: application/json' -d' { "query": { "match_all": {} } }' ``` --- ### 三、Kibana配置详解 #### 1. 访问Kibana界面 ```bash kubectl port-forward svc/elastic-kibana 5601:5601 -n [namespace] ``` 浏览器访问 `http://localhost:5601` #### 2. 配置索引模式 1. 进入 `Stack Management > Index Patterns` 2. 创建模式:`logstash-*` 3. 时间字段选择 `@timestamp` #### 3. 高级配置检查项 | 配置项 | 推荐值 | 作用 | |---------|---------|------| | `logstash_format` | true | 自动生成日期索引 | | `include_timestamp` | true | 添加@timestamp字段 | | `target_index_key` | 空 | 禁用动态索引覆盖 | --- ### 四、常见故障排查表 | 现象 | 检查点 | 解决方案 | |------|--------|----------| | 无新索引生成 | • Fluentd日志错误<br>• ES网络连通性<br>• 证书有效性 | `kubectl exec`测试ES连接<br>设置 `ssl_verify false` 临时测试 | | 401认证失败 | • 环境变量`FLUENT_ELASTICSEARCH_USER`<br>• Secret实际值 | 使用`kubectl describe secret`验证凭据 | | 字段映射错误 | • 模板文件`template_file`<br>• 数据类型冲突 | 检查`/etc/fluent/elastic-template.json`模板语法 | --- ### 五、高级调试技巧 1. **强制模板更新**: ```bash curl -u elastic:password -X DELETE "http://localhost:9200/_index_template/logstash" ``` 重启Fluentd触发模板重新上传 2. **实时日志追踪**: ```bash # 在ES中开启慢日志查询 PUT /_settings { "index.search.slowlog.threshold.query.warn": "0s" } ``` 3. **缓冲区检查**: ```bash # 查看Fluentd缓冲区状态 kubectl exec fluentd-pod -- ls -lh /buffers ``` 通过以上步骤可系统化验证日志管道的完整性。建议首次部署时逐步启用功能(先禁用buffer重试机制),待基础链路稳定后再添加高级配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值