如何在 python 中将日志发送到 syslog?

Posted

技术标签:

【中文标题】如何在 python 中将日志发送到 syslog?【英文标题】:How do I send log to syslog in python? 【发布时间】:2020-11-23 00:45:54 【问题描述】:

我有一个脚本来处理一个文件。一开始我想检查文件是否存在,如果存在并且不为空或不是太旧。如果满意继续处理。如果不满意,我如何登录到 syslog 并退出而不继续? 这是我的代码:

import sys
import os
import time

if os.path.isfile("/path/file"):
    x=os.stat('/path/file')
    Result=(time.time()-x.st_mtime)
    if os.stat("/path/file").st_size != 0 && Result > 300:
        f = open("/path/file", "r")
    else:
        ## log to syslog then exit script
else:
    ## log to syslog thn exit script

## section to continue processing
f1_to_process = f.read()
...
f.close()

阅读一些关于日志记录的文档,不太了解实现它的正确方法。我不确定我的逻辑是否有意义。我可以给点建议吗?提前致谢。

【问题讨论】:

通常,旨在记录到系统日志的进程将作为服务运行,负责启动它的程序(systemd,在现代 Linux 系统中)负责路由其 stdout 和 stderr到相应的日志。您很少会编写代码来将日志路由为程序本身的一部分——让系统管理员安装您的程序来决定将其输出定向到哪里;他们最清楚自己的企业日志管理标准是什么。 【参考方案1】:

您可以将syslog 模块与quit 函数一起使用:

import sys
import os
import time
from syslog import syslog

def log_and_exit(message):
    syslog(message)
    quit()

if os.path.isfile("/path/file"):
    x=os.stat('/path/file')
    Result=(time.time()-x.st_mtime)
    if os.stat("/path/file").st_size != 0 && Result > 300:
        f = open("/path/file", "r")
    else:
        log_and_exit("foo")
else:
    log_and_exit("bar")

## section to continue processing
f1_to_process = f.read()
# ...
f.close()

【讨论】:

感谢@Aplet123,效果很好!我需要在其他方面工作,将“&&”替换为“and”。

以上是关于如何在 python 中将日志发送到 syslog?的主要内容,如果未能解决你的问题,请参考以下文章

c#在linux上向本地syslog服务发送消息

python3/syslog:多个系统日志流?

syslog-ng 尾文件缺少最后一行

如何从发送到 Logstash 的 syslog 日志中检索标签?

使用 Groovy 或 Java 将日志发送到 Syslog 服务器

如何使用 SYSLOG 和 TLS 从 Windows 服务发送日志?