🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
参考文章: [Filebeat 模块与配置](https://www.cnblogs.com/cjsblog/p/9495024.html) [开始使用Filebeat](https://www.cnblogs.com/cjsblog/p/9445792.html) [https://www.cnblogs.com/cjsblog/p/9517060.html](https://www.cnblogs.com/cjsblog/p/9517060.html) [TOC] # filebeat配置文件模块 filebeat配置文件主要分如下三块 | 模块 | 模块用途 | | --- | --- | | modules | 自带的常用日志格式的模块 | | input | 日志输入模块 | | output | 日志输出模块 | ## A modules模块(nginx模块为例) Filebeat提供了一组预先构建的模块,可以使用这些模块快速实现并部署一个日志监控解决方案,,支持常见的日志格式,如Nginx、Apache2和MySQL等。 ### **1 nginx模块说明** nginx模块解析Nginx创建的access和error日志,当运行模块的时候,它在底层执行一些任务: * 设置默认的日志文件路径 * 确保将每个多行日志事件作为单个事件发送 * 使用ingest节点解析和处理日志行,将数据塑造成适合在Kibana中可视化的结构 * 部署显示日志数据的dashboards >这个模块需要**ingest-user-agent**和**ingest-geoip**两个Elasticsearch插件 ### **2 设置并运行模块** 第1步:配置文件启用modules和指定output output一定要指定,至于是输出到reids,还是logstash或是es,就看具体需要了 ```sh [root@file_redis ~]# cat /etc/filebeat/filebeat.yml filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false output.redis: hosts: ["10.0.0.11"] port: 6379 password : 'abcd1234e' key: "filebeat-1101" db: 3 timeout: 5 ``` 第2步:加载nginx模块并重启filebeat ``` filebeat modules enable nginx systemctl restart filebeat.service ``` 第3步:访问nginx并查看redis第3个库是否有日志产生 ``` curl 127.0.0.1 redis-cli -h 10.0.0.11 -a abcd1234e 10.0.0.11:6379> select 3 OK 10.0.0.11:6379[3]> KEYS * 1) "filebeat-1101" 10.0.0.11:6379[3]> lrange filebeat-1101 0 1 ...很多数据,省略显示... ``` ### **3 重新指定模块中的变量** 通过在配置文件中指定变量设置,可以覆盖模块文件中的默认设置,如nginx日志路径: ``` - module: nginx access: enabled: true var.paths: ["/path/to/log/nginx/access.log*"] error: enabled: true var.paths: ["/path/to/log/nginx/error.log*"] ``` 其它模块配置大同小异,不再赘述,更多请参考  [filebeat日志模块](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules.html) ## B input日志输入模块 除了使用自带的模块读入日志数据外,更多的是自己写input模块按自己的需要读取日志,一个配置文件中,可以指定多个日志输入源: ~~~ filebeat.inputs: - type: log paths: - /var/log/system.log - /var/log/wifi.log - type: log paths: - "/var/log/apache2/*" ~~~ ### **1 排除行和包含行** 默认情况下,没有行被删除,所有的行都会被导出。空行被忽略。 * exclude_lines 排除行 一组正则表达式,用于匹配想要排除的行。Filebeat会丢弃匹配的行。 下面的例子配置Filebeat删除以DBG开头的行: ~~~ filebeat.inputs: - type: log ... exclude_lines: ['^DBG'] ~~~ * include_lines 包含行 一组正则表达式,用于匹配想要包含的行。Filebeat只会导出那些匹配这组正则表达式的行。 下面是一个例子,配置Filebeat导出以ERR或者WARN开头的行: ~~~ filebeat.inputs: - type: log ... include_lines: ['^ERR', '^WARN'] ~~~ * 排除行和包含航同时被定义 如果 include\_lines 和 exclude\_lines 都被定义了,那么Filebeat先执行 include\_lines 后执行 exclude\_lines,而与这两个选项在配置文件中被定义的顺序没有关系。 下面的例子导出那些除了以DGB开头的所有包含sometext的行: ~~~sh filebeat.inputs: - type: log ... include_lines: ['sometext'] exclude_lines: ['^DBG'] ~~~ ### **2 json格式日志** 这些选项使得Filebeat将日志作为JSON消息来解析。例如: ~~~sh json.keys_under_root: true json.add_error_key: true json.message_key: log ~~~ 为了启用JSON解析模式,必须至少指定下列设置项中的一个: * keys\_under\_root 默认情况下,解码后的JSON被放置在一个以"json"为key的输出文档中。 如果启用这个设置,那么这个key在文档中被复制为顶级。默认是false。 * overwrite\_keys 如果keys\_under\_root被启用,那么在key冲突的情况下,解码后的JSON对象将覆盖Filebeat正常的字段 * add\_error\_key 如果启用,则当JSON反编排出现错误的时候Filebeat添加 "error.message" 和 "error.type: json"两个key * message\_key 可选的配置,在应用行过滤和多行设置的时候指定一个JSON key。 指定的这个key必须在JSON对象中是顶级的,而且其关联的值必须是一个字符串 * ignore\_decoding\_error 可选的配置,指定是否JSON解码错误应该被记录到日志中。默认是false。 ### **3 multiline多行日志处理** 典型的java错误日志,都是由很多行组成的,如果按单行收集,就不能正确的处理日志,需要用到多行处理功能,需要用到一下设置. * **multiline.pattern** 指定用于匹配多行的正则表达式 * **multiline.negate** 定义模式是否被否定。默认false。 * **multiline.match** 指定Filebeat如何把多行合并成一个事件。可选的值是**after**或者**before** * **multiline.flush\_pattern** 指定一个正则表达式,多行将从内存刷新到磁盘。 * **multiline.max\_lines** 可以合并成一个事件的最大行数。如果一个多行消息包含的行数超过max\_lines,则超过的行被丢弃。默认是500。 案例1:简单的java多行日志 ~~~sh Exception in thread "main" java.lang.NullPointerException at com.example.myproject.Book.getTitle(Book.java:16) at com.example.myproject.Author.getBookTitles(Author.java:25) at com.example.myproject.Bootstrap.main(Bootstrap.java:14) ~~~ 为了把这些行合并成单个事件,用写了多行配置: ~~~sh multiline.pattern: '^[[:space:]]' multiline.negate: false multiline.match: after ~~~ >这个配置将任意以空格开始的行合并到前一行 案例2:更复杂的例子 ~~~java Exception in thread "main" java.lang.IllegalStateException: A book has a null property at com.example.myproject.Author.getBookIds(Author.java:38) at com.example.myproject.Bootstrap.main(Bootstrap.java:14) Caused by: java.lang.NullPointerException at com.example.myproject.Book.getId(Book.java:22) at com.example.myproject.Author.getBookIds(Author.java:35) ... 1 more ~~~ 为了合并这个,用下面的配置: ~~~sh multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:' multiline.negate: false multiline.match: after ~~~ > 在这个例子中,模式匹配下列行: > * 以空格开头,后面跟 at 或者 ... 的行 > * 以 Caused by: 开头的行 ## C output输出模块 ### 1. **配置Elasticsearch output**   当指定Elasticsearch作为output时,Filebeat通过Elasticsearch提供的HTTP API向其发送数据。例如: ~~~sh output.elasticsearch: hosts: ["https://localhost:9200"] ~~~ 如果es开启了认证,则需要添加如下配置 ~~~sh output.elasticsearch: hosts: ["https://localhost:9200"] username: "filebeat_internal" password: "YOUR_PASSWORD" ~~~ ### 2. **index和indices指定索引名** 索引名字默认是"filebeat-%{\[beat.version\]}-%{+yyyy.MM.dd}"(例如,"filebeat-6.3.2-2017.04.26")。 如果想改变这个设置,需要配置 setup.template.name 和 setup.template.pattern 选项。 如果想要根据日志中不同的内容行,生产不同的索引,就需要用到`indices`的条件格式 ~~~sh output.elasticsearch: hosts: ["http://localhost:9200"] index: "logs-%{[beat.version]}-%{+yyyy.MM.dd}" indices: - index: "critical-%{[beat.version]}-%{+yyyy.MM.dd}" when.contains: message: "CRITICAL" - index: "error-%{[beat.version]}-%{+yyyy.MM.dd}" when.contains: message: "ERR" ~~~ ### 3. **配置Logstash output** ~~~ output.logstash: hosts: ["127.0.0.1:5044"] ~~~ 上面是配置Filebeat输出到Logstash,那么Logstash本身也可以有输出配置,例如: ~~~ input { beats { port => 5044 } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } } ~~~ ### 4. **配置redis output** ~~~ output.redis: hosts: ["10.0.0.11"] port: 6379 password : 'abcd1234e' key: "filebeat-1101" db: 3 timeout: 5 ~~~