Compare commits

...

2 Commits

Author SHA1 Message Date
Olli Graf 14d3064309 Inhaltsverzeichnis. 1 month ago
Olli Graf fd50a8628c Teil 27: logging.config 1 month ago
  1. 2
      Readme.md
  2. 20
      gettattr/Kreis_gettattr.py
  3. 2
      teil13/.gitignore
  4. 3
      teil27/.gitignore
  5. 10
      teil27/JSONFormatter.py
  6. 8
      teil27/db.ini.sample
  7. 75
      teil27/dbhandler.py
  8. 0
      teil27/filterlogging.py
  9. 14
      teil27/halloween.py
  10. 7
      teil27/halloween_log_conf.json
  11. 33
      teil27/handler_config.json
  12. 0
      teil27/log_config.json
  13. 0
      teil27/testloggingconf.py

2
Readme.md

@ -31,5 +31,5 @@ CC-BY-SA Olli Graf
|24 | match| |24 | match|
|25 | reguläre Ausdrücke| |25 | reguläre Ausdrücke|
|26 | lambda Funktionen| |26 | lambda Funktionen|
|27 | __getattr__()| |27 | logging.config|

20
gettattr/Kreis_gettattr.py

@ -1,20 +0,0 @@
from math import pi as pi
class Kreis_gettattr:
def __init__(self, radius):
self.radius = radius
self.operators ={
'durchmesser': lambda x: self.radius * 2
'umfang': lambda x: self.durchmesser * pi
'flaeche': lambda: x: self.radius**2 *pi
}
def __getattr(self, name):
if name not in self.operators:
raise TypeError(f'unbekannte Operation {name}')
return {
} [name]

2
teil13/.gitignore

