syslog中的多行日志记录

时间:2011-03-28 19:26:29

标签: python logging syslog rsyslog

所以我已经将我的Python应用程序配置为使用Python的SysLogHandler登录到syslog,一切正常。除了多线处理。并不是说我需要如此糟糕地发出多行日志记录(我做了一点),但我需要能够阅读Python的异常。我正在使用Ubuntu和rsyslog 4.2.0。这就是我得到的:

Mar 28 20:11:59 telemachos root: ERROR 'EXCEPTION'#012Traceback (most recent call last):#012  File "./test.py", line 22, in <module>#012    foo()#012  File "./test.py", line 13, in foo#012    bar()#012  File "./test.py", line 16, in bar#012    bla()#012  File "./test.py", line 19, in bla#012    raise Exception("EXCEPTION!")#012Exception: EXCEPTION!

如果您需要,请测试代码:

import logging
from logging.handlers import SysLogHandler

logger = logging.getLogger()
logger.setLevel(logging.INFO)
syslog = SysLogHandler(address='/dev/log', facility='local0')
formatter = logging.Formatter('%(name)s: %(levelname)s %(message)r')
syslog.setFormatter(formatter)
logger.addHandler(syslog)

def foo():
    bar()

def bar():
    bla()

def bla():
    raise Exception("EXCEPTION!")

try:
    foo()
except:
    logger.exception("EXCEPTION")

3 个答案:

答案 0 :(得分:35)

或者,如果您希望将syslog保持在一行上以进行解析,则可以在查看日志时替换字符。

tail -f /var/log/syslog | sed 's/#012/\n\t/g'

答案 1 :(得分:31)

好的,终于明白了......

默认情况下,rsyslog会转义所有奇怪的字符(ASCII&lt; 32),这包括换行符(以及制表符和其他)。只需将其添加到您的rsyslog配置中即可将其关闭:

$EscapeControlCharactersOnReceive off

答案 2 :(得分:3)

另一种选择是继承SysLogHandler并覆盖B=zeros(size(A)); for k=1:size(A,1) a=A(k,:) [b,ia]=sort(a,'descend') c=cumsum(b) jj=find(c>=6,1) idx=ia(1:jj) B(k,idx)=1 end - 然后你可以为你发送的文本中的每一行调用超类emit()。类似的东西:

emit()