Como forçar o Logstash a reanalisar um arquivo?

91

Eu instalei o Logstash para analisar arquivos apache. Levei muito tempo para acertar as configurações e sempre tentei em registros reais. Percebi (como diz a documentação) que o logstash "se lembra" de onde estava em um arquivo. Agora minhas configurações estão OK e eu gostaria que Logstash "esquecesse". Parece mais difícil do que eu. Eu já fiz o seguinte:

  • usava: start_position => "beginning"

  • excluiu a pasta "data" completa de elastissearch (e parou primeiro)

  • olhou para quais arquivos foram abertos pelo logstash lsof -p PIDe excluiu tudo o que era promissor (no meu caso /tmp/jffi*.tmp)

Mesmo assim, o Logstash não se esquece e analisa apenas os arquivos "novos" na pasta onde os logs estão

Alguma ideia?

Christophe Claude
fonte
A última versão do logstash foi encontrada em:/opt/logstash/data/plugins/inputs/file
Tim Smith

Respostas:

135

Por padrão, o logstash grava a última posição em um arquivo de log que geralmente reside em $HOME/.sincedb. Logstash pode ser enganado ao acreditar que nunca analisou o arquivo de log especificando /dev/nullcomo sincedb_path.

Aqui está a parte da documentação Arquivo de entrada .

Onde gravar o banco de dados desde (mantém o controle da posição atual dos arquivos de log monitorados). O padrão é o valor da variável de ambiente "$ SINCEDB_PATH" ou "$ HOME / .sincedb".

Exemplo de configuração

input {
    file {
        path => "/tmp/logfile_to_analyse"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}
flazzarini
fonte
28
No Windows, você pode usar sincedb_path => "NUL"para obter o mesmo efeito. Detalhe aqui
Chris Magnuson
11
Se os arquivos forem muito antigos (mais de 24h), muito útil é adicionar uma opção ingnore_older => 0para que o logstash os leve independentemente da data. Por padrão, se os arquivos forem mais antigos, 24h será ignorado.
mtfk
1
@mtfk: Uau, achado incrível! Obrigado por apontar ignore_older => 0funciona no logstash! Eu fui atolado pelo mesmo problema que o questionador. Parece ser um achado não óbvio! (pesquisando "ignore_older" e "logstash" apenas abre páginas no filebeat, não consegui encontrar nenhum traço de como lidar com isso no logstash)
Mike Lutz
Como adicionar usando filebeat
Sunilkumar Ramamurthy
@SunilkumarRamamurthy Eu acredito que se você deixar a opção ignore_olderem sua configuração de filebeat, filbeat é forçado a ler todo o arquivo novamente elastic.co/guide/en/beats/filebeat/current/…
flazzarini
19

O arquivo de plugin armazena o histórico de "cauda" no arquivo sincedb, padrão: sob $ HOME / .sincedb *, consulte http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

A linha desde que o arquivo db contém se parece com:

[inode] [major device number] [minor device number] [byte offset]

Portanto, se quiser analisar novamente um arquivo completo, você precisa:

  • deletar arquivos sindedb
  • OU exclua apenas a linha correspondente no arquivo sincedb, verifique o número do inode antes do seu arquivo ( ls -i yourFile | awk '{print $1}')
  • E reinicie o Logstash

Com a chave start_position => "beginning", o Logstash analisará todo o arquivo.

Exemplo de arquivo sincedb:

yesnault
fonte
1
A respeito start_position => "beginning", a documentação diz:> Esta opção modifica apenas as situações de "primeiro contato" onde um arquivo é novo e não visto antes. Se um arquivo já foi visto antes, esta opção não tem efeito.
Brad
10

Logstash manterá o registro $HOME/.sincedb_*. Você pode excluir todos os .sincedbe reiniciar o logstash, o Logstash analisará novamente o arquivo.

Ben Lim
fonte
9

Combinando todas as respostas, acho que esta é a melhor maneira de analisar arquivos. Eu fiz o mesmo para meus testes.

input {
  file {
    path => "/tmp/access_log"
    start_position => beginning
    sincedb_path => "/dev/null"
    ignore_older => 0
  }
}

Para um teste rápido, em vez de ignore_older, você também pode touch /tmp/access_logalterar o carimbo de data / hora do arquivo.

vikas027
fonte
esteja ciente de que adicionar a configuração ignore_older => 0fará o oposto.
panchicore
5

Se você estiver usando logstash-forwarder, verifique se há .logstash-forwarderarquivos em sua página inicial :

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}
Elwarren
fonte
3
Se instalado como um pacote, verifique /var/lib/logstash-forwarder/.
Wesley Baugh
3

Após a exclusão, $HOME/.sincedb_*ele ainda não estava ingerindo dados para mim.

Depois de tentar várias coisas, removi tudo, exceto o .confarquivo principal, /etc/logstash/conf.de reiniciei o Logstash, e tudo funcionou. Só posso presumir que havia algo em um dos .confarquivos que o logstash estava silenciosamente pendurado.

Seth
fonte
Pelo que me lembro, mais tarde ativei algum sinalizador de depuração e ele me disse por que estava com raiva, em vez de silenciosamente suspenso. Acho que estava procurando por um número de versão nos dados, mas às vezes os dados não tinham um número. A verificação para descobrir qual era o número travaria se não fosse um número, então eu tive que primeiro testar se era um número e depois perguntar qual era.
Set
1

Na verdade, repetir cada vez é muito caro se o arquivo contiver muitos dados. Portanto, você precisa ter cuidado antes de fazer isso. Se quisermos forçá-lo a analisar novamente, defina o parâmetro dentro do bloco de entrada

sincedb_path => "/dev/null" 

Esta opção não armazenará o arquivo .sincedb e o logstash analisará novamente todas as vezes. Mas se você quiser repetir ocasionalmente, não todas as vezes, o que você pode fazer é excluir manualmente o caminho .sinceDb que é criado ao analisar o arquivo. Geralmente, ele está presente no diretório inicial como um arquivo oculto, se você não for um usuário root, de outra forma no diretório raiz. Você também pode definir o sincedb_path para algum outro local para rastrear este arquivo facilmente.

sincedb_path => "/home/shubham/sinceDB/productsSince.db"
Shubham Gupta
fonte
1

Se você quiser evitar bagunçar as opções de logstash, descobri que renomear ou remover o arquivo de log existente e criar um novo arquivo a partir do conteúdo do arquivo antigo enganará o logstash para reindexá-lo.

GreensterRox
fonte
0

Eu o encontrei em meu diretório inicial, mas depois de excluí-lo, o logstash se recusou a selecionar novamente os arquivos de log existentes. A maneira que fiz isso funcionar foi adicionando

sincedb_path => "/opt/elk/sincedb/"  

ao meu plugin de arquivo. Acho que para reiniciar a cada vez, é só mudar o caminho de sincedb_path

Joseph
fonte
0

se você usar tar.gz install filebeat, você pode deletar este arquivo $FilebeatPath/data/registry/filebeat/data.json,, e executar novamente o filebeat

LT
fonte
0

Tente deletar a /var/lib/logstashpasta em seu ENV

Rajitha Abeysekara
fonte
-1

O novo diretório do logstash versão 5 está em

<path.data>/plugins/inputs/file

A definição de path.data está em logstash.yml

foo01
fonte