@ -1,2 +1,2 @@
./__pycache__ __pycache__
./network/__pycache__/* ./network/__pycache__/*

3
logging-config/.gitignore → teil27/.gitignore

@ -1,3 +1,6 @@
example.py example.py
ex2.py ex2.py
*.log *.log
__pycache__
db.ini

10
teil27/JSONFormatter.py

@ -0,0 +1,10 @@
import logging
import logging.config
import json
ATTR_TO_JSON = ['created', 'filename', 'funcName', 'levelname', 'lineno', 'module', 'msecs', 'msg', 'name', 'pathname', 'process', 'processName', 'relativeCreated', 'thread', 'threadName']
class JsonFormatter:
def format(self, record):
obj = {attr: getattr(record, attr)
for attr in ATTR_TO_JSON}
return json.dumps(obj, indent=4)

8
teil27/db.ini.sample

@ -0,0 +1,8 @@
[pidb]
host=database
user=piuser
password=<passwort>
database=pidb

75
teil27/dbhandler.py

@ -0,0 +1,75 @@
# Datei dbhandler.py
import mysql.connector
import datetime
import configparser
import logging
from logging import config
import json
class DBHandler(logging.Handler):
def __init__(self):
logging.Handler.__init__(self)
# Datenbank Konfiguration lesen
confparser = configparser.ConfigParser()
confparser.read('db.ini')
# Verbindung zur DB herstellen
self.connection= mysql.connector.connect(host=confparser['pidb']['host'],user = confparser['pidb']['user'],password = confparser['pidb']['password'],database = confparser['pidb']['database'])
# Tabelle anlegen, falls noch keine existiert.
self.connection.cursor().execute('''CREATE TABLE IF NOT EXISTS logs (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
zeit VARCHAR(50),
level VARCHAR(8),
message VARCHAR(40),
logger_name VARCHAR(25),
filename VARCHAR(60),
line INTEGER)''')
self.connection.commit()
# Bei Löschung der Klasseninstanz, Connection schliessen
def __del__(self):
if self.connection != None:
self.connection.close()
self.connection = None
# LogRecord in die DB schreiben
def emit(self, record):
try:
# Log-Daten in ein Tupel extrahieren
log_entry = (datetime.datetime.utcnow().isoformat(),
record.levelname,
record.getMessage(),
record.name,
record.pathname,
record.lineno)
# Log in die Datenbank einfügen
cursor = self.connection.cursor()
cursor.execute('''INSERT INTO logs (zeit, level, message, logger_name, filename, line)
VALUES (%s, %s, %s, %s, %s, %s)''', log_entry)
self.connection.commit()
cursor.close()
except Exception as e:
# im Fehlerfall den LogRecord nach "oben" weiterreichen.
self.handleError(record)
# Config aus JSON Datei laden und setzen
with open('handler_config.json') as file_config:
config.dictConfig(json.load(file_config))
# Logging testen
def testlogging():
print('testlogging() aufgerufen.')
logging.debug('Diese Zeile wird ausgefiltert.')
logging.debug('DEBUG/Druckdaten werden gesendet.')
logging.info('INFO/Es werden 2 Seiten gedruckt')
logging.debug('Diese Zeile wird auch ausgefiltert.')
logging.warning('WARN/nicht genügend Papier im Drucker')
logging.error('ERROR/Drucker nicht gefunden.')
logging.critical('CRITICAL/Drucker brennt')
if __name__ == '__main__':
testlogging()

0
logging-config/filterlogging.py → teil27/filterlogging.py

14
logging-config/halloween.py → teil27/halloween.py

@ -1,7 +1,19 @@
#encoding: utf-8
import logging import logging
from logging import config from logging import config
import json import json
import random import random
import JSONFormatter
#JSON Formatter
ATTR_TO_JSON = ['created', 'filename', 'funcName', 'levelname', 'lineno', 'module', 'msecs', 'msg', 'name', 'pathname', 'process', 'processName', 'relativeCreated', 'thread', 'threadName']
class JsonFormatter:
def format(self, record):
obj = {attr: getattr(record, attr)
for attr in ATTR_TO_JSON}
return json.dumps(obj, indent=4)
#CustomFilter
class HalloweenFilter(logging.Filter): class HalloweenFilter(logging.Filter):
@ -14,7 +26,7 @@ class HalloweenFilter(logging.Filter):
# Der Unsichtbare soll keine Spuren im Logfile hinterlassen. # Der Unsichtbare soll keine Spuren im Logfile hinterlassen.
return record.getMessage().lower().find('unsichtbar') == -1 return record.getMessage().lower().find('unsichtbar') == -1
visitors = ['Werwolf','Gespenst','Hexe','Unsichtbarer','Vampir','Dämon','Gorilla','Hulk','Mumie'] visitors = ['Werwolf','Gespenst','Hexe','Unsichtbarer','Vampir','Dämon','Gorilla','Monster','Mumie']
treats = ['Bonbons','Twinkies','Lollis','Schokoladen','Kuchen', 'Äpfel'] treats = ['Bonbons','Twinkies','Lollis','Schokoladen','Kuchen', 'Äpfel']

7
logging-config/halloween_log_conf.json → teil27/halloween_log_conf.json

@ -9,7 +9,10 @@
"std_out":{ "std_out":{
"format": "%(asctime)s : %(levelname)s : %(lineno)d : %(message)s", "format": "%(asctime)s : %(levelname)s : %(lineno)d : %(message)s",
"datefmt":"%I:%M:%S %d.%m.%Y" "datefmt":"%I:%M:%S %d.%m.%Y"
} },
"json": {
"()": "__main__.JsonFormatter"
}
}, },
"handlers":{ "handlers":{
"console":{ "console":{
@ -18,7 +21,7 @@
"level": "DEBUG" "level": "DEBUG"
}, },
"file":{ "file":{
"formatter":"std_out", "formatter":"json",
"class":"logging.FileHandler", "class":"logging.FileHandler",
"level":"DEBUG", "level":"DEBUG",
"filename" : "halloween.log", "filename" : "halloween.log",

33
teil27/handler_config.json

@ -0,0 +1,33 @@
{
"version":1,
"formatters":{
"std_out":{
"format": "%(asctime)s : %(levelname)s : %(module)s : %(funcName)s : %(lineno)d : (Process Details : (%(process)d, %(processName)s), Thread Details : (%(thread)d, %(threadName)s))\nLog : %(message)s",
"datefmt":"%d-%m-%Y %I:%M:%S"
}
},
"handlers":{
"console":{
"formatter": "std_out",
"class": "logging.StreamHandler",
"level": "DEBUG"
},
"db":{
"formatter": "std_out",
"()": "__main__.DBHandler",
"level": "DEBUG"
},
"file":{
"formatter":"std_out",
"class":"logging.FileHandler",
"level":"DEBUG",
"filename" : "raspithek.log"
}
},
"root":{
"handlers":["console","file","db"],
"level": "DEBUG"
}
}

0
logging-config/log_config.json → teil27/log_config.json

0
logging-config/testloggingconf.py → teil27/testloggingconf.py

Loading…
Cancel
Save