¿Cómo personalizar el formato de hora para el registro de Python?

5 minutos de lectura

avatar de usuario
Hai vu

Soy nuevo en el paquete de registro de Python y planeo usarlo para mi proyecto. Me gustaría personalizar el formato de hora a mi gusto. Aquí hay un código corto que copié de un tutorial:

import logging

# create logger
logger = logging.getLogger("logging_tryout2")
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s")

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# "application" code
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")

Y aquí está la salida:

2010-07-10 10:46:28,811;DEBUG;debug message
2010-07-10 10:46:28,812;INFO;info message
2010-07-10 10:46:28,812;WARNING;warn message
2010-07-10 10:46:28,812;ERROR;error message
2010-07-10 10:46:28,813;CRITICAL;critical message

Me gustaría acortar el formato de tiempo a solo: ‘2010-07-10 10:46:28‘, eliminando el sufijo de milisegundos. Miré el Formatter.formatTime, pero confundido. Agradezco su ayuda para lograr mi objetivo. Gracias.

avatar de usuario
Tiburón metálico

Desde el documentación oficial con respecto a la clase Formatter:

El constructor toma dos argumentos opcionales: una cadena de formato de mensaje y una cadena de formato de fecha.

Así que cambia

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s")

a

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s",
                              "%Y-%m-%d %H:%M:%S")

  • Tenga en cuenta que si está usando el método dictConfig para configurar el registro (por ejemplo, si está usando Django), puede configurarlo usando la tecla de dictado ‘datefmt’ para un formateador. Ver: Configuración de registro de Django , módulo de registro: detalles del esquema del diccionario

    – taleinat

    2 mayo 2013 a las 17:49


  • Además, si está configurando el registro con basicConfig, se necesita un parámetro con nombre llamado datefmt

    –Bruno Lopes

    9 de mayo de 2013 a las 12:11

  • En 1.9, si está utilizando una configuración de REGISTRO, puede incluir una entrada ‘datefmt’ como esta… 'formatters': { 'default': { 'format': '%(asctime)s | %(levelname)s | %(module)s | %(message)s', 'datefmt': '%Y-%m-%d %H:%M', },

    – jcfollower

    19 de agosto de 2016 a las 13:57


  • ¿Cuál será la zona horaria?

    – Luv33preet

    11 de julio de 2017 a las 12:47

  • @Luv33preet es ‘%z’

    – Shrmn

    14 de enero de 2018 a las 13:56

avatar de usuario
ben

Usando logging.basicConfigel siguiente ejemplo me funciona:

logging.basicConfig(
    filename="HISTORYlistener.log",
    level=logging.DEBUG,
    format="%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)

Esto le permite formatear y configurar todo en una sola línea. Un registro de registro resultante tiene el siguiente aspecto:

2014-05-26 12:22:52.376 CRITICAL historylistener - main: History log failed to start

  • He agregado un formato de relleno cero para el campo msegs. De lo contrario, los valores de mseg inferiores a 100 aparecerán incorrectamente.

    – Pensamiento extraño

    1 de noviembre de 2016 a las 11:21

  • Dicho esto, ¡el OP no quiere que aparezcan mseg en absoluto!

    – Pensamiento extraño

    1 de noviembre de 2016 a las 11:23

  • Para eliminar milisegundos simplemente elimine esto en formato –> .%(msecs)03d

    – Kumar

    23 de abril de 2021 a las 12:35


  • Mi formato favorito: datefmt='%0y%0m%0d_%0H%0M%0S'

    – Miladiosas

    5 de julio a las 22:57

Para agregar a las otras respuestas, aquí están las lista de variables de la documentación de Python.

Directive   Meaning Notes

%a  Locale’s abbreviated weekday name.   
%A  Locale’s full weekday name.  
%b  Locale’s abbreviated month name.     
%B  Locale’s full month name.    
%c  Locale’s appropriate date and time representation.   
%d  Day of the month as a decimal number [01,31].    
%H  Hour (24-hour clock) as a decimal number [00,23].    
%I  Hour (12-hour clock) as a decimal number [01,12].    
%j  Day of the year as a decimal number [001,366].   
%m  Month as a decimal number [01,12].   
%M  Minute as a decimal number [00,59].  
%p  Locale’s equivalent of either AM or PM. (1)
%S  Second as a decimal number [00,61]. (2)
%U  Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.    (3)
%w  Weekday as a decimal number [0(Sunday),6].   
%W  Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0.    (3)
%x  Locale’s appropriate date representation.    
%X  Locale’s appropriate time representation.    
%y  Year without century as a decimal number [00,99].    
%Y  Year with century as a decimal number.   
%z  Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59].  
%Z  Time zone name (no characters if no time zone exists).   
%%  A literal '%' character.     

  • Extraño. Quiero tener un formato de fecha personalizado, pero quiero incluir los microsegundos (¿o son milisegundos?). %S está destinado a ser “como un número decimal”, pero según mis experimentos, se imprime como un número entero (sin parte decimal).

    – mike roedor

    26 de marzo de 2021 a las 8:47

  • @mikerodent mira la respuesta aceptada. Para incluir también milisegundos necesitas algo como %(msecs)03d. Ver la documentación aquí.

    – smac89

    8 de julio a las 20:52

si usa logging.config.fileConfig con un archivo de configuración, use algo como:

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

Prueba estos formatos:

Formato 1:

'formatters': {
        'standard': {
            'format' : '%(asctime)s |:| LEVEL: %(levelname)s |:| FILE PATH: %(pathname)s |:| FUNCTION/METHOD: %(funcName)s %(message)s |:| LINE NO.: %(lineno)d |:| PROCESS ID: %(process)d |:| THREAD ID: %(thread)d',
            'datefmt' : "%y/%b/%Y %H:%M:%S"
                    },
              }

Salida del formato 1:

ingrese la descripción de la imagen aquí

Formato 2:

'formatters': {
        'standard': {
            'format' : '%(asctime)s |:| LEVEL: %(levelname)s |:| FILE PATH: %(pathname)s |:| FUNCTION/METHOD: %(funcName)s %(message)s |:| LINE NO.: %(lineno)d |:| PROCESS ID: %(process)d |:| THREAD ID: %(thread)d',
            'datefmt' : "%Y-%m-%d %H:%M:%S"
                    },
              }

Salida del formato 2:

ingrese la descripción de la imagen aquí

avatar de usuario
desarrollo

Para personalizar el formato de hora durante el registro, podemos crear un objeto registrador y un manejador de archivos para él.

        import logging
        from datetime import datetime

        logger = logging.getLogger("OSA")

        logger.setLevel(logging.DEBUG)

        filename = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + ".log"
        fileHandler = logging.FileHandler(filename, mode="a")#'a' for append you can use 'w' for write

        formatter = logging.Formatter(
            "%(asctime)s : %(levelname)s : [%(filename)s:%(lineno)s - %(funcName)s()] : %(message)s",
            "%Y-%m-%d %H:%M:%S")

        fileHandler.setFormatter(formatter)
        logger.addHandler(fileHandler)
        

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad