Ersetzt ein DBLog sämtliche FileLogs?

Begonnen von maxritti, 05 Januar 2014, 10:09:07

Vorheriges Thema - Nächstes Thema

maxritti

Schönen Sonntag zusammen,

nach längerer Suche im Forum als auch dem Einsteiger PDF und auch Onkel Google bin ich nicht wirklich fündig geworden.
Ich würde gerne meine FileLogs in ein DBLog umstellen.

So wie es aussieht macht FHEM beim FileLog für jede Komponente ein eigenes FileLog.

Wie handhabt ihr das denn so mit dem DbLog?
Macht ihr da nur einen einzigen Eintrag in die Config, wo dann sämtliche Devices/Events oder was auch immer geloggt wird?
Oder legt ihr ähnlich dem FHEM Standard mehrere DBLogs an, wo dann die einzelnen Komponenten definiert loggen können?
Letzendlich landet es ja doch in der gleichen DB.
Oder macht ihr u.U. auch noch mehrere Configs, wo auch mehrere Datenbanken zugreift?

Quasi bin ich auf der Suche nach der Best Practice.  :)

justme1968

der eigentliche vorteil von dblog ist ja gerade alles zusammen in einem log zu haben und z.b. plots über beliebige devices zu kombinieren.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

roedert

#2
Zitat von: justme1968 am 05 Januar 2014, 11:37:24
der eigentliche vorteil von dblog ist ja gerade alles zusammen in einem log zu haben...

..und mit einem einzigen SQL-Statement regelmäßig "aufräumen" zu können ... zB alle Einträge älter 30 Tage löschen

define DBlog.DeleteOldData at *00:05:00 {`mysql --host=192.168.xxx.xxx --user=xxx --password=xxx <dbname> -e "delete from history where now()-TIMESTAMP > 102000000;"`}

maxritti

Okay, ich habe das nun mal umgestellt.

Aber wie errechnet sich denn die 102000000 da hinten im SQL Statement für 30 Tage?
Irgendwie kann ich da hin und her rechnen, komme da aber nicht drauf.

30 Tage * 24 Stunden * 60 Minuten * 60 Sekunden = 2592000 Sekunden

Irgendwo habe ich gelesen, dass anstatt 60 Sekunden pro Minute 100 Sekunden pro Minute bei SQL angesetzt werden, dann wäre ich aber bei

30 Tage * 24 Stunden * 60 Minuten * 100 Sekunden = 4320000 Sekunden

(http://www.smiley-paradies.de/smileys/denkend/denkend_0006.gif)

roedert

#4
Zitat von: maxritti am 05 Januar 2014, 21:25:20
Aber wie errechnet sich denn die 102000000 da hinten im SQL Statement für 30 Tage?
Irgendwie kann ich da hin und her rechnen, komme da aber nicht drauf.

Stimmt, ich hatte es nur blind kopiert und es passte auch nicht wirklich - keine Ahnung wie sich die Zahl der Differenz errechnet.

Hier die "saubere" Lösung für mysql:

define DbLog.DeleteOldData at *00:05:00 {`mysql --host=<ip-adresse> --user=<user> --password=<pass> <dbname> -e "DELETE FROM history WHERE TIMESTAMP < DATE_SUB(NOW(),INTERVAL 31 DAY);"`}

Nachtrag:
Ein SELECT NOW()-DATE_SUB(NOW(),INTERVAL 1 DAY) liefert 1000000 zurück - also ist 1 Tag = 1000000 ... mit Sekunden oder so hat das nichts zu tun.

maxritti

Heute morgen ist es wohl noch ein wenig früh.
DbLog muss ich doch bestimmt durch mein Objekt ersetzen, so wie ich DbLog bei mir definiert habe oder?
Ist aber eigentlich auch egal, denn sowohl bei

define DbLog.DeleteOldData at *00:05:00 {`mysql --host=<ip-adresse> --user=<user> --password=<pass> <dbname> -e "DELETE FROM history WHERE TIMESTAMP < DATE_SUB(NOW(),INTERVAL 31 DAY);"`}

oder

define myDbLog.DeleteOldData at *00:05:00 {`mysql --host=<ip-adresse> --user=<user> --password=<pass> <dbname> -e "DELETE FROM history WHERE TIMESTAMP < DATE_SUB(NOW(),INTERVAL 31 DAY);"`}

natürlich nach Ersetzungen von ip-adresse use quitiert mit fhem das so, obwohl es ein DBLog gibt.

roedert

Zitat von: maxritti am 06 Januar 2014, 07:25:13
DbLog muss ich doch bestimmt durch mein Objekt ersetzen, so wie ich DbLog bei mir definiert habe oder?

Es wird ein at definiert welches ein Systemcommand ausführt (innerhalb der Backticks) - wie du das nennst ist egal, mit der Definition deines DBLog hat es auch nichts zu tun - ob es DbLog.DeleteOldData oder Liegestuhl heisst ist dabei egal ;-)

