linux怎么查看本机内存大小
311
2022-11-01
ELK学习笔记之Logstash和Filebeat解析对java异常堆栈下多行日志配置支持
0x00 概述
logstash官方最新文档。
假设有几十台服务器,每台服务器要监控系统日志syslog、tomcat日志、nginx日志、mysql日志等等,监控OOM、内存低下进程被kill、nginx错误、mysql异常等等,可想而知,这是多么的耗时耗力。
logstash采用的是插件化体系架构,几乎所有具体功能的实现都是采用插件,已安装的插件列表可以通过bin/logstash-plugin list --verbose列出。或者访问logstash配置文件格式
分为输入、过滤器、输出三部分。除了POC目的外,基本上所有实际应用中都需要filter对日志进行预处理,无论是nginx日志还是log4j日志。output中的stdout同理。
# logstash支持的常用输入包括syslog(参考RFC3164)、控制台、文件、redis、beats。# logstash支持的常用输出包括es、控制台、文件。# logstash支持的常用过滤器包括grok、mutate、drop、clone、geoip。
查看logstash各种命令行选项
[root@elk1 bin]# ./logstash --helpOpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=NUsage: bin/logstash [OPTIONS]Options: -n, --node.name NAME Specify the name of this logstash instance, if no value is given it will default to the current hostname. (default: "elk1") -f, --path.config CONFIG_PATH Load the logstash config from a specific file or directory. If a directory is given, all files in that directory will be concatenated in lexicographical order and then parsed as a single config file. You can also specify wildcards (globs) and any matched files will be loaded in the order described above. -e, --config.string CONFIG_STRING Use the given string as the configuration data. Same syntax as the config file. If no input is specified, then the following is used as the default input: "input { stdin { type => stdin } }" and if no output is specified, then the following is used as the default output: "output { stdout { codec => rubydebug } }" If you wish to use both defaults, please use the empty string for the '-e' flag. (default: nil) --modules MODULES Load Logstash modules. Modules can be defined using multiple instances '--modules module1 --modules module2', or comma-separated syntax '--modules=module1,module2' Cannot be used in conjunction with '-e' or '-f' Use of '--modules' will override modules declared in the 'logstash.yml' file. -M, --modules.variable MODULES_VARIABLE Load variables for module template. Multiple instances of '-M' or '--modules.variable' are supported. Ignored if '--modules' flag is not used. Should be in the format of '-M "MODULE_NAME.var.PLUGIN_TYPE.PLUGIN_NAME.VARIABLE_NAME=VALUE"' as in '-M "example.var.filter.mutate.fieldname=fieldvalue"' --setup Load index template into Elasticsearch, and saved searches, index-pattern, visualizations, and dashboards into Kibana when running modules. (default: false) --cloud.id CLOUD_ID Sets the elasticsearch and kibana host settings for module connections in Elastic Cloud. Your Elastic Cloud User interface or the Cloud support team should provide this. Add an optional label prefix '
各配置的含义也可以参考。
比较实用的是:
# -f filename.conf 指定配置文件# --config.test_and_exit 解析配置文件正确性# --config.reload.automatic 自动监听配置修改而无需重启,跟nginx -s reload一样,挺实用的
ELK均采用YAML语言(1、大小写敏感 # 2、使用缩进表示层级关系 # 3、禁止使用tab缩进,只能使用空格键 # 4、缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。 # 5、使用#表示注释 # 6、字符串可以不用引号标注
JVM参数在config/jvm.options中设置。
# 配置文件中output和filter部分均支持主要常见的逻辑表达式比如if/else if,以及各种比较、正则匹配。# 配置文件中还可以访问环境变量,通过${HOME}即可,具体可以参考Beats Input插件
在开始看具体Input插件之前,我们看下哪些选项是所有插件都支持的。
其中主要的是id,如果一个logstash实例里面开了多个相同类型的插件,可以用来区分。
通过Beats插件加载数据源已经是ELK 6.x的主要推荐方式,所以我们来详细看下Beats插件的配置。
input { beats { port => 5044 }}
其中port是参数是必填的,没有默认值。除了ssl配置外,其他几乎都是可选的。
host默认是"0.0.0.0",代表监听所有网卡,除非有特殊安全要求,也是推荐的做法。
0x03 核心解析插件Grok Filter
通常来说,各种日志的格式都比较灵活复杂比如nginx访问日志或者并不纯粹是一行一事件比如java异常堆栈,而且还不一定对大部分开发或者运维那么友好,所以如果可以在最终展现前对日志进行解析并归类到各个字段中,可用性会提升很多。
grok过滤器插件就是用来完成这个功能的。grok和beat插件一样,默认可用。
从非源头上来说,日志体系好不好,很大程度上依赖于这一步的过滤规则做的好不好,所以虽然繁琐,但却必须掌握,跟nginx的重写差不多。
# Logstash自带了约120个模式,具体可见。# grok的语法为:%{SYNTAX:SEMANTIC}
类似于java:
String pattern = ".*runoob.*";boolean isMatch = Pattern.matches(pattern, content);
其中的pattern就相当于SYNTAX,SEMANTIC为content,只不过因为解析的时候没有字段名,所以content是赋给匹配正则模式的文本的字段名,这些字段名会被追加到event中。
例如对于下列GET /index.html 15824 0.043# 使用 %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} 匹配的话,除了原message外,事件中会新增下列额外字段:client: 55.3.244.1method: GETrequest: /index.htmlbytes: 15824duration: 0.043
完整的grok例子如下:
input { file { path => "/var/log/ }}filter { grok { match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } }}
注:如果重启,logstash怎么知道读取到http.log的什么位置了,在filebeat部分,我们会讲到。
grok的主要选项是match和overwrite,前者用来解析message到相应字段,后者用来重写message,这样原始message就可以被覆盖,对于很多的日志来说,原始的message重复存储一份没有意义。 codec,如果希望在logstash中处理多行事件,可以参考https://elastic.co/guide/en/logstash/current/multiline.html)中处理,因为使用ELK的平台通常日志使用beats input插件,此时在logstash中进行多行事件的处理会导致数据流混乱,所以需要在事件发送到logstash之前就处理好,也就是应该在filebeat中预处理。
对于来自于filebeat模块的数据,logstash自带了针对他们的解析模式,参考ES Output插件
主要的选项包括:
1. filebeat
从ELK 6.x开始,log4j输入插件已经不再建议使用,推荐的替代是filebat。
2. filebeat工作原理
参考
harvester的职责是以行为单位读取文件,发送给输出,每个文件由不同的harvester读取。
prospector的职责是管理harvester并找到要读取的文件。
Filebeat当前支持log和stdin这两种prospector,每种prospector可以定义多次。
filebeat的配置文件同样采用YAML格式。
filebeat支持输出到Elasticsearch或者Logstash,一般来说通行的做法都是到Logstash,所以到ES的相关配置略过。
filebeat的命令行选项可以参考,配置文件所有配置项参考。
默认情况下,filebeat运行在后台,要以前台方式启动,运行./filebeat -e。
filebeat.prospectors:- type: log paths: - /var/log/apache/type: log paths: - /var/log/messages - /var/log/*.log
其他有用的选项还包括include_lines(仅读取匹配的行)、exclude_lines(不读取匹配的行)、exclude_files(排除某些文件)、tags、fields、fields_under_root、close_inactive(日志文件多久没有变化后自动关闭harvester,默认5分钟)、scan_frequency(prospector为harvester扫描新文件的频率,注意,因close_inactive自动关闭的也算新文件,默认为10s,不要低于1s)等
具体可见。
3. 解析多行消息
比如,对于java日志而言,可以使用:
multiline.pattern: '^\['multiline.negate: truemultiline.match: after
或者:
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'multiline.negate: falsemultiline.match: after
这样,下面的日志就算一个事件了。
beat-logstash-some-name-832-2015.11.28] IndexNotFoundException[no such index] at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver$WildcardExpressionResolver.resolve(IndexNameExpressionResolver.java:566) at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:133) at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:77) at org.elasticsearch.action.admin.indices.delete.TransportDeleteIndexAction.checkBlock(TransportDeleteIndexAction.java:75)
详细的配置可以参考boot,约定优于配置。具体可以参考5.2以及之后的版本。
参考
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~