关于Nginx采集日志的方式

文章介绍了通过filebeat直接采集nginx日志到Elasticsearch,以及通过filebeat+logstash和rsyslog的方式将nginx的访问日志和错误日志发送到logstash,然后再传输到Elasticsearch进行分析的方法。这些方法提供了不同场景下的日志采集解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一。

如何有效便捷的采集nginx的日志进行有效的分析成为大家关注的问题。本文通过几个实例来介绍如何通过filebeat、logstash、rsyslog采集nginx的访问日志和错误日志。大家都知道ELK技术栈是采集、分析日志的利器。所以这里介绍的是从nginx采集日志到ES。当然至于日志采集以后存到看大家的需要。

通过logstash可以方便的配置日志输出存储的方式。一般来说nginx默认安装后,日志文件在 /usr/local/nginx/logs 目录下。分别有 access.log和error.log 访问日志和错误日志。这次示例Elasitcsearch是三个节点组成的集群172.28.65.22、172.28.65.23、172.28.65.24,172.28.65.30 是kibana的地址,172.28.65.32是数据采集服务器,上面装有logstash、nginx、 filebeat。一般来说采集服务器上有logstash,而nginx、 filebeat应该是装在采集目标上。

一、直接通过filebeat采集日志到ES

在filebeat的安装目录找到filebeat.yml 配置获取日志文件的路径及输出到ES的配置。具体:

- type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: #- /var/log/*.log - /usr/local/nginx/logs/*.log #- c:\program>

如果需要在kibana中友好显示的化,可进行kibana配置

输出到es中,在hosts中配置好你的ES服务地址。如果单机只有一个节点,就可以只配一个ip和端口。

启动filebeat 进行日志数据采集

./filebeat -e -c filebeat.yml -d "publish"

通过elasticsearch-head插件查看es索引中的日志信息

可以看到nginx中的access.log和error.log的日志都已经上来了。在kibana中通过filebeat-*过滤看filebeat的索引,可以看到通过filebeat采过来的数据。

这种直接通过filebeat直接对接ES采日志的方式简单直接,但是无法对采集的日志进行预处理和其他一些操作,也不够灵活。可以在filebeat 和 ES之间加一层Logstash,可以将filebeat于ES解耦,通过Logstash可以做一些预处理,也可以通过Logstash采集到除ES以外的其他数据存储上。

二、通过filebeat采集日志到logstash再送到ES

首先得安装 logstash ,安装完后在logstash的安装目录下新建vi filebeat-pipeline.conffilebeat-pipeline.conf的具体配置如下:

input { beats { port => "5044" }}output { elasticsearch { hosts => ["172.28.65.24:9200"] } stdout { codec => rubydebug}}

input配置表示通过5044端口接收beats的数据output配置表示输出到elasticsearch,并且同时输出到标准输出也就是控制台。然后通过命令

bin/logstash -f filebeat-pipeline.conf --config.reload.automatic

应用filebeat-pipeline.conf启动logstash。

启动以后可以看到logstash的启动日志5044端口的服务已经起了,可以接受通过filebeat通过5044端口传过来的数据了。接下来配置filebeat在filebeat的安装目录找到filebeat.yml 配置获取日志文件的路径及输出到logstash的配置。不直接输出到ES了。具体配置如下:将output.elasticsearch的配置屏蔽配置output.logstash,配置正确的logstash的服务主机和端口

启动filebeat 进行日志数据采集

./filebeat -e -c filebeat.yml -d "publish"

我们访问nginx服务提供的web服务http://172.28.65.32/在logstash的控制台 可以看到相应的访问access.log 日志

同时在ES 中也可以看到有相应的日志数据

三、直接通过rsyslog采集日志到logstash在送到ES在很多情况下你需要采集的web服务器并不是自己能够控制的,不是说你想装filebeat就可以让你装的,这时候就可以要求目标数据源通过 syslog 的方式将日志发出来。我们可以再通过 logstash送到ES或其他的日志存储处理平台。

通过syslog往日志服务器上发nginx的日志有两种方式,一种就是利用nginx的配置往外发日志,一种就是通过配置linux的rsyslog的配置往外发日志。

1、通过nginx配置发送syslog到logstash参考见nginx官方文档:

具体配置如下:在nginx的配置文件nginx.conf中在server下配置access_log和error_log的输出方式

access_log syslog:server=172.28.65.32:514,facility=local7,tag=nginx_access_log,severity=info;error_log syslog:server=172.28.65.32:514,facility=local7,tag=nginx_error_log,severity=info;

配置完成后执行 ./nginx -s reload 使配置生效。这样就通过linux的rsyslog服务将nginx的日志往外发了。接着来配置logstash的syslog的服务接收配置 。在logstash的安装目录下新建vi syslog-pipeline.confsyslog-pipeline.conf的具体配置如下:

input { syslog{ type => "system-syslog" port => 514 }}output { elasticsearch { hosts => ["172.28.65.24:9200"] index => "system-syslog-%{+YYYY.MM}" } stdout { codec => rubydebug}}

