Oscam.log Senderstatistik
Oscam.log Senderstatistik
Versuche irgendwie ein Senderstatistik zu basteln in Verbindung mit einer mySQL Datenbank.
Dazu soll die oscam.log ausgewertet werden, leider fehlt mir da Syntax wie ich nur einzelne Teilbereiche wähle,
daher hoffe ich auf eure Linuxerfahrung, sobald das passiert ist, werd ich sicher weiterkommen, aber der Grundstein
fehlt leider gerade.
2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus
Die Zeit vorne dachte ich mit "cut" zu lösen. Aber ich brauche noch den user und das EF15. Wenn alle Benutzer die gleiche
Länge hätten dann wäre es ja über cut möglich, sind aber unterschiedlich lang. Kann mir einer da auf die Sprünge helfen?
Dazu soll die oscam.log ausgewertet werden, leider fehlt mir da Syntax wie ich nur einzelne Teilbereiche wähle,
daher hoffe ich auf eure Linuxerfahrung, sobald das passiert ist, werd ich sicher weiterkommen, aber der Grundstein
fehlt leider gerade.
2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus
Die Zeit vorne dachte ich mit "cut" zu lösen. Aber ich brauche noch den user und das EF15. Wenn alle Benutzer die gleiche
Länge hätten dann wäre es ja über cut möglich, sind aber unterschiedlich lang. Kann mir einer da auf die Sprünge helfen?
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
Naja wenn du bereit bist dein Projekt hier zu posten kann man dir auch besser helfen..
Anstatt MySQL würde ich aber stattdessen SQLite benutzen da dafür kein extra Prozess laufen muss - MySQL verbrät ziemlich viel CPU+Ram
Mit "cut" wäre es meiner meinung nach zu umständlich, wobei das auch darauf ankommt was genau du suchst - ich würd zunächst mit ' awk ' arbeiten um zum beispiel aus einer Zeile die Argumente (durch <space> getrennt) zu filtern..
also erst speicherst du die Zeile in eine Variable:
line='2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus'
dann ziehst du dir daraus datum+ührzeit sowie TID, Type, User, CIS und den restlichen text..
also: /tmp/testdas sprukt dann das hier aus:
...das kann man dann weiter verarbeiten...
Anstatt MySQL würde ich aber stattdessen SQLite benutzen da dafür kein extra Prozess laufen muss - MySQL verbrät ziemlich viel CPU+Ram
Mit "cut" wäre es meiner meinung nach zu umständlich, wobei das auch darauf ankommt was genau du suchst - ich würd zunächst mit ' awk ' arbeiten um zum beispiel aus einer Zeile die Argumente (durch <space> getrennt) zu filtern..
also erst speicherst du die Zeile in eine Variable:
line='2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus'
dann ziehst du dir daraus datum+ührzeit sowie TID, Type, User, CIS und den restlichen text..
Code: Alles auswählen
| date | tid |t|user| caid| ident| |sid |
2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus
Code: Alles auswählen
#!/bin/bash
line='2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus'
DateTime=$(echo $line | awk '{print $1,$2}')
TID=$(echo $line | awk '{print $3}')
TYPE=$(echo $line | awk '{print $4}')
USER=$(echo $line | awk '{print $5}')
CIS=$(echo $line | awk '{print $6}')
#text..
length=${#line}
searchlength=$(expr index "$line" '\)')
sl=$(($searchlength + 1))
TEXT=${line:$sl:$length}
echo $line
echo ""
echo $DateTime
echo $TID
echo $TYPE
echo $USER
echo $CIS
echo $TEXT
Code: Alles auswählen
root@raspberrypi ~ > bash /tmp/test
2013/01/20 15:10:38 8921820 c home (1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767): found (364 ms) by hdplus
2013/01/20 15:10:38
8921820
c
home
(1830&000000/0000/EF15/92:90BA125837757F49CAE1153047BDB767):
found (364 ms) by hdplus
Du musst nicht kämpfen um zu siegen
Re: Oscam.log Senderstatistik
Super danke! Das einzige was fehlt ist noch das EF15. Klar würde ich das Projekt sofort hier posten wenn es halbwegs läuft
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
Naja das is jetzt nicht mehr allzu schwer...
Code: Alles auswählen
CIS2=$(echo $CIS | tr "&" " ")
CIS2=$(echo $CIS2 | tr "/" " ")
CAID=$(echo $CIS2 | awk '{print $1}' | tr -d "(")
IDENT=$(echo $CIS2 | awk '{print $2}')
SID=$(echo $CIS2 | awk '{print $4}')
Du musst nicht kämpfen um zu siegen
Re: Oscam.log Senderstatistik
Die ersten Versuche, wird auch soweit auch eingetragen. Nun mal sehen wie man darauf nen Chart baut, am besten mit php.
Code: Alles auswählen
#/bin/bash
STRUCTURE="CREATE TABLE data (time DATETIME,user TEXT,sid CHAR(4), PRIMARY KEY (time,user));";
# Creating an Empty db file and filling it with my structure
cat /dev/null > channelstat.db
echo $STRUCTURE > /tmp/tmpstructure
sqlite3 channelstat.db < /tmp/tmpstructure;
rm -f /tmp/tmpstructure;
while read line
do
DateTime=$(echo $line | awk '{print $1,$2}');
TID=$(echo $line | awk '{print $3}')
TYPE=$(echo $line | awk '{print $4}')
USER=$(echo $line | awk '{print $5}')
CIS=$(echo $line | awk '{print $6}')
CIS2=$(echo $CIS | tr "&" " ")
CIS2=$(echo $CIS2 | tr "/" " ")
CAID=$(echo $CIS2 | awk '{print $1}' | tr -d "(")
IDENT=$(echo $CIS2 | awk '{print $2}')
SID=$(echo $CIS2 | awk '{print $4}')
length=${#line}
searchlength=$(expr index "$line" '\)')
sl=$(($searchlength + 1))
TEXT=${line:$sl:$length}
#echo ""
#echo $DateTime
#echo $USER
#echo $SID
sqlite3 channelstat.db "INSERT INTO data (time,user,sid) VALUES ('$DateTime','$USER','$SID')";
done
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
ehrlich gesagt hätte ich gedacht das du schon weiter wärst und dadurch vielleicht bemerkt hättest, das es komplett in php (ohne bash) einfacher/sinnvoller wäre
Du musst nicht kämpfen um zu siegen
Re: Oscam.log Senderstatistik
php hab ich mich generell dagegen entschieden, da die Datenbank nicht erst gefüllt werden soll, wenn ich die Seite
abrufe. Denn vorher zu einen bestimmten Zeitpunkt via cron. Habe gestern auch mit beiden DBMS rumprobiert und SQLite3
verbraucht gleich viel Resourcen beim einlesen wie MySQL. Des weiteren braucht SQLite3 weitaus länger als MySQL (rund 13.000 Datensätze pro Tag) und schwellt um das doppelte an.
Weiter? Ich hab doch vor drei Tagen angefangen wie ich bereits geschrieben habe
abrufe. Denn vorher zu einen bestimmten Zeitpunkt via cron. Habe gestern auch mit beiden DBMS rumprobiert und SQLite3
verbraucht gleich viel Resourcen beim einlesen wie MySQL. Des weiteren braucht SQLite3 weitaus länger als MySQL (rund 13.000 Datensätze pro Tag) und schwellt um das doppelte an.
Weiter? Ich hab doch vor drei Tagen angefangen wie ich bereits geschrieben habe
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
man kann php auch über crontab aufrufen - also man kann es auch unabhängig eines browsers programmiernamok404 hat geschrieben:php hab ich mich generell dagegen entschieden, da die Datenbank nicht erst gefüllt werden soll, wenn ich die Seite
abrufe.
Denn vorher zu einen bestimmten Zeitpunkt via cron.
stichwort: i scan
das ist auch ein php script: /var/emu/script/pscan.php
ich würd halt ein php script basteln zum erfassen und auslesen der daten, was über crontab aufgerufen werden kann
und ein weiteres um die daten über ein webbrowser anzuzeigen (das brauchst du denk ich so oder so)
hm also mysql verbraucht auf jedenfall wesendlich mehr resourcen weil permanent mehrere threads laufen und schneller kommt drauf an was für ein datenbank type und wie die datenbank aufgebaut istamok404 hat geschrieben:Habe gestern auch mit beiden DBMS rumprobiert und SQLite3
verbraucht gleich viel Resourcen beim einlesen wie MySQL. Des weiteren braucht SQLite3 weitaus länger als MySQL (rund 13.000 Datensätze pro Tag) und schwellt um das doppelte an.
also zumindest auf thin clients würde das mehr resourcen verbrauchen aus besagten gründen - allerdings wirst du vermutlich alle log zeilen die du bereits ausgelesen hast auch in die db speichern müssen da du sonst nicht wirklich festellen kannst ob du die jeweilige zeile schon ausgelesen hast bzw wäre das umständlicher..
du könntest dann aber auch feststellen wann das logfile erstellt wurde und wenns ein neues ist, löschst du die "log" tabelle einfach wieder um irgendwann nicht eine überquillende db zu haben die alles ausbremst...
ja so in dem zustand wie du es hier gepostet hast funktioniert erstmal nix - deshalb "weiter"amok404 hat geschrieben:Weiter? Ich hab doch vor drei Tagen angefangen wie ich bereits geschrieben habe
freddchen hatte sowas auch mal angefangen zu basteln aber in clear php also ohne bash scripte und diagramm usw und auch SQLite3
Du musst nicht kämpfen um zu siegen
-
- Entwickler Team
- Beiträge: 2576
- Registriert: So 17. Apr 2011, 11:39
- Been thanked: 1 time
- Kontaktdaten:
Re: Oscam.log Senderstatistik
Ich würd das halt so probiern:
Eine Datenbank - 2 Tabellen
1. Tabelle: ID , TIMESTAMP , CAID , IDENT , SID , USER , COUNT
2. Tabelle: ID , "file creation timestamp" , LOGLINE
Ein Script das zB alle 10 Sekunden OScam.log parsed und Zeile für Zeile überprüft ob die komplette LOGLINE bereits eingetragen wurde - ggf auch nur TIMESTAMP, CAID, IDENT, SID und USER.. Wenn nicht wird geprüft ob es dafür bereits in der Ersten Tabelle einen Eintrag für CAID + IDENT + SID + USER gibt und falls nicht wird ein neuer Eintrag mit COUNT=1 eingefügt - ansonsten COUNT + 1..
Und dann eben nicht vergessen die LOGLINE in die Zweite Tabelle einzufügen..
Dann sollte das Script eben auch prüfen ob "file creation timestamp" (wann das file erstellt wurde) neuer ist als der letzte Eintrag in der Zweiten Tabelle und falls ja wird die Zweite Tabelle geleert
Dann brauch man nurnoch ein php Script um die gesammelten Daten vernünftig anzuzeigen, zB für jede Stunde oder Tag oder Woche oder Monat und dann auch welcher Sender und/oder User usw
Eine Datenbank - 2 Tabellen
1. Tabelle: ID , TIMESTAMP , CAID , IDENT , SID , USER , COUNT
2. Tabelle: ID , "file creation timestamp" , LOGLINE
Ein Script das zB alle 10 Sekunden OScam.log parsed und Zeile für Zeile überprüft ob die komplette LOGLINE bereits eingetragen wurde - ggf auch nur TIMESTAMP, CAID, IDENT, SID und USER.. Wenn nicht wird geprüft ob es dafür bereits in der Ersten Tabelle einen Eintrag für CAID + IDENT + SID + USER gibt und falls nicht wird ein neuer Eintrag mit COUNT=1 eingefügt - ansonsten COUNT + 1..
Und dann eben nicht vergessen die LOGLINE in die Zweite Tabelle einzufügen..
Dann sollte das Script eben auch prüfen ob "file creation timestamp" (wann das file erstellt wurde) neuer ist als der letzte Eintrag in der Zweiten Tabelle und falls ja wird die Zweite Tabelle geleert
Dann brauch man nurnoch ein php Script um die gesammelten Daten vernünftig anzuzeigen, zB für jede Stunde oder Tag oder Woche oder Monat und dann auch welcher Sender und/oder User usw
Du musst nicht kämpfen um zu siegen
Re: Oscam.log Senderstatistik
So ähnlich hab ich's auch gedacht:
Eine DB mit zwei Tabellen
1. Tabelle: USER, SID, DATIME(Start),DATETIME(End) -- Primärschlüssel zusammen gesetzt aus DTIMEstart,DTIMEend und User (das ist wohl eindeutig genug, da bedarf es keiner ID)
2. Tabelle: SID, Name -- Finde halt Namen besser
Das Count macht SQL von sich aus mit einer Abfrage, da bedarf es keiner Spalte. Dann wird halt via Script gecheckt ob die aktuelle Zeit vom Log neuer ist und wenn dann noch die SID anders ist, wird der "alte Eintrag" abgeschlossen mit DTIMEend und ein neuer mit DTIMEstart angelegt. Sollte aber die SID gleich bleiben wird die Zeile übersprungen, es erfolgt kein Eintrag.
Das sollte die Datenbank klein halten.
Dann wird nur halt ne Abfrage gestartet wieviel Zeit zwischen DTIMEstart und DTIMEend liegt und ausgegeben.
(Hoffe ab kein Denkfehler hierbei)
Eine DB mit zwei Tabellen
1. Tabelle: USER, SID, DATIME(Start),DATETIME(End) -- Primärschlüssel zusammen gesetzt aus DTIMEstart,DTIMEend und User (das ist wohl eindeutig genug, da bedarf es keiner ID)
2. Tabelle: SID, Name -- Finde halt Namen besser
Das Count macht SQL von sich aus mit einer Abfrage, da bedarf es keiner Spalte. Dann wird halt via Script gecheckt ob die aktuelle Zeit vom Log neuer ist und wenn dann noch die SID anders ist, wird der "alte Eintrag" abgeschlossen mit DTIMEend und ein neuer mit DTIMEstart angelegt. Sollte aber die SID gleich bleiben wird die Zeile übersprungen, es erfolgt kein Eintrag.
Das sollte die Datenbank klein halten.
Dann wird nur halt ne Abfrage gestartet wieviel Zeit zwischen DTIMEstart und DTIMEend liegt und ausgegeben.
(Hoffe ab kein Denkfehler hierbei)
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste