在rails应用程序中使用syslog

我正在考虑在我的rails应用程序中使用syslog。 此博客文章概述了该过程:

  1. gem 'SyslogLogger'添加到您的Gemfile
  2. require 'syslog_logger'添加到config/environments/production.rb的顶部
  3. 同时取消注释同一文件中的config.logger =行。

在生产箱中,我有4个使用乘客运行的铁路应用。 如果我为所有4个应用程序切换到使用syslogger,那么我担心来自所有4个应用程序的日志消息将转到单个文件,并且日志消息将交错。 当然,我可以使用splunk,但首先我想检查一下我是否可以为每个rails应用程序获取一个日志文件。 这对我的情况来说是可取的。

那可能吗?

@ cite的答案涵盖了区分应用程序的一个选项。 但是,系统日志消息框架实际上有两个字段,使其更容易: hostnametag (更常见的是用作程序名称)。

hostname由系统syslog守护程序设置,然后将消息转发到集中式服务器。 它对于同一系统上的所有应用程序都是相同的,但是当您经过1台服务器时可能会很方便。

更有趣的是tag 。 您的应用程序在实例化SyslogLogger时定义tag 。 例如:

 SyslogLogger.new('app1') 

logger类将作为app1发送到系统syslogd,并且出现在本地日志文件和任何远程syslog目标中(无需修改日志消息本身)。 默认为rails 。 所有现代syslog守护进程都可以根据tag进行过滤; 请参阅syslog-ng的program()和rsyslog的$programname programname。

另外,值得注意的是SyslogLogger基本上包含了C openlog()syslog()函数,所以基本上所有的日志后配置都发生在系统守护进程上。 通常这是可取的,但有时您可能希望您的Rails应用程序直接登录到特定目标(例如,简化自动部署,更改syslog()不允许的属性,或在无法访问系统守护程序的环境中运行)。

我们遇到了几个这样的情况,并做了一个直接替换Logger ,它自己生成UDP数据包。 remote_syslog_logger gem 位于GitHub上 。

是的,默认情况下,几乎所有Unix syslogds都会在同一文件中写入userlocal*工具中给出的消息。 但是,我知道的每个syslogd都允许您在每个工具的基础上指定日志文件,因此您可以将第一个应用程序日志记录到local1.* ,第二个应用程序记录到local1.*等等。

此外,较新的syslog syslog-ng类的syslog守护程序允许通过针对正则表达式评估消息将消息拆分为不同的文件(将日志中包含railsapp_1日志字符串写入/var/log/railsapp_1.log等)。

因此,请相应地配置syslogd并完成(如果系统的手册页无法帮助您,则应在serverfault.com上询问更改该配置的详细信息。)