2011-09-03 46 views
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) 

回答

2

是的,它是可能的,但我想你会需要使用Popen代替check_call,并发送进程的stdoutstderr到正确配置的记录。 这样的记录器将使用​​将消息发送到您的系统日志服务器。下面是这样一个记录器如何能够创建一个简单的例子:

import logging 

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

这里是你如何可以取代check_callPopen并将数据发送到记录器的例子:

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) 
+0

好的,但我怎么让Popen告诉我,如果命令执行成功? – Soviero

+0

@Kevin只需检查['process.returncode'](http://docs.python.org/library/subprocess.html?highlight=subprocess#subprocess.Popen.returncode)值或使用'process.wait() '方法。我已经更新了我的答案,等待命令完成并检查它是否成功。 – MatToufoutu

1

我在2017年遇到了这个问题,所以我认为继续前进并更新Python 3可能是件好事,因为解决方案需要稍作修改。为了能够利用在Python 3 SysLogHandler,你将不得不调整的代码如下:

import logging 
import logging.handlers as handlers 

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

至于详细hereSysLogHandler

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