syslog-ng 到 redis 问题,能够写入文件但无法写入 redis

Posted

技术标签:

【中文标题】syslog-ng 到 redis 问题,能够写入文件但无法写入 redis【英文标题】:syslog-ng to redis problems, able to write to file however unable to write to redis 【发布时间】:2014-01-21 19:23:45 【问题描述】:

我需要使用 Redis 作为消息键值存储,以便 Logstash 从中读取。这个想法是使用现有的 Syslog-ng 服务器将所有服务器的 syslog 路由到 Redis 服务器,以便 Logstash 能够从中读取。 我已经设置了我的 Redis 服务器,并且能够使用以下方法从 Syslog-ng 服务器连接和写入 Redis:

telnet redis.somedomain.com 6379

所以端口是开放的,可以写入,但是键值存储没有被发送。我已经让这个系统的大部分工作使用 UDP 以及附加到 /var/log/hosts 下的各个主机。我对现有 syslog-ng.conf 文件所做的更改如下:

# In Redis Protocol Notation
# $5 = 5 characters(LPUSH), $4 = 4 characters(logs), $(length $MSG) = character length of $MSG,
# $MSG = Log Message per syslog-ng symbols

template t_redis_lpush  template("*3\r\n$5\r\nLPUSH\r\n$4\r\nlogs\r\n$(length $MSG)\r\n$MSG\r\n"); ;
destination d_redis_tcp  tcp("redis.somedomain.com" port(6379) template(t_redis_lpush)); ;
log  source(remote); source(noforward); filter(f_messages);  destination(d_redis_tcp); flags(final); ;

我没有包含 f_messages 过滤器内容,因为它已经工作并用于将日志发送到 UDP 和 /var/log/hosts。如果有人希望我提取过滤器功能,我也可以发布它们。 filter(f_messages) 最终将结果处理为类似于

的内容
"Jan 21 14:27:23 www1/www1 10.252.4.152 - - [21/Jan/2014:14:27:23 -0700] "POST /service.php?session_name=6tiqbpfeu1uc31pg1eimjqpvt0&url=%2Fseo%2FinContentLinks%2Fblogs.somedomain.com%7Cmusic%7C2013%7C12%7Cinterview_fredo.php%2F HTTP/1.1" 200 536 www1.nyc.somedomain.com "66.156.238.1" "-" "Arch Quickcurl" "8126464" 0 92878"

有人知道为什么我的 Syslog-ng 的 Redis 模板、目的地和日志传送器不起作用吗?

提前致谢! 科尔

【问题讨论】:

试试设置集中式 Logstash 怎么样? logstash.net/docs/1.3.3/tutorials/getting-started-centralized。在 syslog-ng 服务器上设置 Logstash shipper 现有的基础设施从每台服务器的 udp 获取日志,并使用 syslog-ng 对其进行馈送。如果不取消现有框架,我将无法真正进行更改,并且我们不能不登录生产系统,或者需要为每台机器编写解决方案,例如使用各种形式的自动化进行生产部署。如果我可以在 syslog-ng 级别捕获它并将密钥库副本发送到 Redis,那么我可以将它提供给新的 Logstash 实例,并提供给新的 elasticsearch 它将为此工作。 我相信我已经将它缩小到协议规范或 bash shell 的范围内。当我远程登录到 redis 服务器并运行 *3\r\n$5\r\nLPUSH\r\n$4\r\nlogs\r\n$20\r\n“这是一些数据!”\r\n它抛出一个错误:-ERR 协议错误:无效的多批量长度。即使我只是尝试写 *3\r\n 来进行简单的回车,它也会这样做。我的 redis 服务器是 2.6,所以应该支持它以及使用 SUSE Linux Enterprise 11。 【参考方案1】:

很抱歉没有早点看到这个。你看过使用 format-json() 吗?

这是我一直在使用的一个运行良好的目的地(大部分宏来自 patterndb 解析器)

destination d_redis 
  redis (
    host("localhost")
    command("LPUSH", "logstash", "$(format-json type=bluecoat proxy_time=$PROXY.TIME proxy_time_taken=$PROXY.TIME_TAKEN proxy_c_ip=$PROXY.C_IP proxy_sc_status=$PROXY.SC_STATUS proxy_s_action=$PROXY.S_ACTION proxy_sc_bytes=int64($PROXY.SC_BYTES) proxy_cs_bytes=int64($PROXY.CS_BYTES) proxy_cs_method=$PROXY.CS_METHOD proxy_cs_uri_scheme=$PROXY.CS_URI_SCHEME proxy_cs_host=$PROXY.CS_HOST proxy_cs_uri_port=$PROXY.CS_URI_PORT proxy_cs_uri_path=$PROXY.CS_URI_PATH proxy_cs_uri_equery=$PROXY.CS_URI_EQUERY  proxy_cs_username=$PROXY.CS_USERNAME proxy_cs_auth_group=$PROXY.CS_AUTH__GROUP proxy_s_supplier_name=$PROXY.S_SUPPLIER_NAME proxy_content_type=$PROXY.CONTENT_TYPE proxy_referrer=$PROXY.REFERRER proxy_user_agent=$PROXY.USER_AGENT proxy_filter_result=$PROXY.FILTER_RESULT proxy_cs_categories=$PROXY.CS_CATEGORIES proxy_x_virus_id=$PROXY.X_VIRUS_ID proxy_s_ip=$PROXY.S_IP proxy_any=$PROXY.ANYREST)\n")
  );
;

顺便说一句 - 我真的更喜欢 syslog-ng 在 logstash 上进行解析。我的经验是使用patterndb比使用grok快得多,并且由syslog-ng完成,配置也更加灵活。

祝你好运, 吉姆

【讨论】:

以上是关于syslog-ng 到 redis 问题,能够写入文件但无法写入 redis的主要内容,如果未能解决你的问题,请参考以下文章

syslog-ng 尾文件缺少最后一行

apache syslog-ng 错误日志和访问日志

syslog-ng 本地读写失败

syslog-ng flush_lines 选项不起作用

如何 syslog-ng 到远程设施

Syslog-ng 证书问题