syslog中的多行日志记录

Sha*_*sky 36 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!
Run Code Online (Sandbox Code Playgroud)

测试代码,以备不时之需:

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")
Run Code Online (Sandbox Code Playgroud)

Nic*_*kiy 35

或者,如果要将syslog保持在一行上以进行解析,则只需在查看日志时替换字符即可.

tail -f /var/log/syslog | sed 's/#012/\n\t/g'
Run Code Online (Sandbox Code Playgroud)

  • sed 不起作用,得到“blah blah line1 **nt** blah blah line2”。但是 perl 确实有效:`tail -f /var/log/syslog | perl -pe 's/#012/\n\t/g;'` (2认同)

Sha*_*sky 31

好的,终于搞清楚了......

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

$EscapeControlCharactersOnReceive off
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,"丢失"意味着"无法重建".在大批量应用程序中,将日志的含义分成多行通常会导致无法重新组合,因为来自多个请求的行会交错. (14认同)
  • 这可能适用于您的情况,但如果您正在编写大量并发应用程序,@ Nick的答案将使您更容易找到与堆栈跟踪一起使用的所有行.您的解决方案将在第一个之后丢失所有行的应用程序名称和级别名称,从而使搜索变得困难. (9认同)
  • 通常,您将日志从多个线程/进程/节点发送到数量较少的收集器。在这种情况下,收集器必须以某种方式交错日志*(readline,循环?读取直到没有更多数据,循环?)。 (2认同)