Comment personnaliser le format d'heure pour la journalisation Python?


200

Je suis nouveau dans le package de journalisation de Python et je prévois de l'utiliser pour mon projet. Je souhaite personnaliser le format de l'heure à mon goût. Voici un code court que j'ai copié à partir d'un tutoriel:

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")

Et voici la sortie:

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

Je voudrais raccourcir le format de l'heure à: ' 2010-07-10 10:46:28', en supprimant le suffixe en millisecondes. J'ai regardé le Formatter.formatTime, mais confus. J'apprécie votre aide pour atteindre mon objectif. Je vous remercie.

Réponses:


224

De la documentation officielle concernant la classe Formatter:

Le constructeur prend deux arguments facultatifs: une chaîne de format de message et une chaîne de format de date.

Alors change

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

à

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

24
Notez que si vous utilisez la méthode dictConfig de configuration de la journalisation (par exemple si vous utilisez Django), vous pouvez définir cela en utilisant la clé dict 'datefmt' pour un formateur. Voir: Configuration de la journalisation Django , module de journalisation: Détails du schéma du dictionnaire
taleinat

8
De plus, si vous configurez la journalisation avec basicConfig, il faut un paramètre nommé appelé datefmt
Bruno Lopes

10
Dans 1.9, si vous utilisez un paramètre LOGGING, vous pouvez inclure une entrée 'datefmt' comme celle-ci ...'formatters': { 'default': { 'format': '%(asctime)s | %(levelname)s | %(module)s | %(message)s', 'datefmt': '%Y-%m-%d %H:%M', },
jcfollower

quel sera le fuseau horaire?
Luv33preet

@ Luv33preet its '% z'
shrmn

139

En utilisant logging.basicConfig, l'exemple suivant fonctionne pour moi:

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',
)

Cela vous permet de formater et de configurer le tout sur une seule ligne. Un enregistrement de journal résultant se présente comme suit:

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

4
J'ai ajouté une mise en forme à zéro pour le champ msecs. Sinon, les valeurs msec inférieures à 100 s'affichent de manière incorrecte.
Oddthinking

2
Cela dit, l'OP ne veut pas du tout que les msecs apparaissent!
Oddthinking

31

si vous utilisez logging.config.fileConfig avec un fichier de configuration, utilisez quelque chose comme:

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

29

Pour ajouter aux autres réponses, voici la liste des variables de la documentation Python.

Directive   Meaning Notes

%a  Locales abbreviated weekday name.   
%A  Locales full weekday name.  
%b  Locales abbreviated month name.     
%B  Locales full month name.    
%c  Locales 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  Locales 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  Locales appropriate date representation.    
%X  Locales 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.     
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.