4

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
4

3 に答える 3

3

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
于 2011-12-04T19:46:50.303 に答える
1

timetuple()メソッドが呼び出されると、日時オブジェクトに含まれるミリ秒情報が失われるように、ミリ秒を使用しません。

>>> 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_timetypeの制限であることに注意してください。

time.struct_time肝心なのは、タイムスタンプをオーバーライドする必要がある場合は、オブジェクトを通過しないことです。たとえば、偽の時刻ではなく、すでに文字列としてフォーマットされているタイムスタンプを渡すことができます。もちろん、ニーズに応じて、より良い方法があるかもしれません!

于 2011-12-04T17:17:23.680 に答える
0

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

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
于 2015-10-28T20:10:26.300 に答える