2010-10-28 28 views
4

我很新玩syslog。Ruby&Syslog&自定義設施

我們決定使用syslog來跟蹤Rails應用程序中的一些特殊事件。

問題是我不想使用默認的/var/log/system.log文件,而是使用像/var/log/myapp_events.log這樣的自定義文件。

我看到了,我必須定義自己的工廠在/etc/syslog.conf這樣的:

myapp_events.* /var/log/myapp_events.log 

重啓syslogd的我看到,我可以用它直接播放到的bash控制檯

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有第三個參數也就是設施,但它必須是一個整數,我已經是一個字符串。

什麼建議嗎?

+0

我看到ruby'syslog' gem使用'syslog' C實現,這個C函數只接受整數作爲** facility ** value:http://www.gnu.org/s/libc/ manual/html_node/syslog_003b-vsyslog.html#syslog_003b-vsyslog – fguillen 2010-10-28 14:19:08

回答

13

當然,syslog紅寶石實現不允許我們使用定製設施

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希望你定義定製設施的方式。

+0

對於那些想要使用Syslog :: Logger和 2016-02-03 11:19:29

0

您可能想使用Logger,它與syslog非常相似,只是它更方便用戶。它具有多個關鍵程度級別,如Syslog,並根據大小或年齡提供日誌滾動。

+1

關鍵是我們要使用'syslog'守護進程,所以我們可以免費使用它的unix功能。 – fguillen 2010-10-28 12:32:57

+0

我的觀點是,Ruby中的Syslog記錄不完整。您可能需要閱讀源代碼才能做到遠遠超出基礎。記錄器是對此的反應,並且更易於使用,並且很多人使用它,因爲它更容易訪問。我一直使用系統日誌,但仍然認爲它是一個PITA,可以做一個大改版,使其更具吸引力。 – 2010-10-28 19:24:31

+2

我已深入到'syslog' ruby​​實現中,它使用'syslog' C實現,並且沒有任何可能性向此C函數發送一個自定義工具,您必須在官方工具之間進行選擇:http:/ /search.cpan.org/~saper/Sys-Syslog/Syslog.pm#Facilities ..認爲這是歷史的結束:) – fguillen 2010-10-29 12:30:52

3

當您有多個工作者或線程時,記錄器並不有用,因爲日誌消息會被交錯。這就是爲什麼Rails 3中的默認記錄器是BufferedLogger。

這也是爲什麼你必須使用像rsyslog這樣的緩衝系統日誌,否則會導致你的性能下降。 (我相信syslogd使用fsync(),這是一個等待返回的同步調用。)

+0

不錯的一點!,這可以解決我們的一些記錄性能問題。 – fguillen 2011-11-02 15:38:17

3

看看Lumberjack

它有系統日誌支持的日誌設備,並且可以作爲一個選項指定設施:

require 'lumberjack' 
require 'lumberjack_syslog_device' 

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

伐木工人也有其他不少的功能,使得它值得一看。

+0

伐木工人系統日誌設備給出了原始問題中所述的相同錯誤:TypeError:無法將字符串轉換爲整數/var/lib/gems/1.9.1/gems/lumberjack_syslog_device-1.0.0/lib/lumberjack_syslog_device.rb: 99:在'開放' – 2012-04-16 13:30:34

+0

看起來像伐木工人期望只有一個固定的Syslog設施列表,例如列在https://github.com/bdurand/lumberjack_syslog_device/blob/master/lib/lumberjack_syslog_device.rb的源代碼中 - 這是一個枚舉,例如,整數。如果你交了一個字符串,它抱怨.. – Tilo 2012-11-20 20:00:17

相關問題