我希望将nginx日志文件(在一台服务器上)发送到redis(在第二台服务器上),以便稍后使用logstash(在第三台服务器上)处理它,但我有点丢失
我使用redis作为缓冲区,以免在logstash服务器因维护或其他原因而停机时丢失任何数据
答案 0 :(得分:2)
所以这就是我解决它的方式,
我让nginx登录到syslog服务器,从syslog-ng登录到redis
这是我的配置
在nginx log_format xxx_log_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
指令
server
在nginx access_log syslog:server=127.0.0.1:601 xxx_log_format;
指令
source s_syslog {
udp(
port(601)
);
};
destination d_redis {
redis(
host("REDIS-IP")
port(6379)
command("LPUSH", "access_logs", "${MESSAGE}")
);
};
log {
source(s_syslog);
destination(d_redis);
};
syslog-ng config中的
<div id="abc">
</div>
<div id="two">
</div>
<div id="three">
</div>
答案 1 :(得分:0)
查看文档,有一个用于管理带有消息队列的峰值的示例:
Logstash输入和输出插件应该有帮助。
答案 2 :(得分:0)
我使用一个小的logstash实例接收事件并将它们写入redis,然后使用第二个来读取redis,执行所有魔术处理,并写入elasticsearch。
我只发送通常可能丢失到第一个实例的事件 - syslog,snmptrap等(发送者只是盲目地发送事件)。我将filebeat流量直接发送到第二个logstash实例,因为filebeat将停止发送,如果它已关闭。 (只要在客户端日志文件轮换期间logstash没有关闭,你就可以了。)
答案 3 :(得分:0)
如果您想实时记录redis,可以使用redis模块进行nginx - https://www.nginx.com/resources/wiki/modules/redis2/
如果你只想将redis调用延迟到后台以保持快速响应时间 - 使用名为post_action的nginx的无副指令 - 谷歌吧。
如果您不信任logstash并希望使用redis解决它。
我可以建议您可以查看的替代方案: