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__/* |
./network/__pycache__/* |
||||
|
@ -1,3 +1,6 @@ |
|||||
example.py |
example.py |
||||
ex2.py |
ex2.py |
||||
*.log |
*.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