tail -f setara untuk URL

10

Saya ingin memonitor file log aplikasi saya yang bagaimanapun tidak bekerja secara lokal tetapi pada platform SaaS dan diekspos melalui HTTP dan WebDAV. Jadi, setara dengan tail -f yang berfungsi untuk URL akan sangat membantu saya.

NB. Jika Anda mengetahui ada alat lain yang dapat memonitor file jarak jauh melalui HTTP, itu juga bisa membantu. Terima kasih

mengunyah
sumber
1
Apakah ditampilkan sebagai teks biasa di server jarak jauh atau sebagai html?
terdon
Teks biasa dengan format tertentu: [timestamp] Error_name ..... Yang saya maksudkan untuk difilter melalui grep
munch
Anda dapat menggunakan wget -N http://somewhere/something, itu akan mengunduh file hanya jika itu lebih baru dari yang Anda unduh sebelumnya atau gunakan wget -O - http://somewhere/somethinguntuk mengarahkan file ke stdout.
minggu

Jawaban:

11

Mungkin ada alat khusus untuk ini, tetapi Anda juga bisa melakukannya menggunakan wget. Buka terminal dan jalankan perintah ini:

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

Ini akan mengunduh file log setiap dua detik dan menyimpannya ke dalam log.txtmenambahkan output ke apa yang sudah ada ( -cberarti melanjutkan mengunduh dan -aberarti menambahkan output ke nama file yang diberikan). The -opengalihan pesan kesalahan /dev/null/.

Jadi, sekarang Anda memiliki salinan log.txt lokal dan dapat dijalankan tail -fdi sana:

tail -f log.txt 
terdon
sumber
Saya menemukan bahwa saya bisa menggunakan davfs2 untuk berintegrasi dengan antarmuka webDAV dan kemudian menggunakan file seperti file biasa. Inilah yang benar-benar saya harapkan. Tetapi solusi Anda lebih sederhana dan benar-benar berfungsi
mengunyah
Saya menemukan bahwa semuanya disimpan dalam file "log" bukan "log.txt". Dalam kasus saya ini berfungsi: wget -ca -O log.txt -o / dev / null yoursite.com/log
yatsek
@munch davfs2 tidak berfungsi dengan baik. Dalam kasus saya, saya menemukan bahwa tail -ftidak memperbarui perubahan file kecuali ada beberapa proses lain yang secara aktif meminta server untuk pembaruan direktori ( lstampaknya cukup polos ). Masalahnya tail -fbergantung pada inotify, dan inotify tampaknya tidak berhasil pada davfs2.
jesjimher
@jesjimher tailtidak bergantung pada inotify. Itu hanya membaca file, mencari kembali dan membaca lagi. Jika tidak bekerja dengan baik dengan davf, itu akan turun ke cara davf itu sendiri bekerja. Agaknya, itu hanya memperbarui informasi ketika ada sesuatu yang secara aktif membaca direktori dan karena tailmembuat file tetap terbuka, itu tidak memicu itu. Atau sesuatu seperti itu.
terdon
Sejauh yang saya mengerti kode tail, ini bukan ketergantungan, tetapi menggunakan inotify jika tersedia, beralih ke perilaku polling hanya jika inotify tidak tersedia dalam sistem. Karena davfs tidak dapat mengetahui kapan suatu file telah berubah tanpa melakukan permintaan eksplisit, tidak ada peristiwa inotify yang dihasilkan hingga beberapa proses lain meminta refresh direktori. Akan lebih baik jika tail memiliki cara untuk memaksa polling, bahkan jika tidak tersedia, tetapi saya belum menemukan parameter seperti itu.
jesjimher
3

Saya menjawab pertanyaan yang sama di sini dengan skrip shell lengkap yang mengambil URL sebagai argumen dan tail -fitu. Ini salinan jawaban itu kata demi kata:


Ini akan melakukannya:

#!/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"

Itu tidak terlalu ramah di server web. Anda dapat mengganti truedengan sleep 1menjadi sumber daya kurang intensif.

Seperti tail -f, Anda perlu ^Cketika Anda selesai menonton output, bahkan ketika output selesai.

Brian
sumber
0

ikal dengan rentang pilihan dalam kombinasi dengan arloji dapat digunakan untuk mencapai ini:

RANGES

HTTP 1.1 memperkenalkan byte-range. Dengan menggunakan ini, klien dapat meminta untuk mendapatkan hanya satu atau lebih bagian dari dokumen yang ditentukan. Curl mendukung ini dengan flag -r.

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

Sebagai contoh

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

Ini akan mengambil 2000 byte terakhir dari log setiap 30 detik.

Catatan: untuk https yang ditandatangani sendiri gunakan opsi --insecure curl

ghm1014
sumber