Seite 1 von 1
Fragen zu Logging Modul
Verfasst: Dienstag 31. März 2020, 15:33
von Camu
Hallo zusammen,
ich versuche gerade mich ins logging einzuarbeiten. So grob habe ich den Aufbau und die Funktionsweise verstanden, dachte ich. Habe versucht als Beispiel Fehler von sqlAlchemy zu loggen. Der Code sieht wie folgt aus:
Code: Alles auswählen
import sqlalchemy
import logging
active_db_url = 'mysql+mysqlconnector://user:password@localhost/testdb'
logging.basicConfig(filename='log.log', level=logging.INFO)
logger = logging.getLogger('sqlalchemy.engine')
logger.setLevel(logging.INFO)
fileh = logging.FileHandler('logme.txt')
form = logging.Formatter('%(name)s - %(levelname)s : %(asctime)s - %(message)s')
fileh.setFormatter(form)
logger.addHandler(fileh)
logger.info('info')
engine = sqlalchemy.create_engine(active_db_url, echo=True)
engine.connect()
Korrekterweise bekomme ich folgenden Fehler:
InterfaceError: (mysql.connector.errors.InterfaceError) 2003: Can't connect to MySQL server on 'localhost:3306' (10061 Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte)
In meiner logme.txt steht aber nur folgendes:
sqlalchemy.engine - INFO : 2020-03-31 16:31:29,573 - info
Wo ist da mein Fehler?
Danke und viele Grüße
Re: Fragen zu Logging Modul
Verfasst: Dienstag 31. März 2020, 16:21
von __blackjack__
@Camu: Was hättest Du denn da jetzt erwartet? Es werden bei Info die SQL-Abfragen protokolliert. Wenn nicht mal einen Verbindung zur Datenbank zustande kommt, können da auch keine SQL-Anfragen gestellt und damit protokolliert werden.
``echo=True`` ist keine gute Idee wenn Du selbst Logging aufsetzt, weil das intern noch mal `basicConfig()` aufruft.
Re: Fragen zu Logging Modul
Verfasst: Dienstag 31. März 2020, 16:36
von Camu
Ah in Ordnung, ich ging davon aus das alles protokolliert wird was über dem Level Info steht. Was müsste ich denn aber machen damit zum Beispiel auch protokolliert wird das keine Verbindung hergestellt werden konnte?
Re: Fragen zu Logging Modul
Verfasst: Dienstag 31. März 2020, 18:41
von DasIch
Deine Annahme ist richtig. Wenn man eine Exception wirft, loggt man den korrespondierenden Fehler allerdings nicht noch zusätzlich. Dementsprechend wirst du dies selbst loggen müssen.
Re: Fragen zu Logging Modul
Verfasst: Dienstag 31. März 2020, 18:42
von __deets__
Es wird auch alles groesser gleich INFO geloggt. Du hast aber falscherweise angenommen, eine Exception wuerde *auch* geloggt. Das mag sein (schlussendlich ist das jedem Modul/Autor selbst ueberlassen), aber es passiert NICHT automatisch, und augenscheinlich hier auch nicht.
Re: Fragen zu Logging Modul
Verfasst: Dienstag 31. März 2020, 19:25
von Camu
Oh, Exception und Error muss ich mir wohl nochmal anschauen.
Code: Alles auswählen
import sqlalchemy
import logging
active_db_url = 'mysql+mysqlconnector://user:password@localhost/testdb'
logging.basicConfig(filename='log.log', level=logging.INFO)
logger = logging.getLogger('sqlalchemy.engine')
logger.setLevel(logging.INFO)
fileh = logging.FileHandler('logme.txt')
form = logging.Formatter('%(name)s - %(levelname)s : %(asctime)s - %(message)s')
fileh.setFormatter(form)
logger.addHandler(fileh)
logger.info('info')
try:
engine = sqlalchemy.create_engine(active_db_url, echo=False)
engine.connect()
except Exception as e:
#logger.exception('this is an exception')
logger.error(e, exc_info=True)
Welche Variante bevorzugt man beim logging von exceptions? Die über
exc_info=True oder
logger.exception?
In meinem Logfile taucht nun die entsprechende Exception auf, aber leider auch noch (tippe Traceback):
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Apps\Anaconda\lib\site-packages\sqlalchemy\engine\base.py", line 2285, in _wrap_pool_connect
return fn()
und viele weitere Zeilen
Kann man dies noch deaktivieren?
Re: Fragen zu Logging Modul
Verfasst: Dienstag 31. März 2020, 20:34
von __blackjack__
@Camu: Du hast das explizit angeschaltet und fragst jetzt wie man es deaktiviert‽
Ich bevorzuge `exception()` für Ausnahmen, weil das genau dafür gedacht ist und man das `exc_info`-Argument nicht extra übergeben muss, denn den Traceback will ich dann natürlich auch haben, damit ich auch eine Chance habe die Ausnahme nachzuvollziehen.
Eventuell möchtest Du die Ausnahme selbst aber auch gar nicht loggen sondern irgendwie anders darauf reagieren.
Warum erstellst Du eigentlich *zwei* Logdateien mit den gleichen Nachrichten die bloss anders formatiert sind?
@__deets__: Die SQLAlchemy Dokumentation ist da recht eindeutig was "sqlalchemy.engine" protokolliert bei INFO und DEBUG. Und alles was da nicht steht, wird halt auch nicht protokolliert.

Re: Fragen zu Logging Modul
Verfasst: Dienstag 31. März 2020, 20:53
von Camu
Danke für die Hilfe. Ich bekomme halt in der Spyder GUI nur den Fehler angezeigt, daher dachte ich das man dies reduzieren kann. Aber Du hast schon recht, es zu deaktivieren macht keinen Sinn.
Eigentlich sollte die sqlalchemy Logging Info nur in die logme.txt - sonstige spätere Fehlermeldungen in die log.log - wie ich das aber richtig programmiere hab ich noch nicht herausgefunden.