[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"consumer-news-detail-961":3,"consumer-news-interaction-961":41,"consumer-news-related-961":44},{"detail":4,"item":36},{"card":5,"schemaVersion":23,"fields":24,"content":30},{"id":6,"kind":7,"targetType":8,"targetId":9,"subtype":7,"typeLabel":10,"title":11,"subtitle":12,"summary":13,"coverUrl":14,"badgeText":15,"href":16,"sourceName":12,"meta":17,"metrics":20,"tags":21,"resolved":22},"NEWS_ARTICLE:961","news","NEWS_ARTICLE",961,"资讯","从零搭建ELK日志采集系统：Filebeat + Logstash + ES + Kibana 保姆级教程","博客园","轻量级架构，一份配置全搞定 一、前言 你是不是还在用 tail -f 和 grep 在多台服务器上翻日志？系统一出问题，就要登录三五台机器，来回切换窗口，定位一个Bug耗时半小时。 ELK 是业界最成熟的日志集中管理方案。本文将带你用 Docker Compose 一键部署 Filebeat + L","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F1465907\u002F202609\u002F1465907-20260909162947190-195439361.png","","\u002Fnews\u002F961",[18,19],"2026","软件开发",{},[19],true,"consumer-content-detail-v1",{"sourceName":12,"authorName":25,"categoryName":19,"summary":13,"description":13,"publishTime":26,"updateTime":27,"sourceUrl":28,"language":29},"佛祖让我来巡山","2026-09-09T16:32","2026-09-11T15:22","https:\u002F\u002Fwww.cnblogs.com\u002Fsun-10387834\u002Fp\u002F22908497","中文",{"format":31,"policy":32,"normalized":22,"html":33,"text":34,"wordCount":35,"hasBody":22},"HTML","NEWS_CONTENT_V1","\u003Cblockquote>\n \u003Cp>轻量级架构，一份配置全搞定\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2>一、前言\u003C\u002Fh2>\n\u003Cp>你是不是还在用 \u003Ccode>tail -f\u003C\u002Fcode> 和 \u003Ccode>grep\u003C\u002Fcode> 在多台服务器上翻日志？系统一出问题，就要登录三五台机器，来回切换窗口，定位一个Bug耗时半小时。\u003C\u002Fp>\n\u003Cp>ELK 是业界最成熟的日志集中管理方案。本文将带你用 \u003Cstrong>Docker Compose\u003C\u002Fstrong> 一键部署 \u003Cstrong>Filebeat + Logstash + Elasticsearch + Kibana\u003C\u002Fstrong> 四件套，所有服务容器化运行，配置完整注释，你只需要复制、修改路径、启动即可。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>架构特点\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>轻量级，无需Kafka中间件\u003C\u002Fli>\n \u003Cli>Filebeat直接发送给Logstash，Logstash处理后存入ES\u003C\u002Fli>\n \u003Cli>适合中小规模项目（日日志量 &lt; 500GB）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>前提条件\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>Linux\u002FmacOS 或 Windows（WSL2）\u003C\u002Fli>\n \u003Cli>已安装 Docker 和 Docker Compose（版本 20.10+）\u003C\u002Fli>\n \u003Cli>至少 4GB 可用内存（推荐 8GB）\u003C\u002Fli>\n \u003Cli>你有一个正在运行的 Spring Boot 或其他 Java 应用，日志输出到某个目录\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2>二、整体架构（数据流向）\u003C\u002Fh2>\n\u003Cdiv>\n flowchart LR App[Spring Boot应用] --&gt;|\"写入\"| LogFile[\u002Fvar\u002Flog\u002Fmyapp\u002F*.log\u002F] LogFile --&gt;|\"tail读取\"| FB[Filebeat] FB --&gt;|\"Beats协议:5044\"| LS[Logstash] LS --&gt;|\"解析\u002F过滤\"| LS2[Logstash Filter] LS2 --&gt;|\"Bulk API:9200\"| ES[Elasticsearch] ES --&gt;|\"查询\"| Kibana[Kibana:5601] Kibana --&gt; User[👤 开发者\u002F运维]\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>每个环节的职责\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>组件\u003C\u002Fth>\n   \u003Cth>角色\u003C\u002Fth>\n   \u003Cth>一句话功能\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>Filebeat\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>采集器\u003C\u002Ftd>\n   \u003Ctd>监控日志文件变化，读取新行，发送给Logstash\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>Logstash\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>处理器\u003C\u002Ftd>\n   \u003Ctd>接收日志，用正则或JSON解析成结构化数据，输出到ES\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>Elasticsearch\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>存储&amp;检索引擎\u003C\u002Ftd>\n   \u003Ctd>存储日志，建立倒排索引，支持全文检索\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>Kibana\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>可视化界面\u003C\u002Ftd>\n   \u003Ctd>Web界面，搜索日志、制作图表\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2>三、准备工作：目录结构\u003C\u002Fh2>\n\u003Cp>我们将在当前目录下创建所有配置文件，整体结构如下：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>elk-demo\u002F\n├── docker-compose.yml          # 主编排文件\n├── filebeat\u002F\n│   └── filebeat.yml            # Filebeat 配置\n├── logstash\u002F\n│   └── pipeline\u002F\n│       └── logstash.conf       # Logstash 管道配置\n└── elasticsearch\u002F\n    └── data\u002F                   # ES数据目录（挂载卷，由docker自动创建）\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>执行以下命令创建目录：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>mkdir -p elk-demo\u002F{filebeat,logstash\u002Fpipeline,elasticsearch\u002Fdata}\ncd elk-demo\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2>四、Docker Compose 完整配置\u003C\u002Fh2>\n\u003Cp>创建 \u003Ccode>docker-compose.yml\u003C\u002Fcode> 文件，内容如下（每行都有详细注释）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>version: '3.8'\n\n# 定义网络，方便容器间通过服务名通信\nnetworks:\n  elk-net:\n    driver: bridge\n\nservices:\n  # =============================================\n  # 1. Elasticsearch：存储与检索引擎\n  # =============================================\n  elasticsearch:\n    image: docker.elastic.co\u002Felasticsearch\u002Felasticsearch:7.17.14\n    container_name: elasticsearch\n    environment:\n      # 单节点模式\n      - discovery.type=single-node\n      # 关闭安全认证（简化演示，生产环境应开启）\n      - xpack.security.enabled=false\n      # JVM堆内存，建议物理内存的50%，但不超过32GB，这里给1GB\n      - ES_JAVA_OPTS=-Xms1g -Xmx1g\n    ports:\n      - \"9200:9200\"   # REST API端口\n      - \"9300:9300\"   # 节点间通信端口\n    networks:\n      - elk-net\n    volumes:\n      # 持久化ES数据，防止重启丢失\n      - .\u002Felasticsearch\u002Fdata:\u002Fusr\u002Fshare\u002Felasticsearch\u002Fdata\n    # 生产环境需设置 ulimits\n    ulimits:\n      memlock:\n        soft: -1\n        hard: -1\n      nofile:\n        soft: 65536\n        hard: 65536\n\n  # =============================================\n  # 2. Logstash：数据处理管道\n  # =============================================\n  logstash:\n    image: docker.elastic.co\u002Flogstash\u002Flogstash:7.17.14\n    container_name: logstash\n    ports:\n      # 暴露5044端口接收来自Filebeat的Beats协议数据\n      - \"5044:5044\"\n    networks:\n      - elk-net\n    volumes:\n      # 挂载pipeline配置目录（里面放logstash.conf）\n      - .\u002Flogstash\u002Fpipeline:\u002Fusr\u002Fshare\u002Flogstash\u002Fpipeline\n    depends_on:\n      - elasticsearch   # 确保ES先启动\n    environment:\n      - LS_JAVA_OPTS=-Xmx512m   # Logstash JVM内存限制\n\n  # =============================================\n  # 3. Kibana：可视化前端\n  # =============================================\n  kibana:\n    image: docker.elastic.co\u002Fkibana\u002Fkibana:7.17.14\n    container_name: kibana\n    environment:\n      # 告诉Kibana ES的访问地址（服务名就是容器名）\n      - ELASTICSEARCH_HOSTS=http:\u002F\u002Felasticsearch:9200\n      # 界面语言设为中文\n      - I18N_LOCALE=zh-CN\n    ports:\n      - \"5601:5601\"\n    networks:\n      - elk-net\n    depends_on:\n      - elasticsearch\n\n  # =============================================\n  # 4. Filebeat：轻量级日志采集器\n  # =============================================\n  filebeat:\n    image: docker.elastic.co\u002Fbeats\u002Ffilebeat:7.17.14\n    container_name: filebeat\n    # 以root身份运行，以便读取宿主机日志文件（生产环境可指定用户）\n    user: root\n    networks:\n      - elk-net\n    volumes:\n      # 挂载Filebeat配置文件（只读）\n      - .\u002Ffilebeat\u002Ffilebeat.yml:\u002Fusr\u002Fshare\u002Ffilebeat\u002Ffilebeat.yml:ro\n      # ========== 【重要】挂载应用日志目录 ==========\n      # 将宿主机的日志路径映射到容器内，让Filebeat能读取\n      # 请将 \u002Fpath\u002Fto\u002Fyour\u002Fapp\u002Flogs 替换为你的实际日志目录\n      - \u002Fpath\u002Fto\u002Fyour\u002Fapp\u002Flogs:\u002Fvar\u002Flog\u002Fmyapp:ro\n      # 挂载Filebeat数据目录（存放registry，记录读取位置，防止重启重复采集）\n      - .\u002Ffilebeat\u002Fdata:\u002Fusr\u002Fshare\u002Ffilebeat\u002Fdata\n    depends_on:\n      - logstash\n    # 如果日志目录有权限问题，可添加以下环境变量\n    environment:\n      - TZ=Asia\u002FShanghai\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>⚠️ 需要你替换的内容\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>\u003Ccode>\u002Fpath\u002Fto\u002Fyour\u002Fapp\u002Flogs\u003C\u002Fcode>\u003C\u002Fstrong>：改为你的Spring Boot应用实际输出日志的目录，例如 \u003Ccode>\u002Fhome\u002Fubuntu\u002Fapp\u002Flogs\u003C\u002Fcode> 或 \u003Ccode>\u002Fvar\u002Flog\u002Fmyapp\u003C\u002Fcode>。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2>五、Filebeat 配置（\u003Ccode>filebeat\u002Ffilebeat.yml\u003C\u002Fcode>）\u003C\u002Fh2>\n\u003Cp>创建 \u003Ccode>filebeat\u002Ffilebeat.yml\u003C\u002Fcode>，内容如下：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># ==============================================\n# Filebeat 配置文件\n# ==============================================\n\n# ---------- 输入（从哪里读日志） ----------\nfilebeat.inputs:\n- type: log                    # 日志类型\n  enabled: true                # 启用该输入\n  paths:\n    # 容器内路径，对应于宿主机挂载的日志目录\n    - \u002Fvar\u002Flog\u002Fmyapp\u002F*.log     # 请确保这里与docker-compose中的挂载路径一致\n  \n  # ---------- 多行处理（Java异常堆栈） ----------\n  # 如果日志以日期时间开头，认为是一条新日志的开始\n  multiline.pattern: '^\\d{4}-\\d{2}-\\d{2}'\n  multiline.negate: true       # 不匹配时合并到上一行\n  multiline.match: after       # 合并在上一行之后\n\n  # ---------- 添加自定义字段（便于日志分类） ----------\n  fields:\n    app_name: \"my-springboot-app\"    # 应用名称，可自定义\n    env: \"prod\"                      # 环境标识\n  fields_under_root: true            # 使fields成为顶级字段\n\n# ---------- 内部队列（调整吞吐性能） ----------\nqueue.mem:\n  events: 4096                 # 内存队列最大事件数\n  flush.min_events: 1024      # 达到该数量即发送\n  flush.timeout: 5s           # 超时强制发送\n\n# ---------- 输出（发往哪里） ----------\noutput.logstash:\n  # Logstash的服务名和端口（在docker-compose中定义为logstash）\n  hosts: [\"logstash:5044\"]\n\n# ---------- 日志记录（Filebeat自身的日志） ----------\nlogging.level: info\nlogging.to_files: true\nlogging.files:\n  path: \u002Fvar\u002Flog\u002Ffilebeat\n  name: filebeat\n  keepfiles: 7\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>配置要点说明\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Ccode>multiline\u003C\u002Fcode> 配置处理 Java 异常堆栈，确保一个完整的异常作为一条事件发送。\u003C\u002Fli>\n \u003Cli>\u003Ccode>fields\u003C\u002Fcode> 中可添加任何你想要的标签，后续在 Kibana 中可作为过滤条件。\u003C\u002Fli>\n \u003Cli>\u003Ccode>queue.mem\u003C\u002Fcode> 调整攒批行为，适当调大 \u003Ccode>flush.min_events\u003C\u002Fcode> 可减少网络请求，提升吞吐。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2>六、Logstash 配置（\u003Ccode>logstash\u002Fpipeline\u002Flogstash.conf\u003C\u002Fcode>）\u003C\u002Fh2>\n\u003Cp>Logstash 的管道配置分为三个阶段：\u003Cstrong>input → filter → output\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cp>创建 \u003Ccode>logstash\u002Fpipeline\u002Flogstash.conf\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># ==============================================\n# Logstash 管道配置\n# ==============================================\n\ninput {\n  # 接收来自Filebeat的Beats协议数据\n  beats {\n    port =&gt; 5044\n    # 可设置客户端IP白名单等，此处省略\n  }\n}\n\n# ==============================================\n# 过滤器（数据解析与转换）\n# ==============================================\nfilter {\n  # ----- 情况1：如果你的日志已经是JSON格式（推荐） -----\n  # 例如通过logback的logstash-encoder输出\n  # 则直接解析JSON，无需Grok\n  json {\n    source =&gt; \"message\"\n    # 如果解析失败，会标记 _jsonparsefailure，可忽略或处理\n    skip_on_invalid_json =&gt; true\n  }\n\n  # ----- 情况2：如果是纯文本日志，使用Grok解析 -----\n  # 取消下面注释，并注释掉上面的json块\n  # grok {\n  #   match =&gt; { \n  #     \"message\" =&gt; \"%{TIMESTAMP_ISO8601:timestamp} \\[%{LOGLEVEL:level}\\] %{GREEDYDATA:message_content}\" \n  #   }\n  #   overwrite =&gt; [ \"message\" ]   # 将原始message替换为解析后的内容\n  # }\n\n  # ----- 通用处理：添加\u002F修改字段 -----\n  # 将时间字符串转为ES中的@timestamp字段（用于时间轴排序）\n  if [timestamp] {\n    date {\n      match =&gt; [ \"timestamp\", \"ISO8601\" ]\n      target =&gt; \"@timestamp\"\n    }\n  }\n\n  # 删除原始message字段（如果已经解析成结构化数据，可减少存储量）\n  # mutate { remove_field =&gt; [ \"message\" ] }\n\n  # 添加一个静态字段标识数据来源\n  mutate {\n    add_field =&gt; { \"data_source\" =&gt; \"filebeat\" }\n  }\n}\n\n# ==============================================\n# 输出（发往Elasticsearch）\n# ==============================================\noutput {\n  elasticsearch {\n    # ES服务地址（docker-compose中的服务名）\n    hosts =&gt; [\"elasticsearch:9200\"]\n    # 索引名称模式：按天切分，便于管理\n    index =&gt; \"app-logs-%{+YYYY.MM.dd}\"\n    # 批量写入大小\n    bulk_size =&gt; 5000\n    # 超时时间\n    bulk_timeout =&gt; \"60s\"\n    # 如果不想使用默认的模板，可自定义\n    # template =&gt; \"\u002Fusr\u002Fshare\u002Flogstash\u002Ftemplates\u002Fmy-template.json\"\n    # template_name =&gt; \"my-app-logs\"\n  }\n\n  # 调试时输出到控制台（查看容器日志可见）\n  stdout {\n    codec =&gt; rubydebug\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>注意\u003C\u002Fstrong>：如果你的应用日志已经输出为 JSON 格式（通过 Logback 的 \u003Ccode>logstash-logback-encoder\u003C\u002Fcode>），则使用 \u003Ccode>json\u003C\u002Fcode> 过滤器效率最高，无需 Grok 正则。如果应用输出的是纯文本，请注释掉 \u003Ccode>json\u003C\u002Fcode> 块，启用 \u003Ccode>grok\u003C\u002Fcode> 块，并根据你的日志格式调整正则表达式。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>七、启动服务\u003C\u002Fh2>\n\u003Cp>所有配置就绪后，在 \u003Ccode>elk-demo\u003C\u002Fcode> 目录下执行：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 启动所有容器（后台运行）\ndocker-compose up -d\n\n# 查看容器状态\ndocker-compose ps\n\n# 查看实时日志\ndocker-compose logs -f\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>如果启动成功，你应该能看到四个容器都在运行。如果 Filebeat 挂载的日志目录存在且有日志文件，Filebeat 会立即开始读取并发送。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>八、验证日志链路\u003C\u002Fh2>\n\u003Ch3>1. 检查 Elasticsearch 是否正常\u003C\u002Fh3>\n\u003Cp>访问 \u003Ccode>http:\u002F\u002Flocalhost:9200\u003C\u002Fcode>，应返回 JSON 信息。\u003C\u002Fp>\n\u003Ch3>2. 检查索引是否创建\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>curl -X GET \"localhost:9200\u002F_cat\u002Findices?v\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>如果看到 \u003Ccode>app-logs-2026.09.09\u003C\u002Fcode> 类似的索引，说明日志已写入。\u003C\u002Fp>\n\u003Ch3>3. 在 Kibana 中查看日志\u003C\u002Fh3>\n\u003Col>\n \u003Cli>访问 \u003Ccode>http:\u002F\u002Flocalhost:5601\u003C\u002Fcode>\u003C\u002Fli>\n \u003Cli>左侧菜单 → \u003Cstrong>Stack Management → Index Patterns\u003C\u002Fstrong>\u003C\u002Fli>\n \u003Cli>点击 \u003Cstrong>Create index pattern\u003C\u002Fstrong>\u003C\u002Fli>\n \u003Cli>输入 \u003Ccode>app-logs-*\u003C\u002Fcode>，点击 Next step\u003C\u002Fli>\n \u003Cli>选择 \u003Cstrong>@timestamp\u003C\u002Fstrong> 作为时间字段，点击 Create\u003C\u002Fli>\n \u003Cli>左侧菜单 → \u003Cstrong>Discover\u003C\u002Fstrong>，选择刚创建的索引模式，即可看到日志列表\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>在搜索框中可以输入条件过滤，例如：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Ccode>level: \"ERROR\"\u003C\u002Fcode> → 只查错误日志\u003C\u002Fli>\n \u003Cli>\u003Ccode>app_name: \"my-springboot-app\"\u003C\u002Fcode> → 查特定应用\u003C\u002Fli>\n \u003Cli>\u003Ccode>message: \"超时\"\u003C\u002Fcode> → 包含关键词\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F1465907\u002F202609\u002F1465907-20260909162947190-195439361.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>九、常见问题与避坑指南\u003C\u002Fh2>\n\u003Ch3>9.1 Filebeat 无法读取日志文件（权限问题）\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>现象\u003C\u002Fstrong>：容器日志显示 \u003Ccode>permission denied\u003C\u002Fcode>。\u003Cbr>\u003Cstrong>解决\u003C\u002Fstrong>：在 \u003Ccode>docker-compose.yml\u003C\u002Fcode> 中 Filebeat 服务添加 \u003Ccode>user: root\u003C\u002Fcode>（已添加），或确保宿主机日志目录对 other 有读权限（\u003Ccode>chmod o+r\u003C\u002Fcode>）。\u003C\u002Fp>\n\u003Ch3>9.2 Logstash 无法连接 Elasticsearch\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>现象\u003C\u002Fstrong>：Logstash 日志报错 \u003Ccode>Connection refused\u003C\u002Fcode>。\u003Cbr>\u003Cstrong>解决\u003C\u002Fstrong>：确保 Elasticsearch 容器已完全启动，且环境变量 \u003Ccode>ELASTICSEARCH_HOSTS\u003C\u002Fcode> 配置正确。可以进入 Logstash 容器用 \u003Ccode>curl elasticsearch:9200\u003C\u002Fcode> 测试连通性。\u003C\u002Fp>\n\u003Ch3>9.3 Kibana 中看不到日志\u003C\u002Fh3>\n\u003Cul>\n \u003Cli>检查索引模式是否创建正确（名称与 Logstash 输出的索引一致）。\u003C\u002Fli>\n \u003Cli>检查 Discover 页面的时间选择器是否正确（例如选择 “Last 15 minutes”）。\u003C\u002Fli>\n \u003Cli>检查 Elasticsearch 中是否有数据（用 \u003Ccode>_cat\u002Findices\u003C\u002Fcode> 命令查看）。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>9.4 日志重复或丢失\u003C\u002Fh3>\n\u003Cp>Filebeat 维护一个 registry 记录读取位置，如果挂载了 \u003Ccode>data\u003C\u002Fcode> 目录，重启后不会重复读取。如果发现重复，可以删除 \u003Ccode>.\u002Ffilebeat\u002Fdata\u003C\u002Fcode> 目录（会丢失进度），但生产环境不建议。\u003C\u002Fp>\n\u003Ch3>9.5 容器启动顺序问题\u003C\u002Fh3>\n\u003Cp>Docker Compose 的 \u003Ccode>depends_on\u003C\u002Fcode> 仅保证启动顺序，不保证服务完全就绪。如果 Logstash 启动时 ES 还未就绪，会重试，最终会连接成功。\u003C\u002Fp>\n\u003Ch3>9.6 磁盘空间不足\u003C\u002Fh3>\n\u003Cp>ES 默认不限制索引保留时间，建议配置 ILM（索引生命周期管理）自动删除过期数据。简单方式：在 Kibana 中创建 ILM 策略，或定期执行 curl 删除旧索引。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>十、进阶优化建议\u003C\u002Fh2>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>优化点\u003C\u002Fth>\n   \u003Cth>建议\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>日志格式\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>在 Spring Boot 中配置 Logback 输出 JSON 格式（使用 \u003Ccode>logstash-logback-encoder\u003C\u002Fcode>），可避免 Logstash 的 Grok 解析，极大提升性能。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>Filebeat 多行合并\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>根据你的日志格式调整 \u003Ccode>multiline.pattern\u003C\u002Fcode>，确保异常堆栈完整采集。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>Logstash 性能\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>调整 \u003Ccode>pipeline.workers\u003C\u002Fcode> 和 \u003Ccode>pipeline.batch.size\u003C\u002Fcode>（在 \u003Ccode>logstash.yml\u003C\u002Fcode> 中配置），适应日志量。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>ES 内存\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>根据物理内存调整 \u003Ccode>ES_JAVA_OPTS\u003C\u002Fcode>，至少分配 2GB。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>索引生命周期\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>配置 ILM 自动将超过 7 天的索引转为只读或删除，保持集群健康。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Cstrong>监控告警\u003C\u002Fstrong>\u003C\u002Ftd>\n   \u003Ctd>为 ELK 组件添加监控（如 Prometheus + Grafana），及时发现问题。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2>十一、总结\u003C\u002Fh2>\n\u003Cp>通过本教程，你已经拥有了一套完整的 ELK 日志采集系统：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>Filebeat\u003C\u002Fstrong> 实时采集日志文件，通过 Beats 协议发送给 \u003Cstrong>Logstash\u003C\u002Fstrong>\u003C\u002Fli>\n \u003Cli>\u003Cstrong>Logstash\u003C\u002Fstrong> 解析并结构化日志，存入 \u003Cstrong>Elasticsearch\u003C\u002Fstrong>\u003C\u002Fli>\n \u003Cli>\u003Cstrong>Kibana\u003C\u002Fstrong> 提供强大的搜索和可视化界面\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>所有服务运行在 Docker 容器中，配置完全透明，你可以随时调整。这种架构适合大多数中小企业及开发测试环境，足够稳定且易于维护。\u003C\u002Fp>\n\u003Cp>现在，当线上出现问题时，你只需打开 Kibana，输入关键词，就能在几秒内定位到具体日志，排查效率提升 10 倍以上。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>下一步行动\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Col>\n \u003Cli>将你的应用日志目录挂载到 Filebeat 容器中\u003C\u002Fli>\n \u003Cli>根据你的日志格式，调整 Logstash 的解析规则\u003C\u002Fli>\n \u003Cli>在 Kibana 中创建仪表盘，监控关键指标\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>如果在实践中遇到问题，欢迎在评论区留言交流！\u003C\u002Fp>","轻量级架构，一份配置全搞定 一、前言 你是不是还在用 tail -f 和 grep 在多台服务器上翻日志？系统一出问题，就要登录三五台机器，来回切换窗口，定位一个Bug耗时半小时。 ELK 是业界最成熟的日志集中管理方案。本文将带你用 Docker Compose 一键部署 Filebeat + Logstash + Elasticsearch + Kibana 四件套，所有服务容器化运行，配置完整注释，你只需要复制、修改路径、启动即可。 架构特点： 轻量级，无需Kafka中间件 Filebeat直接发送给Logstash，Logstash处理后存入ES 适合中小规模项目（日日志量 \u003C 500GB） 前提条件： Linux\u002FmacOS 或 Windows（WSL2） 已安装 Docker 和 Docker Compose（版本 20.10+） 至少 4GB 可用内存（推荐 8GB） 你有一个正在运行的 Spring Boot 或其他 Java 应用，日志输出到某个目录 二、整体架构（数据流向） flowchart LR App[Spring Boot应用] -->|\"写入\"| LogFile[\u002Fvar\u002Flog\u002Fmyapp\u002F*.log\u002F] LogFile -->|\"tail读取\"| FB[Filebeat] FB -->|\"Beats协议:5044\"| LS[Logstash] LS -->|\"解析\u002F过滤\"| LS2[Logstash Filter] LS2 -->|\"Bulk API:9200\"| ES[Elasticsearch] ES -->|\"查询\"| Kibana[Kibana:5601] Kibana --> User[👤 开发者\u002F运维] 每个环节的职责： 组件 角色 一句话功能 Filebeat 采集器 监控日志文件变化，读取新行，发送给Logstash Logstash 处理器 接收日志，用正则或JSON解析成结构化数据，输出到ES Elasticsearch 存储&检索引擎 存储日志，建立倒排索引，支持全文检索 Kibana 可视化界面 Web界面，搜索日志、制作图表 三、准备工作：目录结构 我们将在当前目录下创建所有配置文件，整体结构如下： elk-demo\u002F ├── docker-compose.yml # 主编排文件 ├── filebeat\u002F │ └── filebeat.yml # Filebeat 配置 ├── logstash\u002F │ └── pipeline\u002F │ └── logstash.conf # Logstash 管道配置 └── elasticsearch\u002F └── data\u002F # ES数据目录（挂载卷，由docker自动创建） 执行以下命令创建目录： mkdir -p elk-demo\u002F{filebeat,logstash\u002Fpipeline,elasticsearch\u002Fdata} cd elk-demo 四、Docker Compose 完整配置 创建 docker-compose.yml 文件，内容如下（每行都有详细注释）： version: '3.8' # 定义网络，方便容器间通过服务名通信 networks: elk-net: driver: bridge services: # ============================================= # 1. Elasticsearch：存储与检索引擎 # ============================================= elasticsearch: image: docker.elastic.co\u002Felasticsearch\u002Felasticsearch:7.17.14 container_name: elasticsearch environment: # 单节点模式 - discovery.type=single-node # 关闭安全认证（简化演示，生产环境应开启） - xpack.security.enabled=false # JVM堆内存，建议物理内存的50%，但不超过32GB，这里给1GB - ES_JAVA_OPTS=-Xms1g -Xmx1g ports: - \"9200:9200\" # REST API端口 - \"9300:9300\" # 节点间通信端口 networks: - elk-net volumes: # 持久化ES数据，防止重启丢失 - .\u002Felasticsearch\u002Fdata:\u002Fusr\u002Fshare\u002Felasticsearch\u002Fdata # 生产环境需设置 ulimits ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 # ============================================= # 2. Logstash：数据处理管道 # ============================================= logstash: image: docker.elastic.co\u002Flogstash\u002Flogstash:7.17.14 container_name: logstash ports: # 暴露5044端口接收来自Filebeat的Beats协议数据 - \"5044:5044\" networks: - elk-net volumes: # 挂载pipeline配置目录（里面放logstash.conf） - .\u002Flogstash\u002Fpipeline:\u002Fusr\u002Fshare\u002Flogstash\u002Fpipeline depends_on: - elasticsearch # 确保ES先启动 environment: - LS_JAVA_OPTS=-Xmx512m # Logstash JVM内存限制 # ============================================= # 3. Kibana：可视化前端 # ============================================= kibana: image: docker.elastic.co\u002Fkibana\u002Fkibana:7.17.14 container_name: kibana environment: # 告诉Kibana ES的访问地址（服务名就是容器名） - ELASTICSEARCH_HOSTS=http:\u002F\u002Felasticsearch:9200 # 界面语言设为中文 - I18N_LOCALE=zh-CN ports: - \"5601:5601\" networks: - elk-net depends_on: - elasticsearch # ============================================= # 4. Filebeat：轻量级日志采集器 # ============================================= filebeat: image: docker.elastic.co\u002Fbeats\u002Ffilebeat:7.17.14 container_name: filebeat # 以root身份运行，以便读取宿主机日志文件（生产环境可指定用户） user: root networks: - elk-net volumes: # 挂载Filebeat配置文件（只读） - .\u002Ffilebeat\u002Ffilebeat.yml:\u002Fusr\u002Fshare\u002Ffilebeat\u002Ffilebeat.yml:ro # ========== 【重要】挂载应用日志目录 ========== # 将宿主机的日志路径映射到容器内，让Filebeat能读取 # 请将 \u002Fpath\u002Fto\u002Fyour\u002Fapp\u002Flogs 替换为你的实际日志目录 - \u002Fpath\u002Fto\u002Fyour\u002Fapp\u002Flogs:\u002Fvar\u002Flog\u002Fmyapp:ro # 挂载Filebeat数据目录（存放registry，记录读取位置，防止重启重复采集） - .\u002Ffilebeat\u002Fdata:\u002Fusr\u002Fshare\u002Ffilebeat\u002Fdata depends_on: - logstash # 如果日志目录有权限问题，可添加以下环境变量 environment: - TZ=Asia\u002FShanghai ⚠️ 需要你替换的内容： \u002Fpath\u002Fto\u002Fyour\u002Fapp\u002Flogs：改为你的Spring Boot应用实际输出日志的目录，例如 \u002Fhome\u002Fubuntu\u002Fapp\u002Flogs 或 \u002Fvar\u002Flog\u002Fmyapp。 五、Filebeat 配置（filebeat\u002Ffilebeat.yml） 创建 filebeat\u002Ffilebeat.yml，内容如下： # ============================================== # Filebeat 配置文件 # ============================================== # ---------- 输入（从哪里读日志） ---------- filebeat.inputs: - type: log # 日志类型 enabled: true # 启用该输入 paths: # 容器内路径，对应于宿主机挂载的日志目录 - \u002Fvar\u002Flog\u002Fmyapp\u002F*.log # 请确保这里与docker-compose中的挂载路径一致 # ---------- 多行处理（Java异常堆栈） ---------- # 如果日志以日期时间开头，认为是一条新日志的开始 multiline.pattern: '^\\d{4}-\\d{2}-\\d{2}' multiline.negate: true # 不匹配时合并到上一行 multiline.match: after # 合并在上一行之后 # ---------- 添加自定义字段（便于日志分类） ---------- fields: app_name: \"my-springboot-app\" # 应用名称，可自定义 env: \"prod\" # 环境标识 fields_under_root: true # 使fields成为顶级字段 # ---------- 内部队列（调整吞吐性能） ---------- queue.mem: events: 4096 # 内存队列最大事件数 flush.min_events: 1024 # 达到该数量即发送 flush.timeout: 5s # 超时强制发送 # ---------- 输出（发往哪里） ---------- output.logstash: # Logstash的服务名和端口（在docker-compose中定义为logstash） hosts: [\"logstash:5044\"] # ---------- 日志记录（Filebeat自身的日志） ---------- logging.level: info logging.to_files: true logging.files: path: \u002Fvar\u002Flog\u002Ffilebeat name: filebeat keepfiles: 7 配置要点说明： multiline 配置处理 Java 异常堆栈，确保一个完整的异常作为一条事件发送。 fields 中可添加任何你想要的标签，后续在 Kibana 中可作为过滤条件。 queue.mem 调整攒批行为，适当调大 flush.min_events 可减少网络请求，提升吞吐。 六、Logstash 配置（logstash\u002Fpipeline\u002Flogstash.conf） Logstash 的管道配置分为三个阶段：input → filter → output。 创建 logstash\u002Fpipeline\u002Flogstash.conf： # ============================================== # Logstash 管道配置 # ============================================== input { # 接收来自Filebeat的Beats协议数据 beats { port => 5044 # 可设置客户端IP白名单等，此处省略 } } # ============================================== # 过滤器（数据解析与转换） # ============================================== filter { # ----- 情况1：如果你的日志已经是JSON格式（推荐） ----- # 例如通过logback的logstash-encoder输出 # 则直接解析JSON，无需Grok json { source => \"message\" # 如果解析失败，会标记 _jsonparsefailure，可忽略或处理 skip_on_invalid_json => true } # ----- 情况2：如果是纯文本日志，使用Grok解析 ----- # 取消下面注释，并注释掉上面的json块 # grok { # match => { # \"message\" => \"%{TIMESTAMP_ISO8601:timestamp} \\[%{LOGLEVEL:level}\\] %{GREEDYDATA:message_content}\" # } # overwrite => [ \"message\" ] # 将原始message替换为解析后的内容 # } # ----- 通用处理：添加\u002F修改字段 ----- # 将时间字符串转为ES中的@timestamp字段（用于时间轴排序） if [timestamp] { date { match => [ \"timestamp\", \"ISO8601\" ] target => \"@timestamp\" } } # 删除原始message字段（如果已经解析成结构化数据，可减少存储量） # mutate { remove_field => [ \"message\" ] } # 添加一个静态字段标识数据来源 mutate { add_field => { \"data_source\" => \"filebeat\" } } } # ============================================== # 输出（发往Elasticsearch） # ============================================== output { elasticsearch { # ES服务地址（docker-compose中的服务名） hosts => [\"elasticsearch:9200\"] # 索引名称模式：按天切分，便于管理 index => \"app-logs-%{+YYYY.MM.dd}\" # 批量写入大小 bulk_size => 5000 # 超时时间 bulk_timeout => \"60s\" # 如果不想使用默认的模板，可自定义 # template => \"\u002Fusr\u002Fshare\u002Flogstash\u002Ftemplates\u002Fmy-template.json\" # template_name => \"my-app-logs\" } # 调试时输出到控制台（查看容器日志可见） stdout { codec => rubydebug } } 注意：如果你的应用日志已经输出为 JSON 格式（通过 Logback 的 logstash-logback-encoder），则使用 json 过滤器效率最高，无需 Grok 正则。如果应用输出的是纯文本，请注释掉 json 块，启用 grok 块，并根据你的日志格式调整正则表达式。 七、启动服务 所有配置就绪后，在 elk-demo 目录下执行： # 启动所有容器（后台运行） docker-compose up -d # 查看容器状态 docker-compose ps # 查看实时日志 docker-compose logs -f 如果启动成功，你应该能看到四个容器都在运行。如果 Filebeat 挂载的日志目录存在且有日志文件，Filebeat 会立即开始读取并发送。 八、验证日志链路 1. 检查 Elasticsearch 是否正常 访问 http:\u002F\u002Flocalhost:9200，应返回 JSON 信息。 2. 检查索引是否创建 curl -X GET \"localhost:9200\u002F_cat\u002Findices?v\" 如果看到 app-logs-2026.09.09 类似的索引，说明日志已写入。 3. 在 Kibana 中查看日志 访问 http:\u002F\u002Flocalhost:5601 左侧菜单 → Stack Management → Index Patterns 点击 Create index pattern 输入 app-logs-*，点击 Next step 选择 @timestamp 作为时间字段，点击 Create 左侧菜单 → Discover，选择刚创建的索引模式，即可看到日志列表 在搜索框中可以输入条件过滤，例如： level: \"ERROR\" → 只查错误日志 app_name: \"my-springboot-app\" → 查特定应用 message: \"超时\" → 包含关键词 九、常见问题与避坑指南 9.1 Filebeat 无法读取日志文件（权限问题） 现象：容器日志显示 permission denied。 解决：在 docker-compose.yml 中 Filebeat 服务添加 user: root（已添加），或确保宿主机日志目录对 other 有读权限（chmod o+r）。 9.2 Logstash 无法连接 Elasticsearch 现象：Logstash 日志报错 Connection refused。 解决：确保 Elasticsearch 容器已完全启动，且环境变量 ELASTICSEARCH_HOSTS 配置正确。可以进入 Logstash 容器用 curl elasticsearch:9200 测试连通性。 9.3 Kibana 中看不到日志 检查索引模式是否创建正确（名称与 Logstash 输出的索引一致）。 检查 Discover 页面的时间选择器是否正确（例如选择 “Last 15 minutes”）。 检查 Elasticsearch 中是否有数据（用 _cat\u002Findices 命令查看）。 9.4 日志重复或丢失 Filebeat 维护一个 registry 记录读取位置，如果挂载了 data 目录，重启后不会重复读取。如果发现重复，可以删除 .\u002Ffilebeat\u002Fdata 目录（会丢失进度），但生产环境不建议。 9.5 容器启动顺序问题 Docker Compose 的 depends_on 仅保证启动顺序，不保证服务完全就绪。如果 Logstash 启动时 ES 还未就绪，会重试，最终会连接成功。 9.6 磁盘空间不足 ES 默认不限制索引保留时间，建议配置 ILM（索引生命周期管理）自动删除过期数据。简单方式：在 Kibana 中创建 ILM 策略，或定期执行 curl 删除旧索引。 十、进阶优化建议 优化点 建议 日志格式 在 Spring Boot 中配置 Logback 输出 JSON 格式（使用 logstash-logback-encoder），可避免 Logstash 的 Grok 解析，极大提升性能。 Filebeat 多行合并 根据你的日志格式调整 multiline.pattern，确保异常堆栈完整采集。 Logstash 性能 调整 pipeline.workers 和 pipeline.batch.size（在 logstash.yml 中配置），适应日志量。 ES 内存 根据物理内存调整 ES_JAVA_OPTS，至少分配 2GB。 索引生命周期 配置 ILM 自动将超过 7 天的索引转为只读或删除，保持集群健康。 监控告警 为 ELK 组件添加监控（如 Prometheus + Grafana），及时发现问题。 十一、总结 通过本教程，你已经拥有了一套完整的 ELK 日志采集系统： Filebeat 实时采集日志文件，通过 Beats 协议发送给 Logstash Logstash 解析并结构化日志，存入 Elasticsearch Kibana 提供强大的搜索和可视化界面 所有服务运行在 Docker 容器中，配置完全透明，你可以随时调整。这种架构适合大多数中小企业及开发测试环境，足够稳定且易于维护。 现在，当线上出现问题时，你只需打开 Kibana，输入关键词，就能在几秒内定位到具体日志，排查效率提升 10 倍以上。 下一步行动： 将你的应用日志目录挂载到 Filebeat 容器中 根据你的日志格式，调整 Logstash 的解析规则 在 Kibana 中创建仪表盘，监控关键指标 如果在实践中遇到问题，欢迎在评论区留言交流！",8032,{"id":6,"kind":7,"title":11,"summary":13,"image":14,"href":16,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":40},"2026 · 软件开发","#2563eb","16 \u002F 10",[19],{"targetType":8,"targetId":9,"likedByMe":42,"likeCount":43,"commentCount":43,"contentLikeCount":43,"contentCommentCount":43,"sourceLikeCount":43,"sourceCommentCount":43},false,0,[45,52,58,65,72,78,84,91],{"id":46,"kind":7,"title":47,"summary":48,"image":49,"href":50,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":51},"NEWS_ARTICLE:927","HelloCrab - 短视频开源爬虫，仅供学习参考","HelloCrab 基于 Avalonia、Playwright、AI与 FFmpeg 的跨平台桌面采集器，支持9大平台，以及 Android、iOS、Browser 远程控制端。 Made By ChatGPT &amp; Vincent with ❤ 平台 是否接入 哔哩哔哩 ✅ 抖音 ✅ 快手","https:\u002F\u002Fwww.cnblogs.com\u002Fhupo376787\u002Fp\u002FScreenshot\u002FWindows.jpg","\u002Fnews\u002F927",[19],{"id":53,"kind":7,"title":54,"summary":55,"image":15,"href":56,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":57},"NEWS_ARTICLE:929",".NET 异常处理的\"暗门\"：代码里写满 catch，你依然能抓住它——从一个 AI Agent 运行时的源码说起","一个健壮的系统，必然到处都是有意的 catch；异常被消化不等于问题不存在。 观测与韧性，是一个硬币的两面——降级逻辑保证系统不崩，FirstChance 保证你能看见它为什么降级。","\u002Fnews\u002F929",[19],{"id":59,"kind":7,"title":60,"summary":61,"image":62,"href":63,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":64},"NEWS_ARTICLE:933","写给 C++ 工程师的 OpenClaw.NET 上手指南：用你熟悉的 C++ 思维，跑起一个生产级 AI Agent","它像一个「基于 boost.asio + REST 端点的常驻服务」——对外是 HTTP \u002F WebSocket \u002F 各 IM 的 webhook，对内跑着一个能调工具、读写记忆、跨渠道对话的 AI Agent——只不过协程不用你手写 promise_type，内存不用你管 new\u002Fdelete。","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F510\u002F202609\u002F510-20260905070811424-1837144874.jpg","\u002Fnews\u002F933",[19],{"id":66,"kind":7,"title":67,"summary":68,"image":69,"href":70,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":71},"NEWS_ARTICLE:952",".NET 11 RC1 发布：拿到\"准生证\"，生产环境可以上了！","从 Preview 1 到 RC1，.NET 11 的拼图基本完整了：Runtime Async 反超状态机模型、CoreCLR 登陆 WebAssembly、CLI 全面 NativeAOT 化（dotnet tool list 快 5.5 倍）、C# 15 补齐 union 和 labeled","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F510\u002F202609\u002F510-20260909153805786-850851443.png","\u002Fnews\u002F952",[19],{"id":73,"kind":7,"title":74,"summary":75,"image":62,"href":76,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":77},"NEWS_ARTICLE:980","写给 Rust 工程师的 OpenClaw.NET 上手指南：用你熟悉的 Rust 思维，跑起一个生产级 AI Agent","它像一个「axum 应用」——对外是 HTTP \u002F WebSocket \u002F 各 IM 的 webhook，对内跑着一个能调工具、读写记忆、跨渠道对话的 AI Agent——只不过 async 不用选 runtime，也不用和借用检查器格斗。","\u002Fnews\u002F980",[19],{"id":79,"kind":7,"title":80,"summary":81,"image":15,"href":82,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":83},"NEWS_ARTICLE:999","Vane.Dispatch 1.0.0 发布：一个与容器、传输层零耦合的 .NET 服务分发引擎","Vane.Dispatch 1.0.0 发布：一个与容器、传输层零耦合的 .NET 服务分发引擎 它的前身，可以追溯到一个叫 Ndf 的项目。从那时算起，已经过去了十多年。今天，它以 Vane.Dispatch 1.0.0 的名字正式发布。 序：十年磨一剑 做后端的人大抵都绕不开同一个问题：如何把&","\u002Fnews\u002F999",[19],{"id":85,"kind":7,"title":86,"summary":87,"image":88,"href":89,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":90},"NEWS_ARTICLE:1002","从对标 Java 到对标 Go：Native AOT 的\"无痛化\"之路，走到哪一站了？","从 .NET 7 的 demo 到 .NET 12 的无痛化，这条路要走五年。慢吗？慢。但对比一下：Java 的 GraalVM Native Image 折腾了更久，至今 Spring 生态的 AOT 体验仍在打补丁；Go 则是天生就站在终点线上——.NET 是在背着二十年的反射遗产追赶一个轻装上","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F510\u002F202609\u002F510-20260907133134585-1733425989.png","\u002Fnews\u002F1002",[19],{"id":92,"kind":7,"title":93,"summary":94,"image":15,"href":95,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":96},"NEWS_ARTICLE:1012","java 多线程开发系列之八：玩转多线程（线程的中断）","之前的线程协作，讲的是通过wait和notify方法，多线程之间进行互相条件唤醒的办法。除此之外我们还需要进行中断操作。等待和唤醒可参考前文https:\u002F\u002Fwww.cnblogs.com\u002Fjilodream\u002Fp\u002F22770136设想这样一个场景：长工在给地主家干活，日出而作，日落而息。思路很简单：","\u002Fnews\u002F1012",[19]]