如何在脚本作为服务运行时获取python错误

时间:2017-09-27 21:39:02

标签: python windows service

我正在使用win32service在Python中编写Windows服务,如this question的首要答案中所述。它有效。

但是,当我编写代码时,无论何时我犯了错误(例如,变量名中的拼写错误),我得到的唯一反馈就是服务死了。

我在哪里可以看到常规的python错误?

编辑:我应该声明添加一个TimedRotatingFileHandler几乎是我迄今为止添加的唯一内容 - 是的,它可以工作,但是在捕获拼写错误或忘记前缀时没用变量名称为“self。”。我仍然需要尝试捕获异常,但即使我将其用于工作,在我看来,它仍然是一种解决方法,而不是一个真正的解决方案。

3 个答案:

答案 0 :(得分:0)

我建议先编写程序,测试一下,然后再将其编入服务中。否则,您可以尝试捕获错误并将其输出到日志文件。

答案 1 :(得分:0)

最佳做法是使用像PyCharm之类的IDE来开发您的服务,这样就可以找到丢失的尴尬(如拼写错误)。

添加日志记录系统并记录到文件也非常重要。您的服务通常由具有不同权限的特定用户执行,因此您必须注意文件访问权限。

您可以使用AppDir库来计算用户日志目录(请参阅user_log_dir属性。

然后,您可以使用RotatingFileHandler创建一个旋转日志。

简而言之:

logger = logging.getLogger("Rotating Log")
logger.setLevel(logging.INFO)

# add a rotating handler
handler = RotatingFileHandler(path, maxBytes=1024**3,  # 1 Mo
                              backupCount=5)
logger.addHandler(handler)

当然,必须在“主要”功能中定义此记录器。

您的“main”函数必须具有异常处理程序。 您需要捕获所有exceptions(KeyboardInterrupt和SystemExit除外)并记录它们。

总结:

def main():
    logger = init_logger()
    try:
        main_impl()
    except Exception as exc:
        logger.error("Last chance exception", exc_info=True)
        raise SystemExit(1)

答案 2 :(得分:0)

该代码使用pywin32。因此,除了标准

python myservice.py install
python myservice.py start

还有

python myservice.py debug

它也不会提供所有错误,但在许多情况下会提供有价值的线索。