作为Upstart服务运行Python脚本显示不同的时间输出

3
我有一个Python脚本,实际上是一个小型的socket服务器,可以为我执行一些简单的网络任务。我开始将其作为upstart服务运行,以便跟踪它并管理它是否正在运行。为了记录信息,我使用Python的内置logging模块。当作为Upstart服务运行时,我注意到一个小问题:所有时间调用都是GMT时间。当独立运行它(无论是./scriptname.py还是python scriptname.py)时,它使用本地时间,并且Python知道本地时间。系统时间已正确设置,只有在作为upstart服务运行时才会出现此行为。有人知道为什么会发生这种情况以及我该如何解决吗?
编辑:相关代码:我有一个助手类,方便地称为helper,其中包含一些常用函数(我知道它需要更好地组织,但它是相当快速地拼凑起来的)。最值得注意的是我用来设置日志记录器的这个函数:
class helper:
    log_format = '%(asctime)-25s %(name)-25s %(levelname)-12s %(message)s'

    @staticmethod
    def createLogger(name):
        rotatingFile = logging.handlers.RotatingFileHandler('/var/log/myLog.log', maxBytes=1048576, backupCount=5)
        rotatingFile.setLevel(logging.DEBUG)
        formatter = logging.Formatter(helper.log_format)
        formatter.time = localtime()
        rotatingFile.setFormatter(formatter)
        log = logging.getLogger(name)
        log.setLevel(logging.DEBUG)
        logging.basicConfig(format=helper.log_format, level=logging.DEBUG)
        if not log.handlers:
            log.addHandler(rotatingFile)
        return log

它在我的一个课程中被用作以下方式:

class MyClass:

    def __init__(self):
        self._log = helper.createLogger('LogName')
        self._log.info('Some relevant info')

    _log = None

这是使用Python内部日志工具的基本操作。在我注意到这个问题之后,我添加了formatter.time = localtime(),但在意识到它只在作为服务运行时出现问题之前。这并没有起到帮助作用。

下面是我从教程中学到的(非常基础的)Upstart配置:

description "Blah blah"
author  "My Name <My Email>"

start on runlevel [234]
stop on runlevel [0156]

exec /path/to/script.py

respawn

1
在您的upstart配置中,是否设置了TZ环境变量? - Mark
我实际上将其添加到了upstart配置中,以查看是否有效,但它没有起作用。我对upstart很陌生,但我尝试了exec TZ=/usr/share/zoneinfo/US/Centralexec export TZ=/usr/share/zoneinfo/US/Central,但当我重新启动服务时,它仍然显示GMT时间。 - Annath
1
也许您可以发布一下您的示例代码,这样我们就可以进行实验了?我假设如果您在访客会话中运行它,那么它也能正确地使用本地时间? - bryce
我添加了我正在使用的基本Python以及upstart配置。 - Annath
1
无论如何,您应该使用GMT进行日志记录,这样可以更轻松地比较来自不同时区服务器的日志。 - Paulo Scardine
显示剩余2条评论
2个回答

1

在upstart下检查您的脚本环境。 localtime()TZ/TZDIR//etc/localtime获取时区信息,'GMT'是硬编码的默认值(请参见glibc源代码中的time/tzset.c)。 环境可能被chroot或以其他方式受限,并且您的TZ规范可能无法工作。

作为快速检查,您可以使用strace -o <outfile> -ff start <jobname>来查看python是否在启动时读取了正确的时区文件。


很不幸,我在strace输出中找不到任何有关时区的参考资料。 - Annath

1

所以,我想我终于发现了问题所在。我需要设置TZ环境变量,但之前我做得不对。将env TZ=/usr/share/zoneinfo/US/Central添加到我的upstart配置中纠正了它。感谢大家的帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接