3

私は、基本的にいくつかの単純なネットワークタスクを実行する小さなソケットサーバーである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

そして、それは私のクラスの1つで次のように使用されます。

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
4

2 に答える 2

1

それで、ようやく問題を発見したと思います。TZ env varを設定する必要がありましたが、直前には設定していませんでした。upstart構成に追加env TZ=/usr/share/zoneinfo/US/Centralすると、修正されました。みんな助けてくれてありがとう!

于 2012-07-09T20:10:17.503 に答える
1

upstartでスクリプトの環境を調べます。//localtime()からタイムゾーン情報を取得します。「GMT」はハードコードされたデフォルトです(ソースを参照)。環境がchrootされているか、制限されている可能性があり、TZ仕様が機能しない可能性があります。TZTZDIR/etc/localtimetime/tzset.cglibc

簡単なチェックとして、strace -o <outfile> -ff start <jobname>Pythonが起動時に正しいタイムゾーンファイルを読み取るかどうかを確認するために使用できます。

于 2012-07-09T02:31:39.947 に答える