2016-09-22 2 views
1

Parfois, je configure le formateur de journalisation Python en utilisant le %(funcName)s. Mais je n'aime pas ça quand les noms des fonctions sont vraiment longs.Pouvez-vous raccourcir les en-têtes de journalisation lors de l'utilisation de la journalisation python `% (funcName) s`?

Pouvez-vous raccourcir les en-têtes de journalisation lors de l'utilisation de la journalisation Python %(funcName)s? Si oui, comment?

Pouvez-vous dire ... limiter le nombre total de caractères à 10 caractères?

+0

pouvez-vous envoyer un code que vous voulez améliorer? –

Répondre

2

les %(...)s articles dans la chaîne de format d'enregistrement sont de remplacement%, et vous pouvez limiter la longueur d'un remplacement de chaîne en faisant quelque chose comme %(funcName).10s

par exemple

import logging 

logging.basicConfig(
    format='%(funcName).10s %(message)s', 
    level=logging.INFO, 
) 

logger = logging.getLogger() 

def short(): 
    logger.info("I'm only little!") 

def really_really_really_really_long(): 
    logger.info("I'm really long") 

short() 
really_really_really_really_long() 

donne

[email protected][17:54:01]:~$ p tmp_x.py 
short I'm only little! 
really_rea I'm really long 
+0

les accessoires pour une solution élégante (je ne pensais pas utiliser le "." Du format de chaîne de caractères ... J'ai seulement utilisé cette fonction de format de chaîne lors de la mise en forme de chaîne à virgule flottante '% f'). Un ajout: si vous changez '% .10s' en'% 10.10s' alors vous obtenez une taille constante 10 lorsque la fonction est trop courte (rend vos en-têtes de journalisation de longueur constante). –

+0

@TrevorBoydSmith C'est pratique à savoir. Avez-vous été en mesure de trouver une documentation décente sur l'étendue de ce que vous pouvez faire avec '% s'? Je voudrais vraiment faire un lien vers une documentation, mais les pages que j'ai trouvées mentionnent seulement que 's 'appelle' str() 'sur l'objet, mais pas beaucoup sur les modificateurs. –

+0

Je crois que [les documents python officiels que vous cherchez sont ici] (https://docs.python.org/2/library/string.html#formatspec). (Si vous connaissez printf c-style, la même chose s'applique généralement mais C est une langue différente, donc la syntaxe n'est probablement pas exactement la même (comparer la syntaxe est une discussion pour une autre fois).) –

0

Vous pouvez étendre la classe logging.formatter pour obtenir le formatage souhaité ci-dessous.

Ceci est juste un exemple. vous devez le modifier en fonction de votre MyFormatter de classe exigence (logging.Formatter): in_console = False def initialisation (auto): self.mod_width = 30 self.datefmt = « % H:% M:% S '

def format(self, record): 
    s = [] 
    cmodule = record.module + ":" + str(record.lineno) 
    cmodule = cmodule[-self.mod_width:].ljust(self.mod_width) 
    format_str = ("%-7s %s %s" % (record.levelname, self.formatTime(record, self.datefmt), cmodule)) 
    pad_len = len(format_str) 
    for line in record_msg[1:]: 
     line = " " * pad_len + " : " + line 
     s.append(line) 

    s = "%s : %s" % (format_str, "\n".join(s)) 
    return s 

my_formatter = MyFormatter() 
log.setFormatter(my_formatter)