[toc]
Vic.xu 20200930
err.log,sql.log,common.log等err.log,sql.log,common.log收集到C机器的err.log,sql.log,common.log; 一说分布式日志收集分析系统,网上都有一大推的关于ELK的文章。 不过咱的项目比较老了,只是最近才真正做了集群部署,所以才会涉及到分布式的日志收集。
不过,项目中暂时也不会做日志分析之类的东西。所以就准备先弄一个
filebeat收集日志到logstash,然后通过logstash定向输出到文件即可。加上之前因为开发环境和测试环境的隔离,所以写了个实时页面查看日志的小项目,也是勉强够用了。版本:(因为之前使用过
ElasticSearch的版本是7.7.1)
Filebeat7.7.1Logstash7.7.1
Logstash,而是额外引入了Filebeatlogstash是jvm跑的,资源消耗比较大,filebeat更轻量,占用资源更少filebeat采集日志,然后发送到消息队列,redis,kafaka。然后logstash去获取,利用filter功能过滤分析,然后存储到elasticsearch中Filebeat + Logstash在各个需要收集日志的机器上FileBeat , 配置输出到远程的Logstash中
Es/Logstash/Kafka/Redis/File/Console,方便后续扩展在接收日志文件的机器上安装Logstash,收集各个Filebeat发送来到日志,输出到文件
Logstash的input方式有很多,包括Filebeat,kafka等: https://www.elastic.co/guide/en/logstash/current/input-plugins.html
Logstash的output方式有很多,非常方便后续扩展,参见官网
Filebeat官网下载windows版本
修改filebeat.yml,具体参考官网
filebeat.inputs:- type: logenabled: truefields:name: vic_firstpaths:# - /var/log/*.log- E:/space/idea/blog/logback/*.logoutput.file:path: d:/filebeatfilename: filebeat_vic.logcodec.format:string: '%{[fields][name]}%{[@timestamp]} %{[message]}'rotate_every_kb: 10240# 是否开启多行合并multiline.type: pattern#multiline.pattern: '^\['multiline.pattern: '^vic-blog'multiline.negate: falsemultiline.match: after#============================= Filebeat modules ===============================filebeat.config.modules:path: ${path.config}/modules.d/*.ymlreload.enabled: falseprocessors:- add_host_metadata: ~- add_cloud_metadata: ~- add_docker_metadata: ~- add_kubernetes_metadata: ~
启动Filebeat,然后测试写入日志,会被写入到输出位置
.\filebeat.exe -e -c filebeat.yml
其他
输出到es:
output.elasticsearch:# Array of hosts to connect to.hosts: ["localhost:9200"]# Protocol - either `http` (default) or `https`.#protocol: "https"# Authentication credentials - either API key or username/password.#api_key: "id:api_key"#username: "elastic"#password: "changeme"
输出到logstash
output.logstash:# The Logstash hostshosts: ["localhost:5044"]
Logstash官网下载zip解压,
cofig下复制logstash.conf,然后配置成控制台输入输出:
input {beats {port => 5044}}filter {ruby {code => "path = event.get('log')['file']['path']puts format('path = %<path>s', path: path)if (!path.nil?) && (!path.empty?)event.set('filename', path.split('/')[-1])end"}}output {file {# path => "/data/share/logs/output/logstash/%{+yyyy-MM-dd}/%{+HH}-vic.log"path => "/data/share/logs/output/logstash/%{+yyyy-MM-dd}/%{filename}"codec => line { format => "%{filename} %{[fields][name]}: %{message}"}}stdout {codec => rubydebug}}
启动Logstash
bin\logstash -f config\logstash.conf
在logstash中获取Filebeat中的日志原文件名,然后输出到同名文件:通过filter实现
如下,获取输入的日志文件的文件名filename,通过
%{filename}获取
filter {ruby {code => "path = event.get('log')['file']['path']puts format('path = %<path>s', path: path)if (!path.nil?) && (!path.empty?)event.set('filename', path.split('/')[-1])end"}}
filebeat携带额外的信息到,标志来自哪台机器,通过fields携带(如下,携带的key是name,value是server1)
filebeat.inputs:- type: logenabled: truefields:name: server1
logstash获取filebeat携带的额外的信息
%{[fields][name]}
filebeat 不发送最后一行
Filebeat使用换行符来检测事件的结束。 如果将行逐渐添加到正在采集的文件中,则在最后一行之后需要换行符,否则Filebeat将不会读取文件的最后一行。
linux下的启动脚本和最终配置文件
linux下的安装和window下没什么区别,logstash需要确保安装了jdk1.8+;启动也是一样的, 只是本人比较懒, 所以写了两个启动脚本
start.sh;运行时带参数的话则输出日志到catalina.out,不带参数则不输出日志
linux下的filebeat的启动脚本
#!/bin/bashlog="/dev/null"# if input paramter is not null ,then output log to catalina.out. else to /dev/nullif [ $1 != '' ];thenlog="catalina.out"finohup ./filebeat -e -c filebeat.yml >$log 2>&1 &echo "start filebeat.......... ----> $log"
linux下的logstash的启动脚本
#!/bin/bashlog="/dev/null"# if input paramter is not null ,then output log to catalina.out. else to /dev/nullif [ $1 != '' ];thenlog="catalina.out"finohup bin/./logstash -f config/logstash.conf >$log 2>&1 &echo "start logstash.......... ----> $log"
filebeat.yaml最终配置文件(见注释)
# 输入日志filebeat.inputs:- type: logenabled: true# 携带的额外的数据,标识来自哪个机器fields:name: wsl-ubuntu# 日志的所在位置paths:- /data/share/logs/input/*.log- /data/share/logs/input2/*.log#=========================== 是否开启多行合并================================multiline.type: pattern#多行合并的正则,以[ 开头multiline.pattern: '^\['# 是否不合并多行合并: 负负得正 表示开启multiline.negate: falsemultiline.match: after#==========================输出日志到logstash==============================output.logstash:# The Logstash hostshosts: ["localhost:5044"]
logstash.conf最终配置文件(见注释)
#======从filebeat获取日志==============================input {beats {port => 5044}}#=====解析出来源日志的文件名===================================filter {ruby {code => "path = event.get('log')['file']['path']puts format('path = %<path>s', path: path)if (!path.nil?) && (!path.empty?)event.set('filename', path.split('/')[-1])end"}}#======输出日志==============================output {# 输出日志到文件,在日志的开头打印filebeat中携带的name属性,标识来自哪个文件file {path => "/data/share/logs/output/logstash/%{+yyyy-MM-dd}/%{filename}"codec => line { format => "%{[fields][name]}: %{message}"}}# 输出日志到控制台 可删除掉stdout {codec => rubydebug}}
文章来源:临窗旋墨的博客,转载注明出处。
时间: 20200930