Er mag aber nicht das Semikolon innerhalb des Commands - kann man auch weglassen.

define myDbLog.DeleteOldData at *00:05:00 {`mysql --host=<ip-adresse> --user=<user> --password=<pass> <dbname> -e "DELETE FROM history WHERE TIMESTAMP < DATE_SUB(NOW(),INTERVAL 31 DAY)"`}

maxritti

Okay, jetzt habe ich es.

Danke Dir und noch einen schönen Tag.

Papaloewe

Hallo roedert,

wie müsste denn diese Zeile:
Zitatdefine myDbLog.DeleteOldData at *00:05:00 {`mysql --host=<ip-adresse> --user=<user> --password=<pass> <dbname> -e "DELETE FROM history WHERE TIMESTAMP < DATE_SUB(NOW(),INTERVAL 31 DAY)"`}

für eine sqlite3 DB aussehen?

Danke & Gruß
Thomas

Papaloewe

Könnte das funktionieren?
define DbLog.DeleteOldData at *00:03:00 {`sqlite3 /opt/fhem/fhem.db "DELETE FROM history WHERE TIMESTAMP < datetime('now','6 month');"`}

betateilchen

das geht doch viel einfacher und mit fhem Bordmitteln:

set <dblogName> deleteOldDays 30

wie wäre es denn mal mit Lesen der commandref?

(http://up.picr.de/19204092ls.jpg)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Papaloewe


SventeHof

Ich muss dieses Thema einmal aufgreifen.. ich bin auch auf Datenbank-LOG umgestiegen und das mit dem aufräumen finde ich eine gute Idee.
Nur möchte ich bspw. die Temperaturwerte oder Stromverbrauch für einen sehr langen Zeitraum auswerten können, andere Einträge in den Logs könnten gerne regelmässig gelöscht werden.

Wie geht Ihr in diesem Fall denn vor? Oder habe ich mal wieder eine verworrene Idee?

Gibt es eigentlich auch die Möglichkeit, eine weitere Datenbank anzusprechen? Ich würde gerne die Daten parallel auf meinem root-Server speichern und dann dort gewisse Auswertungen auf einer Webseite präsentieren. Ich habe schon den Thread mit dem rss gelesen, würde aber gerne eine Datenbank beliefern.

Aktuell schaut es so aus, dass ich fhem auf meinem Raspberry Pi2 laufen habe und die Datenbank auf meiner lokalen Synology.

Gruß aus dem hohen Norden
Sven

Fistandantilus

#13
Hi, ich stehe gerade vor der selben Frage. Da mir das deleteOldDays zu rigoros erscheint, habe ich auf der Synology direkt in der MariaDB ein tägliches Event eingeplant, welches festgelegte Devices löscht. Du musst aber höchstwahrscheinlich auch in der my.cnf vorher folgendes eintragen:

SET GLOBAL event_scheduler = ON;

Im Event:


delete from history where device like 'iPhone%' or device like 'Sauna%' or ...


VG
F.
Raspberry Pi 3 + FHEM + Smartvisu/Fronthem, CUL, HMLAN, Enocean USB300, Eltako (FAM14, FSB14, FSR,FTS14EM,Multisensor,...) - MySQL DB + 2.Raspberry für Heizungsregelung und 3. Raspberry als Alarmanlage

crispyduck

Hallo,

@SventeHof: hab momentan noch FHEM auf meiner Syno und auf einer Raspi laufen. Wollte erst die NAS als Hauptserver laufen lassen, hab aber jetzt die Idee aufgegriffen alles auf der Raspi laufen zu lassen und den RS485 Adapter auf der NAS nur per ser2net anzusprechen.

Die Raspi läuft mit read only Filesystem mit /var/log var/temp/ als tempfs und und ich dachte ich mounte einfach die NAS für den /fhem/log Folder.

Wird bei deinem Setup mit der DB auf der NAS noch irgendwas auf der NAS geschrieben oder könnte ich so die Raspi im read only modus betreiben?

Lg,
Andi