结合了来自三个不同服务器的日志文件的日志

结合了来自三个不同服务器的日志文件的日志

我们有一个三台服务器的配置,每台服务器都运行 nginx,并通过 Mongrel 运行 rails。每个 rails 安装都有自己的一组日志文件,位于自己的“log”文件夹中,该文件夹只是服务器上的一个常规文件夹。我感兴趣的日志文件是<RAILS APP>/log/production.log

任何访问网站的请求都会随机发送到三台服务器中的一台,因此日志记录可以在三个日志中的任何一个上:实际上每个日志文件都有网站上三分之一请求的日志输出。

有时我需要查看日志以查找特定请求,以了解其处理方式,并且我总是必须在 Less 中打开所有三个文件,然后搜索我的请求,这有点麻烦。如果有一个将这三个文件合并在一起的日志文件会更好。

现在,您可能正在考虑“将它们全部放在一个共享文件夹中,只保留一个日志文件”。但是,我们不想这样做,因为担心会影响效率:我们确实使用共享的 tmp 文件夹来处理某些事情,但它有点慢,而且我们不想让所有日志都通过 http 进行(如果我们使用共享文件夹就会发生这种情况)。所以,这不是一个选择。

还有其他建议吗?我正在考虑一个 cron 任务,例如每分钟运行一次,将服务器 1、2 和 3 的日志复制到同一个位置,然后以巧妙的方式将它们组合在一起,这样日志中各行的顺序就与所有三个服务器首先写入同一个日志的顺序相同。

谢谢,马克斯

编辑-示例日志文件输出如下所示:

Feb 06 13:15:31 ec2-rails rails[21419]: ESC[4;36;1mUser Update (3.3ms)ESC[0m   ESC[0;1mUPDATE `users` SET `custom_signup_fields` = NULL, `all_license_sku_ids` = '--- \n- 1\n',
 `rank_criteria` = '--- \n:has_attached_a_doc_to_a_lesson?: false\n:has_downloaded_a_premade_lesson?: false\n:has_logged_into_lesson_viewer?: false\n:has_downloaded_a_custom_l
esson?: false\n:has_logged_in?: true\n:has_created_pupil_access?: false\n:has_created_a_lesson?: false\n:has_favorited_a_lesson?: false\n:has_viewed_pupil_usage_data?: false\n
:has_viewed_a_lesson?: true\n', `preferences` = '--- \n/: \n current-scheme-step: 5931\n current_product_id: 21\n' WHERE `id` = 52331ESC[0m
Feb 06 13:15:31 ec2-rails rails[21779]: ESC[4;36;1mInstrumentFamily Load (2.6ms)ESC[0m   ESC[0;1mSELECT `instrument_families`.id FROM `instrument_families` INNER JOIN users_in
strument_families ON instrument_families.id = users_instrument_families.instrument_family_id WHERE ((`users_instrument_families`.user_id = 51668)) ESC[0m
Feb 06 13:15:31 ec2-rails rails[21419]: ferret_create/update: User : 52331
Feb 06 13:15:31 ec2-rails rails[21419]: creating doc for class: User, id: 52331

这里要注意的一点是方括号中的数字 - 这是运行 rails 的杂种的 pid - 每个服务器上有 16 个这样的 pid。

答案1

虽然我理解您正在寻找一种快速方法来获取 3 个日志文件……以某种方式“合并”,但您最好只设置一个日志服务器,然后使用日志做更多有趣的事情。正如您所说,您想在日志中检查内容,使用中央日志服务器没有问题。

日志还可以监控您的服务器健康状况。

我使用 Graylog2,它简洁、易用并且搜索效果非常出色。(Graylog2 是 Splunk 的免费开源替代品)。

  1. https://www.graylog.org/download/

然后它将接受来自您服务器的日志推送,您将轻松看到请求。(他们甚至有一个简单的安装脚本!)

假设您仍然想执行原来的建议,那么我建议您每分钟对时间戳进行排序。(前提是您有时间戳!)

答案2

在许多集群环境中,您(另外)使用将日志消息发送到日志服务器syslog

系统日志将按照消息到达的顺序整合消息流,然后。

如果该服务本身不支持 syslog 作为日志记录协议,您可能能够通过管道传输到该logger程序。

答案3

您可以在收集文件的中央文件夹中使用类似这样的工具吗?或者它是否太重了?

cat *.log | sort | less

或者

cat *.log | sort > combined.log

(使用 sort 根据时间戳进行排序)

或者可能:尾部多个远程文件

相关内容