我需要读取 nginx access_log 文件,并在行内容为“某些表达式”时将数据发送到 http 后端。这是通过 nginx 对下载的文件进行计费任务的一部分access_log
。
Nginx 存储日志到/var/log/nginx/access.log
下载格式:
log_format download '{ "remote_addr": "$remote_addr", "time": "$time_local", "request": "$request", "traffic": $body_bytes_sent, "x_forwarded_for": "$http_x_forwarded_for" }';
Rsyslog 监视此文件(/etc/rsyslog.conf
)。
module(load="imfile" PollingInterval="10")
input(type="imfile"
File="/var/log/nginx/access.log"
Tag="nginx-access"
Severity="info"
Facility="local3")
我需要有关 rsyslog omhttp 模块的帮助。如何配置它:
- 仅发送新行
:msg, contains, "expression"
- 发送新一行访问日志至:POSThttp://localhost/rsyslog_backend
答案1
正确答案是使用syslog-ng
而不是syslog
完成此项工作的配置的一部分:
destination d_http {
http(
url("http://127.0.0.1/api/billing")
method("POST")
body("$(format-json message=$MESSAGE)")
);
};
log {
source(s_src);
filter { program("nginx") and message("download\/ogg") };
destination(d_http);
};
在 Rails 中需要一些 monkey patch:
JSON.parse(JSON.parse(request.raw_post)['message'])['request'] => "POST /api/subscriptions/downloads/billing HTTP/1.0"