私は、基本的にいくつかの単純なネットワークタスクを実行する小さなソケットサーバーであるPythonスクリプトを持っており、それを追跡し、実行されているかどうかを管理するためのアップスタートサービスとして実行を開始しました。情報をログに記録するために、Pythonの組み込みのログモジュールを使用しています。Upstartサービスとして実行しているときに、小さな問題に気づきました。すべての時間の呼び出しはGMTで発信されます。単独で(またはのいずれ./scriptname.py
かpython 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