2013-02-11 68 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')