tail -f equivalente a um URL

10

Quero monitorar o arquivo de log do meu aplicativo que, no entanto, não funciona localmente, mas em uma plataforma SaaS e é exposto por HTTP e WebDAV. Portanto, um equivalente de tail -f que funciona para URLs faria um ótimo trabalho para mim.

PS Se você conhece outras ferramentas que podem monitorar arquivos remotos por HTTP, também pode ser útil. obrigado

arrebentar
fonte
11
É mostrado como texto sem formatação no servidor remoto ou como html?
Ter12
Texto simples com formato específico: [timestamp] ERROR_NAME ..... que eu então a intenção de filtro através do grep
Munch
Você pode usar wget -N http://somewhere/something, que fará o download do arquivo apenas se for mais recente do que o que você baixou antes ou usar wget -O - http://somewhere/somethingpara redirecionar o arquivo para o stdout.
semana

Respostas:

11

Pode haver uma ferramenta específica para isso, mas você também pode fazê-lo usando o wget. Abra um terminal e execute este comando:

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

Isso fará o download do arquivo de log a cada dois segundos e o salvará log.txtanexando a saída ao que já existe ( -csignifica continuar o download e -aanexar a saída ao nome do arquivo fornecido). O -oredireciona as mensagens de erro para /dev/null/.

Portanto, agora você tem uma cópia local do log.txt e pode executar tail -f:

tail -f log.txt 
Terdon
fonte
Descobri que poderia usar o davfs2 para integrar-se à interface webDAV e depois usar o arquivo como um arquivo normal. Isso é o que eu realmente esperava. Mas a solução é mais simples e realmente funciona
Munch
Eu descobri que tudo está sendo salvo no arquivo "log" e não "log.txt". No meu caso, isso funciona: wget -ca -O log.txt -o / dev / null yoursite.com/log
yatsek
@munch davfs2 não funciona tão bem. No meu caso, descobri que tail -fnão atualiza as alterações no arquivo, a menos que haja algum outro processo solicitando ativamente ao servidor atualizações de diretório (uma planície lsparece suficiente). O problema é tail -fconfiar no inotify e o inotify parece não funcionar com o davfs2.
jesjimher
@jesjimher tailnão depende de inotify. Ele simplesmente lê o arquivo, procura novamente e lê novamente. Se não funcionar bem com o davfs, isso dependerá da forma como o davfs funciona. Presumivelmente, ele só atualiza informações quando algo está lendo ativamente o diretório e, como tailmantém o arquivo aberto, isso não o aciona. Ou algo nesse sentido.
terdon
Tanto quanto eu entendo o código da cauda, ​​não é uma dependência, mas usa inotify se estiver disponível, recorrendo ao comportamento de pesquisa apenas se inotify não estiver disponível no sistema. Como o davfs não pode saber quando um arquivo foi alterado sem fazer uma solicitação explícita, nenhum evento inotify será gerado até que outro processo solicite uma atualização do diretório. Seria bom se o tail tivesse alguma maneira de forçar a pesquisa, mesmo se o inotify estiver disponível, mas não encontrei esse parâmetro.
jesjimher
3

Eu respondi a mesma pergunta aqui com um script de shell completo que pega a URL como argumento e tail -fé isso. Aqui está uma cópia dessa resposta literalmente:


Isso fará isso:

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

Não é muito amigável no servidor web. Você pode substituir o truecom sleep 1por ser menos intensivo em recursos.

Assim tail -f, você precisa ^Cquando terminar de assistir a saída, mesmo quando a saída estiver concluída.

Brian
fonte
0

a opção curl com faixa em combinação com o relógio pode ser usada para conseguir isso:

GAMAS

O HTTP 1.1 introduziu intervalos de bytes. Usando isso, um cliente pode solicitar a obtenção de apenas uma ou mais subpartes de um documento especificado. A ondulação suporta isso com o sinalizador -r.

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

Por exemplo

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

Isso recuperará os últimos 2000 bytes do log a cada 30 segundos.

Nota: para https autoassinado, use a opção --insecure curl

ghm1014
fonte