2

我想将“check_call()”的“stdout”和“stderr”输出发送到 Syslog。这可能吗?

代码:

def command(cmd, err=None, ifexit=False):
    try:
        check_call(shlex.split(cmd), stdout=null, stderr=null)

    except CalledProcessError:
        if err != None:
            print err

        if ifexit == True:
            exit(1)
4

2 回答 2

2

是的,这是可能的,但我认为您需要使用Popen而不是check_call,并将进程发送stdoutstderr正确配置的记录器。这样的记录器将用于logging.handlers.SysLogHandler向您的系统日志服务器发送消息。以下是如何创建此类记录器的简短示例:

import logging

handler = logging.handlers.SysLogHandler()
logger = logging.getLogger('myApplication')
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)

这是一个如何替换check_call数据Popen并将数据发送到记录器的示例:

process = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE)
# Popen.wait() waits for the command to complete and 
# returns the command's return code
if process.wait() != 0:
    print "AN ERROR OCCURED"
logger.error(process.stderr)
logger.info(process.stdout)
于 2011-09-03T06:11:58.083 回答
1

我在 2017 年遇到了这个问题,所以我认为继续为 Python 3 更新它可能会很好,因为解决方案需要稍作修改。为了能够SysLogHandler在 Python 3 中使用,您必须按如下方式调整代码:

 import logging
 import logging.handlers as handlers

 handler = handlers.SysLogHandler(address='/dev/log')
 logger = logging.getLogger('myApplication')
 logger.setLevel(logging.DEBUG)
 logger.addHandler(handler)

如此处详述,SysLogHandler

返回 SysLogHandler 类的新实例,该实例旨在与远程 Unix 机器通信,其地址由 (host, port) 元组形式的地址给出。如果未指定地址,则使用 ('localhost', 514)。该地址用于打开套接字。提供(主机,端口)元组的替代方法是将地址作为字符串提供,例如“/dev/log”。在这种情况下,使用 Unix 域套接字将消息发送到 syslog。

于 2017-02-23T23:05:25.237 回答