Fragen zu Logging Modul

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Camu
User
Beiträge: 31
Registriert: Dienstag 26. September 2017, 08:32

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
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Camu
User
Beiträge: 31
Registriert: Dienstag 26. September 2017, 08:32

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?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Camu
User
Beiträge: 31
Registriert: Dienstag 26. September 2017, 08:32

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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. 🙂
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Camu
User
Beiträge: 31
Registriert: Dienstag 26. September 2017, 08:32

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.
Antworten