【问题标题】:Running Python script as upstart service shows different time output将 Python 脚本作为新贵服务运行显示不同的时间输出
【发布时间】:2012-06-28 14:32:16
【问题描述】:

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

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

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

【问题讨论】:

  • 在您的新贵配置中,是否设置了 TZ 环境变量?
  • 我实际上将它添加到了新贵的配置中,以查看这是否可行,但它没有做任何事情。我是新手,但我尝试了exec TZ=/usr/share/zoneinfo/US/Centralexec export TZ=/usr/share/zoneinfo/US/Central,但是当我重新启动服务时,它仍然有时间在格林威治标准时间。
  • 也许发布您的示例代码,以便我们进行试验?我假设如果您在登录访客会话时运行它,它也可以在当地时间正常工作?
  • 我添加了我正在使用的基本 python 以及 upstart 配置。
  • 无论如何,您都应该使用 GMT 进行日志记录,这样可以更轻松地比较来自不同时区的服务器的日志。

标签: python upstart


【解决方案1】:

在 upstart 下检查你的脚本环境。 localtime()TZ/TZDIR//etc/localtime 获取时区信息,'GMT' 是硬编码的默认值(请参阅glibc 来源中的time/tzset.c)。环境可能是 chrooted 或以其他方式受到限制,您的 TZ 规范可能不起作用。

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

【讨论】:

  • 不幸的是,我在 strace 输出中找不到对时区的任何引用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-17
    • 2019-04-19
    • 2017-08-01
    • 2019-04-18
    • 1970-01-01
    • 2015-05-03
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多