Olli Graf
1 month ago
12 changed files with 148 additions and 24 deletions
@ -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] |
|||
|
|||
|
@ -1,2 +1,2 @@ |
|||
./__pycache__ |
|||
__pycache__ |
|||
./network/__pycache__/* |
|||
|
@ -1,3 +1,6 @@ |
|||
example.py |
|||
ex2.py |
|||
*.log |
|||
__pycache__ |
|||
db.ini |
|||
|
@ -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) |
|||
|
@ -0,0 +1,8 @@ |
|||
[pidb] |
|||
host=database |
|||
user=piuser |
|||
password=<passwort> |
|||
database=pidb |
|||
|
|||
|
|||
|
@ -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,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" |
|||
} |
|||
|
|||
} |
|||
|
Loading…
Reference in new issue