input配置表示通过514端口接收syslog的数据output配置表示输出到elasticsearch,并且同时输出到标准输出也就是控制台。通过执行 bin/logstash -f syslog-pipeline.conf --config.reload.automatic 启动logstash

可以看到logstash启动以后开启了514端口的tcp和upd协议的侦听。我们访问nginx服务提供的web服务http://172.28.65.32/在logstash的控制台 可以看到相应的nginx访问access和error的日志

同样通过Elasticsearch-head在ES 中也可以看到有相应的日志数据

2、通过配置rsyslog发送syslog日志到logstash

有些老版本的nginx不支持配置syslog输出日志,或者说我想输出其他不是nginx的日志该怎么办呢?可以通过直接配置rsyslog的方式来往外发送日志。在/etc/rsyslog.conf 中配置

$IncludeConfig /etc/rsyslog.d/*.conf

意思是可以引用外部的配置文件,引用外部的配置文件一方面可以不影响主配置文件,另一方面也比较好管理在/etc/rsyslog.d目录下新建nginx-log.conf配置如下:

$ModLoad imfile$InputFilePollInterval 1$WorkDirectory /var/spool/rsyslog$PrivDropToGroup adm##Nginx访问日志文件路径,根据实际情况修改:$InputFileName /usr/local/nginx/logs/access.log$InputFileTag nginx-access:$InputFileStateFile stat-nginx-access$InputFileSeverity info$InputFilePersistStateInterval 25000$InputRunFileMonitor##Nginx错误日志文件路径,根据实际情况修改:$InputFileName /usr/local/nginx/logs/error.log$InputFileTag nginx-error:$InputFileStateFile stat-nginx-error$InputFileSeverity error$InputFilePersistStateInterval 25000$InputRunFileMonitor*.* @172.28.65:514

配置好了以后,重启rsyslog服务

systemctl restart rsyslog

我们访问nginx服务提供的web服务http://172.28.65.32/在logstash的控制台 可以看到同样的效果。

本文介绍了如何通过filebeat、logstash、rsyslog采集nginx的访问日志和错误日志的几种方式,具体需要根据实际情况灵活的运用。

来源:https://www.weidianyuedu.com

### 配置Logstash采集和解析Nginx日志中的HTTP请求方法 为了使用Logstash采集和解析Nginx日志中的HTTP请求方法,需要正确配置Logstash的输入插件(Input)、过滤插件(Filter)以及输出插件(Output)。以下是详细的配置步骤和示例: #### 1. 配置Logstash Input 插件 Logstash可以通过多种方式接收Nginx日志数据。常见的方法包括直接读取文件或通过Filebeat发送日志数据。如果选择直接读取文件,可以使用`file`插件;如果通过Filebeat发送,则在Logstash中配置`beats`插件。 - **直接读取文件**: ```yaml input { file { path => "/var/log/nginx/access.log" # Nginx日志路径 start_position => "beginning" sincedb_path => "/dev/null" # 确保每次启动都从头读取 } } ``` - **通过Filebeat发送**: 确保Filebeat已正确配置并发送日志到Logstash[^2],然后在Logstash中配置如下: ```yaml input { beats { port => 5044 } } ``` #### 2. 配置Logstash Filter 插件 使用`grok`过滤器插件解析Nginx日志中的HTTP请求方法。默认情况下,Nginx日志格式遵循标准的Common Log Format(CLF),但也可以自定义日志格式。以下是一个典型的Nginx日志格式及其对应的Grok模式: - **Nginx默认日志格式**: ```text $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" ``` - **Grok模式**: ```yaml filter { grok { match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:bytes}" } } } ``` 上述Grok模式会提取出HTTP请求方法并存储在字段`http_method`中[^1]。 #### 3. 配置Logstash Output 插件 根据需求将解析后的日志数据输出到目标系统。例如,可以将数据写入MySQL数据库或Elasticsearch。 - **输出到MySQL**: ```yaml output { jdbc { driver_class => "com.mysql.jdbc.Driver" connection_string => "jdbc:mysql://localhost:3306/logdb?user=root&password=secret" statement => ["INSERT INTO nginx_logs (http_method, client_ip, timestamp) VALUES (?, ?, ?)", "http_method", "clientip", "timestamp"] } } ``` - **输出Elasticsearch**: ```yaml output { elasticsearch { hosts => ["http://localhost:9200"] index => "nginx-log-%{+YYYY.MM.dd}" } } ``` #### 4. 启动Logstash 完成配置后,启动Logstash以开始处理日志数据: ```bash ./bin/logstash -f /path/to/your/config/file.conf ``` --- ### 示例完整配置文件 以下是一个完整的Logstash配置文件示例,用于采集和解析Nginx日志中的HTTP请求方法: ```yaml input { file { path => "/var/log/nginx/access.log" start_position => "beginning" sincedb_path => "/dev/null" } } filter { grok { match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:bytes}" } } date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] target => "@timestamp" } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["http://localhost:9200"] index => "nginx-log-%{+YYYY.MM.dd}" } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值