nginx记录到redis到logstash

时间:2016-10-11 12:43:43

标签: logstash syslog elastic-stack syslog-ng

我希望将nginx日志文件(在一台服务器上)发送到redis(在第二台服务器上),以便稍后使用logstash(在第三台服务器上)处理它,但我有点丢失

我使用redis作为缓冲区,以免在logstash服务器因维护或其他原因而停机时丢失任何数据

4 个答案:

答案 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)

查看文档,有一个用于管理带有消息队列的峰值的示例:

https://www.elastic.co/guide/en/logstash/current/deploying-and-scaling.html#deploying-message-queueing

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解决它。

我可以建议您可以查看的替代方案:

  1. 流利的redis输出插件和其他任何想要弹性的插件(类似于logstash)
  2. 你可以让nginx日志旋转大约一小时左右,并将它与从fluentd或logstash的输出插件复制的输出比较到任何地方(例如s3)并以某种方式进行差异(基于日志文件中的小时数,使用sort和comm linux命令或emr或athena)然后你可以将差异发送回log所需的任何目标,如logtash,fluentd或elk。