tail -f entspricht einer URL


10

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 funktioniert, würde für mich also großartige Arbeit leisten.

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


1
Wird es auf dem Remote-Server als einfacher Text oder als HTML angezeigt?
Terdon

Plain Text mit bestimmtem Format: [timestamp] ERROR_NAME ..... Was ich dann Absicht Filter durch grep
Munch

Sie können diese wget -N http://somewhere/somethingDatei nur herunterladen, wenn sie neuer als die zuvor heruntergeladene ist, oder um wget -O - http://somewhere/somethingdie Datei an stdout umzuleiten.
Woche

Antworten:


11

Möglicherweise gibt es dafür ein spezielles Tool, aber Sie können es auch mit wget tun. Öffnen Sie ein Terminal und führen Sie diesen 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 die Ausgabe an das anzuhängen log.txt, was bereits vorhanden ist ( -cbedeutet, dass der Download fortgesetzt wird und -adie Ausgabe an den angegebenen Dateinamen angehängt wird). Der -oleitet Fehlermeldungen an weiter /dev/null/.

Jetzt haben Sie eine lokale Kopie von log.txt und können darauf ausgeführt werden tail -f:

tail -f log.txt 

Ich fand heraus, dass ich davfs2 verwenden konnte, um mich in die webDAV-Oberfläche zu integrieren und die Datei dann wie eine normale Datei zu verwenden. Das habe ich wirklich erwartet. Aber Ihre Lösung ist einfacher und funktioniert tatsächlich
munch

Ich habe festgestellt, dass alles in der "log" -Datei und nicht in "log.txt" gespeichert wird. In meinem Fall funktioniert dies: wget -ca -O log.txt -o / dev / null yoursite.com/log
yatsek

@munch davfs2 funktioniert nicht so gut. In meinem Fall habe ich festgestellt, dass tail -fDateiänderungen nur aktualisiert werden, wenn ein anderer Prozess den Server aktiv nach Verzeichnisaktualisierungen fragt (eine Ebene lsscheint ausreichend zu sein). Das Problem tail -fberuht auf inotify, und inotify scheint nicht über davfs2 zu funktionieren.
Jesjimher

@jesjimher tailhä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 das davon ab, wie davfs selbst funktioniert. Vermutlich werden Informationen nur aktualisiert, wenn etwas das Verzeichnis aktiv liest, und da taildie Datei geöffnet bleibt, wird sie nicht ausgelöst. Oder so ähnlich.
Terdon

Soweit ich den Code von tail verstehe, ist er keine Abhängigkeit, aber er verwendet inotify, wenn er verfügbar ist, und greift nur dann auf das Abfrageverhalten zurück, wenn inotify im System nicht verfügbar ist. Da davfs ohne explizite Anforderung nicht wissen kann, wann sich eine Datei 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 einen solchen Parameter nicht gefunden.
Jesjimher

3

Ich habe die gleiche Frage hier mit einem vollständigen Shell-Skript beantwortet , das die URL als Argument verwendet und tail -fes ist. Hier ist eine Kopie dieser Antwort wörtlich:


Dies 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 truedurch sleep 1weniger ressourcenintensiv ersetzen .

Wie tail -fmüssen Sie, ^Cwenn Sie fertig sind, die Ausgabe zu sehen, auch wenn die Ausgabe fertig ist.


0

Curl mit Range Option in Kombination mit Uhr kann verwendet werden, um dies zu erreichen:

BEREICHE

HTTP 1.1 führte Bytebereiche ein. Auf diese Weise kann ein Client anfordern, nur einen oder mehrere Unterteile eines bestimmten Dokuments abzurufen. Curl unterstützt dies mit dem Flag -r.

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

Beispielsweise

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

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

Hinweis: Verwenden Sie für selbstsigniertes https die Option --insecure curl

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.