2016-08-11 5 views
12

ich den Rat der django docs gefolgt und Protokollierung wie folgt verwenden:Fertigen Sie für externe/Fremd Libs Anmeldung

import logging 
logger = logging.getLogger(__name__) 

def today(...): 
    logger.info('Sun is shining, the weather is sweet') 

Mit meiner aktuellen Konfiguration sieht die Ausgabe wie folgt aus:

2016-08-11 14:54:06 mylib.foo.today: INFO Sun is shining, the weather is sweet 

Leider einige Bibliotheken, die ich nicht verwenden Protokollierung wie folgt ändern:

import logging 

def third_party(...): 
    logging.info('Make you want to move your dancing feet') 

Die Ausgabe sieht leider li diese ke:

2016-08-09 08:28:04 root.third_party: INFO Make you want to move your dancing feet 

Ich möchte, dies sehen:

2016-08-09 08:28:04 other_lib.some_file.third_party: INFO Make you want to move your dancing feet 

Unterschied:

root.third_party ==>other_lib.some_file.third_party

Ich möchte um die lange Version zu sehen (nicht root), wenn der Code logging.info() anstelle von 012 verwendet

aktualisieren

Dies ist kein Duplikat Elegant setup of Python logging in Django, da die Lösung davon ist:

Anfang des Zitats

In jedem Modul definiere ich einen Logger

mit
logger = logging.getLogger(__name__) 

Ende des Angebotes.

Nein, ich werde keinen Drittanbietercode ändern, der logging.info() anstelle von logger.info() verwendet.

Follow Up Frage

Avoid logger=logging.getLogger(__name__) without loosing way to filter logs

+0

https://docs.djangoproject.com/en/1.9/topics/ Logging/Sie sollten es in Ihrer settings.py konfigurieren –

+0

Mögliche Duplikat von [Elegante Einrichtung von Python Loggi ng in Django] (http://stackoverflow.com/questions/1598823/elegant-setup-of-python-logging-in-django) –

+0

@be_good_do_good ja, ich konfigurierte Protokollierung. Die Frage ist: Wie man Logger behandelt, die nicht mit logger = logging.getLogger (__ name __) benannt sind. – guettli

Antwort

4

Wie Wayne Werner vorschlug, würde ich die Protokollformat-Optionen verwenden. Hier ist ein Beispiel.

Datei 1: external_module

import logging 
def third_party(): 
    logging.basicConfig(level=logging.DEBUG) 
    logger = logging.getLogger() 

    logger.info("Hello from %s!"%__name__) 

File 2: main

import external_module 
import logging 

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(module)s.%(funcName)s: %(levelname)s %(message)s') 
logger = logging.getLogger(__name__) 

def cmd(): 
    logger.info("Hello from %s!"%__name__) 
    external_module.third_party() 
cmd() 

Ausgang:

2016-08-11 09:18:17,993 main.cmd: INFO Hello from __main__! 
2016-08-11 09:18:17,993 external_module.third_party(): INFO Hello from external_module! 
3

Das ist, weil sie die Wurzel-Logger verwenden (das, was Sie standardmäßig erhalten ist, wenn Sie

import logging 

logging.info("Hi! I'm the root logger!") 

nur tun, wenn Sie wollen Wenn Sie etwas anderes machen, haben Sie zwei (oder drei) Optionen. Am besten wäre es, die Log Record format options zu verwenden. Alternativ könnten Sie die Bibliotheken, die Sie verwenden, affen, zB

Oder Sie könnten etwas gnarly mit Parsing der Ast und Schreiben ihrer Bits von Logging-Code tun. Aber tu das nicht.

+0

Affe Patchen der Bibliothek könnte funktionieren. Aber es hat viele Dateien ... Es fühlt sich an wie zu viel Arbeit. – guettli

+0

Wenn es sich um eine Open-Source-Bibliothek handelt, würde ich entweder ein Problem mit dem Betreuer einreichen oder selbst einen PR erstellen. Oder beides. Logger = logging.getLogger (__ name __) 'oder zumindest' 'library name'' zu verwenden, scheint faul/unverantwortlich zu sein. –