Python protokolování čas použít aktualizovaný OS časové pásmo (náhradní času.tzset() v systému Windows)

0

Otázka

AKTUALIZACE: Původní otázka se zdá být neplatná, i když se mi podařilo vynutit logger používat datetime.now()to stále neřeší můj konečný cíl učinit přihlášení časová razítka reagovat na OS časové pásmo změny bez restartu pythonu. Poskytl jsem odpověď, kterou jsem našel níže.

Jak vynutit logger používat datetime.now() místo time.asctime()? Musím protokol striktně dodržovat OS Windows poskytnutý čas, ale time.asctime() pokusy převést časové pásmo, pokud si myslí, že je to potřeba. Jak mám přepsat toto chování?

V současné době jsem použít vlastní přihlášení.formát podtřídy s řetězec formátu '{asctime}: {levelname} - {message}'

Účelem toho je, protože můj skript v pythonu změny v OS časové pásmo během výkonu. Chci se přihlásit, aby okamžitě sledovat aktualizované časové pásmo hned po změně scénáře. Snažil jsem se definovat converter funkce uvnitř logging.format podtřídy, ale to mělo za následek časové pásmo v protokolech není aktualizován, i když jsem ho změnil.

Kód jsem použil (od doc https://docs.python.org/3.9/library/logging.html#logging.Formatter.formatTime):

class custom(logging.Formatter):
    def converter(self, timestamp):
        return datetime.now()

Snažil každou odpověď zde: Jak Změnit časové pásmo v Python protokolování?, non pracuje jako všichni nemají aktualizovat na nové časové pásmo, nastavení v OS tím, že můj scénář. Snažil jsem se importlib.reload(tzlocal) a také ničemu.

Jediná rozumná odpověď, kterou jsem našel byl k použití time.tzset() ale to zřejmě není k dispozici na Windows

datetime logging python time
2021-11-23 11:56:40
1

Nejlepší odpověď

0

Po nějakém výzkumu, který jsem vyřešil můj problém s použitím ctypes, který je inspirován tuto odpověď. V podstatě, jsem přepsat logging.Formatter.formatTime funkce přidáním volání Windows API systému získat aktuální čas systému. To je zcela jiný přístup než všechny existující moduly pythonu (time, datetime, pytz atd.) jako časové pásmo info není vyrovnávací paměti, když python interpreter spuštěn.

Kód:

class real_time_formatter(logging.Formatter):
    def formatTime(self, record, datefmt=None):
        class SYSTEMTIME(ctypes.Structure):
            _fields_ = [('wYear', ctypes.c_int16),
                        ('wMonth', ctypes.c_int16),
                        ('wDayOfWeek', ctypes.c_int16),
                        ('wDay', ctypes.c_int16),
                        ('wHour', ctypes.c_int16),
                        ('wMinute', ctypes.c_int16),
                        ('wSecond', ctypes.c_int16),
                        ('wMilliseconds', ctypes.c_int16)]

        lpSystemTime = ctypes.pointer(SystemTime)
        ctypes.windll.kernel32.GetLocalTime(lpSystemTime)
        year = '0' * (4 - len(str(SystemTime.wYear))) + str(SystemTime.wYear)
        month = '0' * (2 - len(str(SystemTime.wMonth))) + str(SystemTime.wMonth)
        day = '0' * (2 - len(str(SystemTime.wDay))) + str(SystemTime.wDay)
        hour = '0' * (2 - len(str(SystemTime.wHour))) + str(SystemTime.wHour)
        minute = '0' * (2 - len(str(SystemTime.wMinute))) + str(SystemTime.wMinute)
        second = '0' * (2 - len(str(SystemTime.wSecond))) + str(SystemTime.wSecond)
        ms = '0' * (3 - len(str(SystemTime.wMilliseconds))) + str(SystemTime.wMilliseconds)
        return f'{year}-{month}-{day} {hour}:{minute}:{second}:{ms}'  # 2003-01-23 00:29:50,411

streamHandler.setFormatter(real_time_formatter())

To napodobuje python {asctime} formátování, a samozřejmě, můžete změnit to, jak chcete, protože to je jen f-string.

2021-11-25 07:37:20

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................