2017-09-25 1 views
2

J'ai un formatter personnalisé dans mon python applications Flask, que je l'ai ajouté à l'enregistreur racine:formatter personnalisée en Python ne peut pas gérer au format des messages du journal

logger = logging.getLogger() 
logger.setLevel(logging.INFO) 

handler = logging.StreamHandler() 
handler.setLevel(logging.INFO) 

formatter = CustomLoggingFormatter() 
handler.setFormatter(formatter) 

logger.addHandler(handler) 

Cela fonctionne parfaitement bien quand je veux log quelque chose (logger.info() ...), mais j'ai un problème avec les journaux des bibliothèques, par exemple uwsgi.

Voici un exemple d'un journal message:

{ "@timestamp": "2017-09-25T06: 57: 45.373Z", "niveau": "INFO", "message" : "* Exécution% s: //% s:% d /% s"}

Je pensais que peut-être quelque chose ne va pas avec mon formatter, mais quand je me connecte l'LogRecord que mes CustomLoggingFormatter receivs, il semble comme ceci pour la ligne ci-dessus:

LogRecord: werkzeug, 20, < ...>/lib/python3.5/site-packages/werkzeug/_internal.py, 87, "* Exécution sur% s: //% s:% d /% s"

Voici mon CustomLoggingFormatter:

class CustomLoggingFormatter(Formatter): 
    data = {} 

    def __init__(self): 
     super(CustomLoggingFormatter, self).__init__() 

    def format(self, record): 
     print(record) 
     input_data = {} 
     input_data['@timestamp'] = datetime.utcnow().isoformat()[:-3] + 'Z' 
     input_data['level'] = record.levelname 
     if record.msg: 
      input_data['message'] = record.msg 

     input_data.update(self.data) 
     return json.dumps(input_data) 

pour ma formatter au travail, il semble que la mise en forme de chaîne doit d'abord être résolu, mais pour plusieurs bibliothèques qui ne se produit pas. Quelqu'un qui sait comment résoudre ce problème?

+0

S'il vous plaît montrer votre code personnalisé. 'Formatter.format()' doit toujours gérer une instance 'LogRecord'; l'implémentation par défaut appelle 'Formatter.formatMessage()' pour gérer le formatage réel (qui utilise généralement 'vars (record)' comme dictionnaire). –

+0

Ajouté mon CustomLoggingFormatter :) – user16655

+0

Depuis que l'implémentation de formatage a changé un peu entre les versions de Python, quelle version de Python utilisez-vous? –

Répondre

1

Vous devez toujours appeler record.getMessage(); il prend la valeur de record.msg et applique le formatage à cela. Le default implementation of Formatter.format() affecte le résultat à record.message pour l'interpolation dans la chaîne finale. Avez-vous dans votre code aussi:

def format(self, record): 
    print(record) 
    record.message = record.getMessage() 
    input_data = {} 
    input_data['@timestamp'] = datetime.utcnow().isoformat()[:-3] + 'Z' 
    input_data['level'] = record.levelname 

    if record.message: 
     input_data['message'] = record.message 

    input_data.update(self.data) 
    return json.dumps(input_data) 
+0

A travaillé comme un charme! Merci beaucoup :) – user16655