首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务-日志不工作

服务-日志不工作
EN

Stack Overflow用户
提问于 2019-08-19 15:06:02
回答 2查看 2.9K关注 0票数 1

使用Python3.7,Windows10Pro,Pywin32

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

代码语言:javascript
复制
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)

我已经经历了基本的问题解决与此,服务是安装,启动,重新启动和删除没有任何错误。但是,我期望日志文件接收基本输出,以显示函数正在被击中,但它没有。

我在admin命令提示符下打的电话:

代码语言:javascript
复制
C:\PythonScripts\SearchServer>python servicetest.py install
Installing service TestService
Service installed

C:\PythonScripts\SearchServer>python servicetest.py start
Starting service TestService

C:\PythonScripts\SearchServer>python servicetest.py restart
Restarting service TestService

C:\PythonScripts\SearchServer>python servicetest.py remove
Removing service TestService
Service removed

C:\PythonScripts\SearchServer>

日志文件的内容:

代码语言:javascript
复制
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的新手,我想知道我是否错过了什么?我假设函数名是预先定义的,不需要我设置委托来访问它们。在我遇到的任何问题中,我都没有看到过这种情况。

当然,我假设这些函数应该被击中,并且它们正在被击中,并且能够创建日志?

任何感激的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-20 11:49:16

代码有几个问题:

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

在所有这些更改之后,脚本将如下所示:

代码语言:javascript
复制
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)

输出:

类打开Init运行主类打开调用句柄命令行

票数 5
EN

Stack Overflow用户

发布于 2021-08-12 12:18:04

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

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57559440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档