Ruby & Syslog & пользовательский объект - PullRequest
4 голосов
/ 28 октября 2010

Я очень новичок в syslog.

Мы решили использовать системный журнал для отслеживания некоторых специальных событий в нашем приложении Rails.

Проблема в том, что я не хочу использовать файл /var/log/system.log по умолчанию, но использую пользовательский, такой как /var/log/myapp_events.log.

Я вижу, что для этого я должен определить свой собственный объект в /etc/syslog.conf следующим образом:

myapp_events.* /var/log/myapp_events.log

После перезапуска syslogd я вижу, что могу играть с ним прямо в bash console :

syslog -s -k Facility myapp_events Message "this is my message"

Сообщение появляется в /var/log/myapp_events.log, как и ожидалось, но я не могу воспроизвести это поведение, используя syslog ruby ​​gem . Я пробовал:

require 'syslog'
Syslog.open('myapp_events', Syslog::LOG_PID | Syslog::LOG_CONS) { |s| s.warning 'this is my message' }  # sends the message to system.log
Syslog.open('myapp_events', Syslog::LOG_PID | Syslog::LOG_CONS, 'myapp_events') { |s| s.warning 'this is my message' }  # error because 'myapp_event' can't be converted to int.

Я вижу, что Syslog.open имеет третий аргумент, который является средством , но это должно быть целое число, а у меня есть строка.

Есть предложения?

Ответы [ 4 ]

13 голосов
/ 29 октября 2010

Определенно, реализация syslog ruby ​​не позволяет нам использовать пользовательские средства .

В реализации syslog ruby ​​используется syslog [C реализация] (http://github.com/ruby/ruby/blob/trunk/ext/syslog/syslog.c#L36).

Реализация syslog C позволяет нам использовать только очень короткий список имен объектов: LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_SYSLOG, LOG_LPR, LOG_NEWS, LOG_UUCP, UUCP , LOG_CRON, LOG_AUTHPRIV, LOG_FTP, LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7.

Итак, в итоге я использовал один изLOG_LOCALX средства, которые уже есть для личного использования.

Теперь я могу настроить syslog следующим образом:

# /etc/syslog.conf
local5.*    /var/log/myapp_events.log

А в Ruby сделать это:

Syslog.open('myapp', Syslog::LOG_PID, Syslog::LOG_LOCAL5) { |s| s.info 'this is my message' }

Я думаю, что именно так syslog хочет, чтобы вы определили пользовательских объектов .

3 голосов
/ 27 октября 2011

Взгляните на Дровосек .

Он поддерживает Syslog в качестве устройства журнала, и вы можете указать средство в качестве опции:

require 'lumberjack'
require 'lumberjack_syslog_device'

syslog_device = Lumberjack::SyslogDevice.new(:facility => 'myapp_events')
logger = Lumberjack::Logger.new(syslog_device)
logger.info "Hello, Syslog!"

Дровосек также имеет несколько других функций, которые делают его достойным внимания.

3 голосов
/ 27 октября 2011

Logger бесполезен, если у вас есть несколько рабочих или потоков, так как сообщения журнала чередуются. Вот почему по умолчанию в Rails 3 logger - BufferedLogger.

Именно поэтому вы должны использовать буферный системный журнал, такой как rsyslog, иначе он снизит вашу производительность. (Я считаю, что syslogd использует fsync (), который является синхронным вызовом, который ожидает возврата.)

0 голосов
/ 28 октября 2010

Возможно, вы захотите использовать Logger, который очень похож на syslog, только он более удобен для пользователя.Он имеет несколько уровней критичности, например, Syslog, и предлагает журнализацию в зависимости от размера или возраста.

...