所以我已经将我的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")
答案 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()