我们有一个三服务器configuration,每个运行nginx的服务器和通过Mongrel的rails。 每个导轨安装都有自己的一套日志文件,在它自己的“日志”文件夹中,这只是服务器上的常规文件夹。 我感兴趣的日志文件是<RAILS APP>/log/production.log
任何访问该站点的请求都被随机发送到三台服务器中的任何一台,因此日志logging可以在三个日志中的任何一个上:有效地,每个日志文件都有三分之一的日志输出。
有时我需要通过日志查看具体的请求,看看它是如何处理的,而且我总是要把所有的三个都打开,然后search我的请求,这是一个皮塔饼。 有更好的是有一个单一的日志文件结合这三个。
现在,你可能会想“把它们放在一个共享文件夹中,只有一个日志文件”。 但是,我们不想这样做,因为害怕效率点击:我们使用一个共享的tmp文件夹,但有点慢,我们不希望所有的日志都通过http(如果我们使用共享文件夹会发生什么)。 所以,这不是一个选项。
还有其他build议吗? 我正在考虑一个每分钟运行一次的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
这里需要注意的一点是方括号中的数字 – 这是杂种运行轨道的pid – 每台服务器上有16个。
虽然我明白,你正在寻找一种快速的方式来获得3日志文件…“合并”的方式,你可能是最好的只是设置自己的日志服务器,并做更多的事情与你的日志。 就像你说的,你想检查日志中的东西,对于中央日志服务器没有问题。
日志还可以监视您的服务器运行状况。
我使用Graylog2,它非常stream畅,简单易用,而且非常有效。(Graylog2是Splunk的免费开放源代码)。
这将接受从您的服务器日志推送,你会很容易地看到请求。 (他们甚至有一个简单的安装脚本!)
假如你还想做你原来的build议,那么我build议你每分钟都用时间戳sorting。 (假设你有时间戳!)
在许多集群环境中,您(另外)会使用syslog将日志消息发送到日志logging服务器。
系统日志将按照它们到达和发生的顺序整合消息stream。
如果该服务本身不支持syslog作为日志logging协议,则可以通过pipe道传输到logger程序。
你可以在文件被收集的中央文件夹上做这样的事情吗?或者是沉重的?
cat *.log | sort | less
要么
cat *.log | sort > combined.log
(使用sorting按照时间戳顺序)
或者可能: 尾巴多个远程文件