Журнал Python: переопределить время журнала
-
28-10-2019 - |
Вопрос
Следующий Документация 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()
не использует миллисекунды, так что информация MS, содержащаяся в объекте 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
объект. Вы могли бы - например, пройти время, уже отформатированную как строка, а не фальшивое время. В зависимости от ваших потребностей, конечно, могут быть лучшие методы!
Вот лучший пример, который позволяет заменить сгенерированное время, так как принятый ответ на самом деле не сделал этого.
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