想学我教你啊,快速搭建自己的 ELK 日志系统!
ELK作为一个开源的日志中心解决方案,是时候自己去玩一玩了。
虽然公司有一套自己开发的日志中心,用起来也很顺手,但是毕竟不是自己开发,也没有参与部署。其中许多细节都不为我知,算不得了解吧!于是,决定自己手动来搭建一个日志中心玩玩!
问题主要两个:
1. 用什么环境来搭建?linux?windows?
2. 用什么样实现来搭建?主机?虚拟机?等等!
然后,决定了,在阿里云上用一个2核4G的机器,使用 docker 进行搭建!
在决定使用docker后,问题变得简单了起来!
1. docker 怎样用? 基于 centos 系统级别的镜像来搭建应用?
2. ES/LOGSTASH/KIBANA 这些工具在哪里可以找到?
3. 所有ELK服务都部署一个docker或者部署各一个docker?
刚开始,想完整体验下,整个 ELK 的安装过程,于是,决定使用一个干净的 centos 镜像一个个安装!
按照官网教程进行安装 ES:
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch # Create a file called elasticsearch.repo in the /etc/yum.repos.d/ directory for RedHat based distributions, or in the /etc/zypp/repos.d/ directory for OpenSuSE based distributions, containing: [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md sudo yum install elasticsearch # 添加到服务 chkconfig --add elasticsearch # 启动 es service elasticsearch start
# 报错 error: "Read-only file system" setting key "vm.max_map_count"
sysctl -w vm.max_map_count=262144 # 退出docker操作
ES使用 127.0.0.1 可以启动,但是使用 0.0.0.0 的 network.host 不行!
换方案,使用官方的 ELK 镜像直接安装! ( elk image 地址: https://hub.docker.com/r/sebp/elk )
官网教程地址: https://elk-docker.readthedocs.io/
docker pull sebp/elk
先进行启动试试!
# 加上 --rm 如果成功,则再去除该选项正式操作 docker run --rm -p 5601:5601 -p 9200:9200 -p 5044:5044 -it -h elk_official --name elk_official_container sebp/elk
但是,看到 Elasticsearch 重试 30 次后,失败了!
最后,确定了是因为 docker 有问题,重启后问题解决!
service docker restart
安装 filebeat, 进行客户端日志收集!
# filebeat 安装,下载,安装,运行 wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.6.0-x86_64.rpm rpm -ivh filebeat-6.6.0-x86_64.rpm # 更改 filebeat 配置,指向 logstash vim /etc/filebeat/filebeat.yml /etc/init.d/filebeat restart
filebeat.yml 关键配置如下:
- type: log # Change to true to enable this input configuration. # enabled: false enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: - /var/log/*.log ### Multiline options # Multiline can be used for log messages spanning multiple lines. This is common # for Java Stack Traces or C-Line Continuation # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [ #multiline.pattern: ^\[ multiline.pattern: ^[0-9]+ multiline.negate: true multiline.match: after #============================= Filebeat modules =============================== filebeat.config.modules: # Glob pattern for configuration loading path: ${path.config}/modules.d/*.yml # Set to true to enable config reloading reload.enabled: false #==================== Elasticsearch template setting ========================== setup.template.settings: index.number_of_shards: 3 #index.codec: best_compression #_source.enabled: false #----------------------------- Logstash output -------------------------------- output.logstash: # The Logstash hosts hosts: ["172.19.234.163:5044"] # Optional SSL. By default is off. # List of root certificates for HTTPS server verifications #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] # Certificate for SSL client authentication #ssl.certificate: "/etc/pki/client/cert.pem" # Client Certificate Key #ssl.key: "/etc/pki/client/cert.key" #================================ Processors ===================================== # Configure processors to enhance or manipulate events generated by the beat. processors: - add_host_metadata: ~ - add_cloud_metadata: ~
主要为:
1. 开启日志监听;
2. 发送 logstash 服务;
3. 开启 multiline 解析,解析 java stacktrace 等等!
最后,还差配置 logstash, 因为 filebeat 只负责读文件,文件的内容还没有完全解析,需要使用 logstash 再次解析, logstash 有强大的 filter 功能!
# vi /etc/logstash/conf.d/02-beats-input.conf, 编辑 logstash 配置 input { beats { port => 5044 #ssl => true ssl => false ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt" ssl_key => "/etc/pki/tls/private/logstash-beats.key" } } #过滤器,http://grokdebug.herokuapp.com/ 是在线调试logstash filter的工具,你可以在线调试你的过滤规则。 filter { if [input][type] == "log" { grok { match => { "message" => "(?<create_time>\d{2}\-\d{2} \d{2}:\d{2}:\d{2}\.\d+) (?<thread>\[[^\]]*\]) %{WORD:log_level}" } #remove_field => ["message"] } } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["localhost:9200"] # 索引名称 index => "api-%{+YYYY.MM.dd}" } }
其中,grok 不好搞,kibana 后台有自带的工作可用! > Dev Tools 里!
Grok大部分情况下都是遵守正则规则的,应该说它是在正则的惹出上再添加一些自己的功能,如 各种关键词匹配: HTTPDATE, CLIENTIP, WORD ... ,而对于普遍情况,则自行写正则即可!匹配到的结果将会添加到新的key中,对于完全替换后的词,则可以将其本身删除 remove掉。
这样,整个 ELK 就搭建成功了!
就可以在后台进行日志搜索了!
如果想要进行监控报警这些高级功能,则一般需要进行升级付费了!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?