Python Windows Service - 日志记录不起作用



Using Python 3.7, Windows 10 Pro, Pywin32

我有一个测试脚本,它启动服务并在发出不同命令时将一些基本行推送到日志文件中。代码如下:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import logging

class AppServerSvc(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
_svc_description_ = "New Test Service"
logging.basicConfig(filename='search_server.log', level=logging.INFO)
logging.info('Class opened')
def __init__(self, args):
logging.basicConfig(filename='search_server.log', level=logging.INFO)
logging.info('Init')
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)

def SvcStop(self):
logging.basicConfig(filename='search_server.log', level=logging.INFO)
logging.info('Stop')
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)

def SvcDoRun(self):
logging.basicConfig(filename='search_server.log', level=logging.INFO)
logging.info('Run')
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ''))
self.main()

def main(self):
print("running")
logging.basicConfig(filename='search_server.log', level=logging.INFO)
logging.info('Main')

if __name__ == '__main__':
logging.basicConfig(filename='search_server.log', level=logging.INFO)
logging.info('Calling Handle Command Line')
win32serviceutil.HandleCommandLine(AppServerSvc)

我已经对此进行了基本的故障排除,并且该服务正在安装,启动,重新启动和删除,没有任何错误。 但是,我希望日志文件接收基本输出以显示函数被命中,但事实并非如此。

我在管理员命令提示符下拨打的电话:

C:PythonScriptsSearchServer>python servicetest.py install
Installing service TestService
Service installed
C:PythonScriptsSearchServer>python servicetest.py start
Starting service TestService
C:PythonScriptsSearchServer>python servicetest.py restart
Restarting service TestService
C:PythonScriptsSearchServer>python servicetest.py remove
Removing service TestService
Service removed
C:PythonScriptsSearchServer>

日志文件的内容:

INFO:root:Class opened
INFO:root:Calling Handle Command Line
INFO:root:Class opened
INFO:root:Calling Handle Command Line
INFO:root:Class opened
INFO:root:Calling Handle Command Line
INFO:root:Class opened
INFO:root:Calling Handle Command Line

如您所见,每次发出命令时都会命中该服务,但是我希望也会调用内部函数。 作为服务和 Python 的新手,我想知道我是否错过了什么? 我假设函数名称是预定义的,不需要我设置委派来访问它们。 这不是我在遇到的任何问题中看到的。

我当然假设这些功能应该被击中并且它们被击中并且能够创建日志?

任何帮助都感激不尽。

代码存在一些问题:

  1. logging.basicConfig(( 应该只调用一次,如果再次调用它不会有任何影响。
  2. 由于代码的自然流,类定义将首先在代码中调用,甚至在块if __name__ == '__main__':之前调用。因此,您在类定义中的logging.basicConfig((中设置的任何内容都将成为整个脚本的最终版本。它不是此设置的理想位置,因此应移至其他地方(最好在顶部,最好在类之外(。
  3. 在 logging.basicConfig 中传递的 filename 参数应该是绝对文件路径,因为一旦服务开始运行,其当前路径将与脚本不同,因此日志记录将无法找到日志文件。(服务的当前工作目录将变为类似于 C:\Python37\lib\site-packages\win32(。
  4. (可选(:尽量不要使用根日志记录配置,最好有一个记录器实例供您自己使用。

完成所有这些更改后,脚本将如下所示:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import logging.handlers
log_file_path = ""  # mention full path here
mylogger = logging.getLogger("TestLogger")
mylogger.setLevel(logging.INFO)
handler = logging.handlers.RotatingFileHandler(log_file_path)
mylogger.addHandler(handler)
class AppServerSvc(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
_svc_description_ = "New Test Service"
mylogger.info('Class opened')
def __init__(self, args):
mylogger.info('Init')
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)

def SvcStop(self):
mylogger.info('Stop')
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)

def SvcDoRun(self):
mylogger.info('Run')
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ''))
self.main()

def main(self):
print("running")
mylogger.info('Main')
if __name__ == '__main__':
mylogger.info('Calling Handle Command Line')
win32serviceutil.HandleCommandLine(AppServerSvc)

输出:

Class opened
Init
Run
Main
Class opened
Calling Handle Command Line

我在 python 日志记录方面遇到了无法解释的问题,我通过在程序开始时设置日志记录来解决它们:

import logging
logging.basicConfig(filename='convert_st.log', level=logging.INFO)
logging.info('Started')
import all_other_packages
import...
...
def main:
# main comes here
...
if __name__ == '__main__':
main()

最新更新