2011-12-04 17 views
2

Python's documentationに続いて、ログに記録された時間を制御するためにlogging.Formatter.converterをオーバーライドしようとしています。
以下に見られるように、ミリ秒はオーバーライドされません(現在のミリ秒です)。Pythonロギング:ログ時間をオーバーライド

どうしてですか?どのようにしてミリ秒も制御できますか?

>>> 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 

答えて

2

これに代わりオーバーライド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 
1

timetuple() 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 typeのものです。

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

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 
関連する問題