2013-02-11 66 views
1

爲什麼在日誌框架中調用日誌框架不會產生輸出到日誌(file,stdout,...)?Python日誌記錄模塊在安裝的windows服務中不起作用

我的Python服務具有一般形式:

import logging 

logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 
fh = logging.FileHandler('out.log') 
logger.addHandler(fh) 

logger.error("OUTSIDE") 

class Service (win32serviceutil.ServiceFramework): 
    _svc_name_ = "example" 
    _svc_display_name_ = "example" 
    _svc_description_ = "example" 

    def __init__(self,args): 
     logger.error("NOT LOGGED") 
     win32serviceutil.ServiceFramework.__init__(self,args) 
     self.hWaitStop = win32event.CreateEvent(None,0,0,None) 
     servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, 
       servicemanager.PYS_SERVICE_STARTED, 
       (self._svc_name_,'')) 

    def SvcStop(self): 

     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     win32event.SetEvent(self.hWaitStop) 
     self.stop = True 

    def SvcDoRun(self): 

     self.ReportServiceStatus(win32service.SERVICE_RUNNING) 
     self.main() 

    def main(self): 
     # Service Logic 
     logger.error("NOT LOGGED EITHER") 
     pass 

到logger.error第一次調用產生的輸出,而不是兩個服務類中(即使安裝服務,使後確保它正在運行) 。

+1

您是否正在查看日誌文件的正確文件夾?服務在Windows文件夾中運行。 – CoreTech 2013-02-11 14:18:38

+0

設置輸出日誌的絕對路徑會有所作爲嗎? – 2013-02-11 14:29:20

+0

實際上我將它設置爲絕對路徑(在我的示例中未顯示)。我看到正在創建的日誌文件,並且第一個logger.error(「OUTSIDE」)消息在那裏。另外兩個沒有被記錄。 – mpaf 2013-02-11 14:47:53

回答

0

實際上外部記錄器初始化兩次。

這兩個外部記錄器處於不同的過程。一個是python進程,另一個是windows服務進程。

由於某種原因,第二個沒有配置成功,並且在這個過程裏面的記錄器也一樣。這就是爲什麼你不能找到內部日誌。

1

我發現只有在實際服務循環內的日誌記錄才能與日誌記錄模塊一起工作,並且日誌文件以類似C:\python27\Lib\site-packages\win32的方式結束。

我放棄了Windows日誌記錄模塊的日誌記錄,因爲它看起來不太有效。相反,我開始使用Windows日誌記錄服務,例如servicemanager.LogInfoMsg()及相關功能。這將事件記錄到Windows應用程序日誌中,您可以在事件查看器(開始 - >運行 - >事件查看器,Windows日誌文件夾,應用程序日誌)中找到它。

0

您必須編寫日誌文件的完整路徑。

例如

fh = logging.FileHandler('C:\\out.log')