Журнал Python: переопределить время журнала - PullRequest
4 голосов
/ 04 декабря 2011

Следуя документации 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

Ответы [ 3 ]

3 голосов
/ 04 декабря 2011

вместо 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 голос
/ 04 декабря 2011

timetuple() не использует миллисекунды, поэтому информация мс, содержащаяся в объекте datetime, теряется при вызове метода:

>>> 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. Например, вы можете передать временную метку, уже отформатированную в виде строки, а не фиктивное время. Конечно, в зависимости от ваших потребностей, могут быть и лучшие методы!

0 голосов
/ 28 октября 2015

Вот лучший пример, который позволяет вам заменить сгенерированное время, поскольку принятый ответ на самом деле этого не делает.

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