reinhard@finalmedia.de cafeface
Sat Sep 19 04:07:48 PM CEST 2026
Public Domain
LiveLineateLastLogLine (LLLLL) oder kurz L5, läd im Sekundentakt ein Directory Listing aus dem im Anchor übergeben Ordner oder URL. Aus dem Directory Listing werden alle Dateien geöffnet und deren Messwertzeilen ausgelesen. Dabei wird überwacht, ob neue Dateien dazukommen. Beim Auftauchen einer neuen Datei wird die ebenso nachgeladen und im Graph dargestellt. Beim Verschwinden einer Datei aus dem Listing werden auch die dort enthaltenen Werte wieder aus dem Graphen und dem Arbeitsspeicher entladen.
Die Namen der Dateien müssen dabei mit einem "@" beginnen und mit einem ".s" enden. Es handelt sich dabei um tai64n logfiles, die von multilog geschrieben und rotiert werden. die aktuelle "current" file von multilog taucht also noch nicht auf. Ist multilog aber so konfiguriert, dass es z.B. alle 60 sekunden oder alle 10 zeilen etc. rotiert, tauchen automatisch auch neue files mit dem name "@....s" auf, sobald multilog sie sauber prozessiert hat.
In der beigefügten Demo ist das Verzeichnislisting statisch in einer index.html. In einem Produktivssystem würde man hingegen ein dynamisches Verzeichnislisting, z.B. von apache nutzen, womit dann automatisch auch die neuen .s files auftauchen.
Wichtig: Multilog muss so konfiguriert sein, dass es nicht komprimiert, die .s files müssen also weiterhin plain sein.
Erwartet werden logzeilen in der Form, die dem check_mk_agent local format nachempfunden sind
P messdaten_123456 ch1=23.3|ch2=24.4 1789820615 1212901209 DemoData P messdaten_123456 ch1=24.6|ch2=24.5 1789820616 1212901209 DemoData P messdaten_123456 ch1=25.4|ch2=24.3 1789820617 1212901209 DemoData P messdaten_123456 ch1=26.2|ch2=24.1 1789820618 1212901209 DemoData P messdaten_123456 ch1=27.1|ch2=24.5 1789820619 1212901209 DemoData P messdaten_123456 ch1=28.2|ch2=24.3 1789820620 1212901209 DemoData
Die X-Achse wird durch den Unix-Timestamp im vierten space-separierten Feld bestimmt. Wird ein tai64 der Zeile vorangestellt, gilt stattdessen dieser.
Sprich: Wenn eine Datenzeile mit einem @ beginnt, geht L5 davon aus, dass es diesen inneren tai64 Zeitstempel verwenden soll, statt dem unixtimestamp im vierten space separierten Feld. Damit sind dann auch Nanosekunden-Auflösung möglich.
>Achtung: Dieses Feature steht nur in LLLLL nicht in LLLL zur Verfügung.
Sobald verwertbare Daten vorliegen, wird L5 einen Graphen zeichnen. Es können bis zu 32 Channels definiert werden und jede bekommt eine eindeutige Farbe aus einer wohldefinierten Palette (siehe Quellcode).
Der Graph wird rein clientseitig mittels Javascript in ein Canvas Element gerendert und kann daher mittels Rechtsklick > Speichern unter auch exportiert werden.
Wird die Anchor-URL geändert, läd L5 die nachfolgenden Daten von dort, womit Graphen im gleichen Maßstab sequentiell kombinierbar werden.
Siehe Nano-Sekunden-Live: Demodaten von (datadir)
Es findet ein automatisches Entladen aus dem RAM und aus dem Graphen statt, wenn zuvor gefundene Dateien nicht mehr im Listing auftauchen (z.B. aufgrund der Rotation durch multilog). Die zugehörigen Werte werden dann ebenso live wieder entladen. Damit wird also nur der Ausschnitt dargestellt, der auch im Zielordner vorhanden ist.
Da mit multilog, bzw. mit socklog auch verschiedene Log-Slots möglich sind, besteht also die Möglichkeit auch die Slots zu wechseln, indem ein anderer Anchor übergeben wird. Somit sind Langzeit- und Kurzzeit-Slots mit unterschiedlicher Granularität möglich und die Geschwindigkeit der Darstellung und des Nachladens richtet sich immer nach den im Zielordner jeweils vorhandenen und aktualisierten Wechsel der Dateien.
Ein schnelleres Polling des Index durch den Viewer hilft also nicht. Hier genügt der Sekundentakt.
Siehe dazu meine Tutorials https://finalmedia.de/code/kb/0bc1e96d458b/ und https://finalmedia.de/code/kb/59ab1d7d2b8b/
Hier ein Beispiel mit awk, tai64n und multilog, um bewusst Nano-Sekunden Messdaten zu erzeugen. dabei wird bereits bei der sehr geringen Filesize von 2k rotiert und insgesamt 400 files aufbewahrt, pro Sekunde entstehen damit rund 5 neue .s files, womit bei dieser hohen Auflösung duzenden Messwerten pro Sekunde, dann rund 5 minütiges Zeitfenster ersichtlich ist.
apt-get install daemontools pv
#!/bin/sh
yes | pv -q -l -L40 | \
awk '{
srand();
C = systime();
A = 27.5 + sin(C/10) * 1.2 + (rand() - 0.5) * 0.4;
B = 22.5 + sin(C/15) * 2.2 + (rand() - 0.6) * 0.6;
if(A < 26.1) A = 26.1; if(A > 28.9) A = 28.9;
if(B < 20.0) B = 20.0; if(B > 25.0) B = 25.0;
printf "P messdaten_123456 ch1=%.1f;31;40|ch2=%.1f %d 123456 DemoData 0.4s:1s:1s\n", A, B, C;
fflush();
}' | tai64n | multilog '+*' s2000 n400 hier/ein/logverzeichnis/
Hier eine gemächlichere Variante von Zufallsdaten im Sekundentakt. Das Nachzeichnen bei der Darstellung erfolgt damit auch nur alle 10-20 Sekunden. Das ersichtliche Zeitfenster ist dann 20 Minuten, weil wie hier schon nach 40 Files löschen, jedoch ebenso nach 2000 bytes Size rotieren. Dennoch pollt natprlich der Viewer im gleichen Intervall auf Neuerungen im Listing.
#!/bin/sh
yes | pv -q -l -L1 | \
awk '{
srand();
C = systime();
A = 27.5 + sin(C/10) * 1.2 + (rand() - 0.5) * 0.4;
B = 22.5 + sin(C/15) * 2.2 + (rand() - 0.6) * 0.6;
if(A < 26.1) A = 26.1; if(A > 28.9) A = 28.9;
if(B < 20.0) B = 20.0; if(B > 25.0) B = 25.0;
printf "P messdaten_123456 ch1=%.1f;31;40|ch2=%.1f %d 123456 DemoData 1s:10s:1s\n", A, B, C;
fflush();
}' | multilog '+*' s2000 n40 /hier/ein/alternatives/logverzeichnis/
Siehe auch poetherm für hardware-sensoren. Deren Messdaten mit einem awk einzeiler in genau das hier benötigte Format gebracht und im syslog abgelegt werden kann, womit es (ohne unschärfeverluste) jahrzehnte lang sauber Daten archivieren und protokollieren kann.
curl -s "http://sensorename/temp | awk -v now="$(date +%s)" '{printf "P messdaten_123456 temp=" $1 " " now " 123456 DemoData\n" }' | logger -t demo
mkdir l5 cd l5 wget https://finalmedia.de/code/js/l5/live.html wget https://finalmedia.de/code/js/l5/single.html mkdir data # fetch demo data cd data wget -nd -nH -np -r https://finalmedia.de/code/js/l5/data/ cd .. # startup busybox httpd -f -p 8080 # besser apt-get install gatling gatling -L -V -F -S -d -p 8080
Nun mit dem Browser auf http://127.0.0.1:8080 öffnen.
data ... 160K data3 ... 1.6MB