2011-09-03 43 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域套接字將消息發送到系統日誌。