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

时间:2012-06-28 14:32:17

标签: python upstart

我有一个python脚本本质上是一个小型套接字服务器,它为我做了一些简单的网络任务,我开始将它作为一个新兴服务运行,以跟踪它并管理它是否正在运行。要记录信息,我使用的是Python的内置日志记录模块。当作为Upstart服务运行时,我注意到一个小问题:所有的时间呼叫都出现在GMT中。当它自己运行时(./scriptname.pypython scriptname.py),它使用本地时间,Python知道当地时间。系统时间设置正确,我只在作为upstart服务运行时才会看到此行为。有谁知道为什么会发生这种情况以及如何解决它?

编辑:相关代码:我有一个辅助类,方便地称为帮助程序,它包含一些常用的函数(我知道它需要更好地组织,但它很快被抛到一起)。最值得注意的是我用来设置记录器的这个功能:

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(),但在我意识到它只在作为服务运行时才发生。它没有帮助。

这是我从教程中获得的(非常基本的)新贵配置:

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

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

exec /path/to/script.py

respawn

2 个答案:

答案 0 :(得分:1)

在暴发户下检查脚本的环境。 localtime()TZ / TZDIR / /etc/localtime获取时区信息,'GMT'是硬编码默认值(请参阅time/tzset.c来源中的glibc )。环境可能会被chrooted或以其他方式限制,您的TZ规范可能无效。

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

答案 1 :(得分:1)

所以,我想我终于发现了这个问题。我需要设置TZ env var,但我之前没有这样做。将env TZ=/usr/share/zoneinfo/US/Central添加到我的upstart配置更正了它。感谢大家的帮助!