2010-07-10 23 views
107

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

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 para simplemente: '2010-07-10 10:46:28', dejando caer la mili- segundo sufijo. Miré el Formatter.formatTime, pero confundido. Agradezco tu ayuda para lograr mi objetivo. Gracias.

Respuesta

124

Desde el official documentation con respecto a la clase de formateador:

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

lo que el cambio

# 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") 
+12

Tenga en cuenta que si utiliza el método dictConfig de la configuración del registro (por ejemplo, si está utilizando Django), se puede hacer esto usando el 'DATEFMT' dict clave para un formateador. Ver: [Configuración de registro de Django] (http://docs.djangoproject.com/en/dev/topics/logging/#configuring-logging), [módulo de registro: Detalles del esquema del diccionario] (http: //docs.python. org/2/library/logging.config.html # dictionary-schema-details) – taleinat

+3

Además, si configura el inicio de sesión con basicConfig, toma un parámetro con nombre llamado datefmt –

+3

En 1.9, si está utilizando una configuración LOGGING, puede incluir una entrada 'datefmt' como esta ... ''formateadores': { 'predeterminado': { 'formato': '% (asctime) s | % (nombre de nivel) s | % (módulo) s | % (mensaje) s ', ' datefmt ':'% Y-% m-% d% H:% M ', }, ' – jcfollower

22

si se utiliza 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 
55

Usando logging.basicConfig, el siguiente ejemplo funciona para mí:

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 & config todo en una línea. Un registro de registro resultante tiene la siguiente apariencia:

26/05/2014 12: 22: 52.376 historylistener CRÍTICO - principal: Registro de la historia no se pudo iniciar

+4

Agregué el formato de relleno cero para el campo msecs. De lo contrario, los valores de msecs menores que 100 aparecen incorrectamente. – Oddthinking

+1

Dicho esto, ¡el OP no quiere que aparezcan msecs en absoluto! – Oddthinking

6

Para añadir a las otras respuestas, aquí están los variable list de 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.  
Cuestiones relacionadas