Python日志模块在安装的Windows服务中无法工作

3 投票
3 回答
3624 浏览
提问于 2025-04-17 15:30

为什么在一个Python服务中调用日志框架却没有输出到日志(文件、标准输出等)呢?

我的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能正常输出,但在服务类里面的两个调用却没有输出(即使我已经安装了服务并确认它正在运行)。

3 个回答

0

其实外面的日志记录器初始化了两次。

这两个外部日志记录器是在不同的进程中。一个是在Python进程中,另一个是在Windows服务进程中。

由于某种原因,第二个日志记录器没有成功配置,而这个进程里的内部日志记录器也是如此。这就是为什么你找不到内部日志的原因。

1

你需要写出日志文件的完整路径。

比如:

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

我发现只有在实际的服务循环中记录日志才有效,使用日志模块时,日志文件会出现在类似于 C:\python27\Lib\site-packages\win32 的地方。

因为在Windows上使用日志模块效果不太好,所以我放弃了这个方法。于是我开始使用Windows的日志服务,比如 servicemanager.LogInfoMsg() 和相关的函数。这些可以把事件记录到Windows的应用程序日志里,你可以在事件查看器中找到这些日志(开始->运行->事件查看器,Windows日志文件夹,应用程序日志)。

撰写回答