tail -f entspricht einer URL

5434
munch

Ich möchte die Protokolldatei meiner Anwendung überwachen, die jedoch nicht lokal, sondern auf einer SaaS-Plattform funktioniert und über HTTP und WebDAV verfügbar gemacht wird. Ein Äquivalent von tail -f, das für URLs geeignet ist, würde also gute Arbeit leisten.

PS Wenn Sie andere Tools kennen, die entfernte Dateien über HTTP überwachen können, kann dies ebenfalls hilfreich sein. Vielen Dank

9
Wird es auf dem Remote-Server als Klartext oder als HTML angezeigt? terdon vor 11 Jahren 1
Nur Text in einem bestimmten Format: [Zeitstempel] Fehlername ..... Den ich dann durch grep filtern möchte munch vor 11 Jahren 0
Sie können `wget -N http: // irgendwo / etwas` verwenden, dh die Datei wird nur dann heruntergeladen, wenn sie neuer ist als die, die Sie zuvor heruntergeladen haben, oder verwenden Sie` wget -O - http: // irgendwo / etwas`, um die Datei umzuleiten stdout week vor 11 Jahren 0

3 Antworten auf die Frage

9
terdon

Möglicherweise gibt es dafür ein bestimmtes Werkzeug, Sie können es jedoch auch mit wget tun. Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus:

while(1); do \ sleep 2; \ wget -ca -O log.txt -o /dev/null http://yoursite.com/log; \ done 

Dadurch wird die Protokolldatei alle zwei Sekunden heruntergeladen und gespeichert, um log.txtdie Ausgabe an das bereits vorhandene anzuhängen ( -cbedeutet, dass der Download fortgesetzt wird und -adie Ausgabe an den angegebenen Dateinamen angehängt wird). Die -oWeiterleitung von Fehlermeldungen an /dev/null/.

Jetzt haben Sie eine lokale Kopie von log.txt und können diese ausführen tail -f:

tail -f log.txt 
Ich fand heraus, dass ich mit davfs2 die webDAV-Schnittstelle integrieren und die Datei dann wie eine normale Datei verwenden könnte. Das habe ich wirklich erwartet. Ihre Lösung ist jedoch einfacher und funktioniert tatsächlich munch vor 11 Jahren 0
Ich habe festgestellt, dass alles in der "log" -Datei und nicht in "log.txt" gespeichert wird. In meinem Fall funktioniert das: wget -ca -O log.txt -o / dev / null http://yoursite.com/log yatsa vor 10 Jahren 0
@yatsa ja, du hast recht, jetzt behoben, danke. terdon vor 10 Jahren 0
@munch davfs2 funktioniert nicht so gut. In meinem Fall habe ich festgestellt, dass `tail -f` die Dateiänderungen nicht aktualisiert, es sei denn, es gibt einen anderen Prozess, der den Server aktiv nach Verzeichnisaktualisierungen fragt (ein einfaches` ls` scheint genug). Das Problem ist "tail -f" setzt auf inotify, und inotify scheint über davfs2 nicht zu funktionieren. jesjimher vor 6 Jahren 0
@jesjimher `tail` hängt nicht von inotify ab. Es liest einfach die Datei, sucht zurück und liest erneut. Wenn es mit davfs nicht gut funktioniert, hängt es von der Funktionsweise von davfs ab. Vermutlich werden Informationen nur dann aktualisiert, wenn etwas das Verzeichnis aktiv liest und da "tail" die Datei geöffnet hält, wird dies nicht ausgelöst. Oder etwas in dieser Richtung. terdon vor 6 Jahren 0
Soweit ich den Code von Tail verstehe, handelt es sich nicht um eine Abhängigkeit, sondern es wird inotify verwendet, falls verfügbar, und auf das Abrufverhalten nur zurückgegriffen, wenn inotify im System nicht verfügbar ist. Da davfs nicht wissen kann, wann sich eine Datei ohne explizite Anforderung geändert hat, wird kein inotify-Ereignis generiert, bis ein anderer Prozess eine Verzeichnisaktualisierung anfordert. Es wäre schön, wenn tail eine Möglichkeit hätte, das Polling zu erzwingen, selbst wenn inotify verfügbar ist, aber ich habe keinen solchen Parameter gefunden. jesjimher vor 6 Jahren 0
2
Brian

Ich habe die gleiche Frage hier mit einem kompletten Shellskript beantwortet, das die URL als Argument nimmt und tail -fes ist. Hier ist eine Kopie dieser Antwort wörtlich:


Das wird es tun:

#!/bin/bash  file=$(mktemp) trap 'rm $file' EXIT  (while true; do # shellcheck disable=SC2094 curl --fail -r "$(stat -c %s "$file")"- "$1" >> "$file" done) & pid=$! trap 'kill $pid; rm $file' EXIT  tail -f "$file" 

Es ist nicht sehr freundlich auf dem Webserver. Sie könnten das truemit ersetzen sleep 1, um weniger Ressourcen zu benötigen.

Wie tail -fmüssen Sie, ^Cwenn Sie die Ausgabe fertig beobachten, auch wenn der Ausgang erfolgt.

0
ghm1014

Um dies zu erreichen, kann eine Curl mit Range-Option in Kombination mit einer Uhr verwendet werden:

RANGES

HTTP 1.1 hat Bytebereiche eingeführt. Auf diese Weise kann ein Client anfordern, nur ein oder mehrere Unterabschnitte eines angegebenen Dokuments abzurufen. Curl unterstützt dies mit dem Flag -r.

watch -n <interval> 'curl -s -r -<bytes> <url>' 

Zum Beispiel

watch -n 30 'curl -s -r -2000 http://yoursite.com/log' 

Dadurch werden die letzten 2000 Bytes des Protokolls alle 30 Sekunden abgerufen.

Hinweis: Für selbstsignierte https verwenden Sie die Option --insecure curl