1. 日志收集方案整体设计
在RockyLinux 9.6环境下,我们需要构建一套完整的日志收集系统,用于处理Docker Compose部署的SpringBoot2+Vue3应用产生的各类日志。ELK 7.17.10版本作为成熟的日志解决方案,其组件兼容性和稳定性已经过长期验证。
1.1 技术栈选型考量
选择ELK 7.17.10版本主要基于以下考虑:
- 与RockyLinux 9.6的内核版本(5.14.0-362)完美兼容
- 对Java应用日志的解析支持成熟(SpringBoot2采用Logback默认配置)
- 对前端Vue3的console日志收集有现成的Filebeat模块
- 版本稳定性经过企业级验证,避免了最新版可能存在的兼容性问题
日志收集路径设计:
SpringBoot2应用日志 → Docker日志驱动 → Filebeat → Logstash Vue3前端日志 → Nginx访问日志 → Filebeat → Logstash 系统组件日志 → Journald → Filebeat → Logstash1.2 环境准备清单
硬件建议配置:
- 测试环境:4核CPU/8GB内存/100GB SSD(单节点部署所有组件)
- 生产环境:建议3节点集群(8核CPU/16GB内存/500GB SSD ×3)
软件依赖:
- RockyLinux 9.6基础系统(最小化安装)
- Docker CE 24.0+(含Compose插件)
- JDK11(SpringBoot2运行依赖)
- Node.js 16+(Vue3构建依赖)
2. ELK组件部署与配置
2.1 Elasticsearch部署优化
docker-compose.yml关键配置片段:
services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10 environment: - discovery.type=single-node - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms4g -Xmx4g" ulimits: memlock: soft: -1 hard: -1 volumes: - es_data:/usr/share/elasticsearch/data ports: - "9200:9200"重要参数说明:
discovery.type=single-node:单节点模式简化部署-Xms4g -Xmx4g:JVM堆内存设置为物理内存的50%memlock:禁用内存交换以保证性能
注意:生产环境务必配置
vm.max_map_count=262144内核参数,通过sysctl -w vm.max_map_count=262144设置
2.2 Logstash管道配置
处理SpringBoot日志的logstash.conf核心配置:
input { beats { port => 5044 } } filter { # 处理SpringBoot JSON日志 if [fields][log_type] == "springboot" { json { source => "message" target => "log_content" } date { match => ["log_content.timestamp", "ISO8601"] target => "@timestamp" } } # 处理Vue前端日志 if [fields][log_type] == "frontend" { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" } } } } output { elasticsearch { hosts => ["elasticsearch:9200"] index => "%{[fields][log_source]}-%{+YYYY.MM.dd}" } }2.3 Kibana可视化配置
建议创建的初始仪表板:
- 应用错误看板:过滤SpringBoot日志中ERROR级别记录
- 前端性能看板:统计Vue应用页面加载时间
- 系统健康看板:监控容器CPU/内存使用情况
关键索引模式命名规范:
springboot-*:后端应用日志frontend-*:前端访问日志infra-*:基础设施日志
3. 日志收集实现细节
3.1 SpringBoot日志收集方案
SpringBoot的logback-spring.xml配置示例:
<configuration> <appender name="JSON" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <customFields>{"app":"${APP_NAME}","env":"${SPRING_PROFILES_ACTIVE}"}</customFields> </encoder> </appender> <root level="INFO"> <appender-ref ref="JSON" /> </root> </configuration>对应的Filebeat配置:
- type: container paths: - '/var/lib/docker/containers/*/*.log' processors: - add_docker_metadata: ~ - decode_json_fields: fields: ["message"] target: "" - add_fields: fields: log_type: springboot log_source: my-springboot-app3.2 Vue3日志收集方案
前端日志收集需要两步处理:
- Nginx配置增加日志格式化:
log_format json_combined escape=json '{' '"time_local":"$time_local",' '"remote_addr":"$remote_addr",' '"request":"$request",' '"status":$status,' '"body_bytes_sent":$body_bytes_sent,' '"http_referer":"$http_referer",' '"http_user_agent":"$http_user_agent",' '"http_x_forwarded_for":"$http_x_forwarded_for",' '"request_time":$request_time' '}'; access_log /var/log/nginx/access.log json_combined;- Filebeat配置处理:
- type: log paths: - '/var/log/nginx/access.log' json.keys_under_root: true json.add_error_key: true processors: - timestamp: field: time_local layouts: - '02/Jan/2006:15:04:05 -0700' test: - '30/Apr/2023:13:45:28 +0800' - add_fields: fields: log_type: frontend log_source: my-vue-app4. 运维监控与问题排查
4.1 常见问题速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Filebeat无法连接Logstash | 防火墙阻止5044端口 | firewall-cmd --add-port=5044/tcp --permanent |
| Elasticsearch堆内存溢出 | JVM配置不合理 | 调整ES_JAVA_OPTS为物理内存的50% |
| 日志时间戳错误 | 时区配置不一致 | 所有容器统一设置TZ=Asia/Shanghai |
| Kibana无法创建索引模式 | 索引未正确生成 | 检查Logstash的output配置 |
4.2 性能监控指标
建议通过Prometheus收集的关键指标:
- Elasticsearch:
jvm_memory_usage:JVM内存使用率indices_search_query_time_seconds:查询延迟
- Logstash:
pipeline_events_duration:事件处理耗时pipeline_queue_size:积压事件数
- 系统层面:
- 容器CPU使用率(通过cAdvisor采集)
- 磁盘IOPS(特别是ES数据目录所在磁盘)
4.3 日志保留策略
通过Elasticsearch ILM(Index Lifecycle Management)设置:
PUT _ilm/policy/log_retention_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "50GB", "max_age": "7d" } } }, "delete": { "min_age": "30d", "actions": { "delete": {} } } } } }5. 安全加固措施
5.1 网络访问控制
建议的防火墙规则:
# 只允许内网IP访问ELK端口 firewall-cmd --permanent --zone=public --add-rich-rule=' rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9200" accept'5.2 Elasticsearch安全配置
启用基础认证的elasticsearch.yml配置:
xpack.security.enabled: true xpack.security.authc: anonymous: roles: anonymous authz_exception: false创建用户命令示例:
bin/elasticsearch-users useradd log_viewer -p securepassword -r kibana_user5.3 日志脱敏处理
在Logstash中配置敏感字段过滤:
filter { mutate { gsub => [ "message", "(password|token|auth)=[^&]*", "\1=[REDACTED]", "message", "\b\d{4}[ -]?\d{4}[ -]?\d{4}\b", "[CREDIT_CARD]" ] } }6. 部署验证与调优
6.1 验证步骤清单
日志采集验证:
# 查看Filebeat采集状态 journalctl -u filebeat --no-pager -n 50 # 检查Elasticsearch索引 curl -u elastic:password http://localhost:9200/_cat/indices?v管道处理验证:
# 测试Logstash配置 /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/ --config.test_and_exit # 查看处理错误 tail -f /var/log/logstash/logstash-plain.log可视化验证:
- 登录Kibana检查Discover页面是否有数据
- 验证仪表板各图表数据准确性
6.2 性能调优参数
Filebeat优化参数(filebeat.yml):
queue.mem: events: 4096 flush.min_events: 512 flush.timeout: 5s output.logstash: worker: 4 bulk_max_size: 2048Logstash JVM调优(jvm.options):
-Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=100