質問

続く Pythonのドキュメント, 、私はオーバーライドしようとしています logging.Formatter.converter ログに記録された時間を制御するため。
以下に示すように - ミリ秒はオーバードリデンではありませんでした (それらは現在の時間ミリ秒です)。

どうして?ミリ秒を制御するにはどうすればよいですか?

>>> import logging, datetime
>>> formatter = logging.Formatter('%(asctime)s:%(message)s')
>>> handler = logging.StreamHandler()
>>> handler.setFormatter(formatter)
>>> def sim_time(t):
...     return datetime.datetime(2000,1,2,3,4,5,678).timetuple()
...
>>> formatter.converter = sim_time
>>> log = logging.getLogger('test')
>>> log.addHandler(handler)
>>> log.info('hi')
2000-01-02 03:04:05,898:hi
>>> log.info('hi')
2000-01-02 03:04:05,914:hi
>>> log.info('hi')
2000-01-02 03:04:05,434:hi
役に立ちましたか?

解決

オーバーライド logging.Formatter.formatTime() 代わりにこれで:

def sim_time(record, datefmt=None):
    return datetime.datetime(2000,1,2,3,4,5,678).strftime('%Y-%m-%d %H:%M:%S,%f')[:-3]

formatter.formatTime = sim_time

このプロセスのすべてのロガーに必要な場合は、クラス機能自体をオーバーライドできますが、最初のものの直後にこれを行うことができます import logging 声明あなたのコードの出会い:

def sim_time(self, record, datefmt=None):
    return datetime.datetime(2000,1,2,3,4,5,678).strftime('%Y-%m-%d %H:%M:%S,%f')[:-3]

import logging
logging.Formatter.formatTime = sim_time

他のヒント

timetuple() Millisecondsは使用しないため、DateTimeオブジェクトに含まれるMS情報がメソッドが呼び出されると失われます。

>>> d
datetime.datetime(2000, 1, 2, 3, 4, 5, 678)
>>> d.timetuple()
time.struct_time(tm_year=2000, tm_mon=1, tm_mday=2, tm_hour=3, tm_min=4, tm_sec=5, tm_wday=6, tm_yday=2, tm_isdst=-1)

これはこの特定の方法の制限ではなく、むしろ time.struct_time タイプ.

一番下の行は次のとおりです。タイムスタンプをオーバーライドする必要がある場合は、 time.struct_time 物体。たとえば、偽の時間ではなく、既に文字列としてフォーマットされているタイムスタンプを渡すことができます。もちろん、ニーズに応じて、より良い方法があるかもしれません!

受け入れられた答えが実際にはそうしなかったため、生成された時間を置き換えることができるより良い例を次に示します。

def inSimulatedTime(self,secs=None):
    global myTimeKeeper
    try:
       ts=myTimeKeeper.getCurrentTimeLocal() # returns a datetime.datetime object
       return ts.timetuple()
except Exception as e:
    #sometimes my timekeeper hasn't been initialized yet.
    return time.localtime(secs)

それを有効にするため:

logging.Formatter.converter=inSimulatedTime
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top