хвост -f эквивалент для URL

5408
munch

Я хочу отслеживать файл журнала моего приложения, который, однако, работает не локально, а на платформе SaaS и доступен через HTTP и WebDAV. Таким образом, эквивалент tail -f, который работает для URL-адресов, отлично подходит для меня.

PS Если вам известны какие-либо другие инструменты, которые могут отслеживать удаленные файлы через HTTP, это также может помочь. Спасибо

9
Это показано в виде простого текста на удаленном сервере или в виде HTML? terdon 11 лет назад 1
Обычный текст с определенным форматом: [timestamp] Error_name ..... который я тогда собираюсь отфильтровать через grep munch 11 лет назад 0
Вы можете использовать `wget -N http: // где-то / что-нибудь`, который будет загружать файл, только если он новее, чем тот, который вы загружали ранее, или использовать` wget -O - http: // где-то / что-то`, чтобы перенаправить файл в стандартный вывод. week 11 лет назад 0

3 ответа на вопрос

9
terdon

There may be a specific tool for this, but you can also do it using wget. Open a terminal and run this command:

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

This will download the logfile every two seconds and save it into log.txt appending the output to what is already there (-c means continue downloading and -a means append the output to the file name given). The -o redirects error messages to /dev/null/.

So, now you have a local copy of log.txt and can run tail -f on it:

tail -f log.txt 
Я обнаружил, что могу использовать davfs2 для интеграции с интерфейсом webDAV, а затем использовать этот файл как обычный файл. Это то, что я действительно ожидал. Но ваше решение проще и на самом деле работает munch 11 лет назад 0
Я обнаружил, что все сохраняется в файле «log», а не «log.txt». В моем случае это работает: wget -ca -O log.txt -o / dev / null http://yoursite.com/log yatsa 10 лет назад 0
@yatsa да, ты прав, исправлено, спасибо. terdon 10 лет назад 0
@munch davfs2 работает не очень хорошо. В моем случае я обнаружил, что `tail -f` не обновляет изменения файлов, если только не существует какого-то другого процесса, активно запрашивающего у сервера обновления каталога (простой` ls` кажется достаточно). Проблема заключается в том, что `tail -f` полагается на inotify, а inotify, похоже, не работает над davfs2. jesjimher 6 лет назад 0
@jesjimher `tail` не зависит от inotify. Он просто читает файл, ищет и читает снова. Если он не работает с davfs, все будет зависеть от того, как работает сам davfs. Предположительно, он обновляет информацию только тогда, когда что-то активно читает каталог, и поскольку `tail` держит файл открытым, это не вызывает его. Или что-то вдоль этих линий. terdon 6 лет назад 0
Насколько я понимаю код tail, это не зависимость, но он использует inotify, если он доступен, прибегая к поведению опроса, только если inotify недоступен в системе. Поскольку davfs не может знать, когда файл изменился, не выполнив явный запрос, событие inotify не генерируется, пока какой-либо другой процесс не запросит обновление каталога. Было бы хорошо, если бы у tail был какой-то способ принудительного опроса, даже если доступно inotify, но я не нашел такого параметра. jesjimher 6 лет назад 0
2
Brian

Я ответил на тот же вопрос здесь полным сценарием оболочки, который принимает URL в качестве аргумента и tail -fвсе. Вот копия этого ответа дословно:


Это сделает это:

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

Это не очень дружелюбно на веб-сервере. Вы могли бы заменить trueс sleep 1менее ресурсоемким.

Мол tail -f, вам нужно, ^Cкогда вы закончите смотреть вывод, даже когда вывод сделан.

0
ghm1014

Для достижения этой цели можно использовать локон с опцией диапазона в сочетании с часами:

ДИАПАЗОН

В HTTP 1.1 введены байтовые диапазоны. Используя это, клиент может запросить получение только одной или нескольких частей указанного документа. Curl поддерживает это с помощью флага -r.

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

Например

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

Это будет извлекать последние 2000 байтов журнала каждые 30 секунд.

Примечание: для самозаверяющего https используйте опцию --insecure curl