Comment forcer Logstash à analyser un fichier?

91

J'ai installé Logstash pour analyser les fichiers Apache. Il m'a fallu pas mal de temps pour obtenir les bons paramètres et j'ai toujours essayé de vrais journaux. J'ai remarqué (comme le dit la documentation) que logstash "se souvient" où il se trouvait dans un fichier. Maintenant, mes réglages sont corrects et j'aimerais que Logstash «oublie». Cela semble plus difficile que moi. J'ai déjà fait ce qui suit:

  • utilisé: start_position => "beginning"

  • a supprimé le dossier "data" complet d'elastissearch (et l'a arrêté en premier)

  • regardé quels fichiers ont été ouverts par logstash avec lsof -p PIDet supprimé tout ce qui était prometteur (dans mon cas /tmp/jffi*.tmp)

Pourtant, Logstash n'oublie pas et analyse uniquement les fichiers "frais" dans le dossier où se trouvent les journaux

Des idées?

Christophe Claude
la source
Dernière version de logstash dans laquelle je l'ai trouvée:/opt/logstash/data/plugins/inputs/file
Tim Smith

Réponses:

135

Par défaut, logstash écrit la dernière position sur un fichier journal qui réside généralement dans $HOME/.sincedb. Logstash peut être dupé en pensant qu'il n'a jamais analysé le fichier journal en spécifiant /dev/nullcomme sincedb_path.

Voici la partie de la documentation Fichier d'entrée .

Où écrire la base de données depuis (assure le suivi de la position actuelle des fichiers journaux surveillés). La valeur par défaut est la valeur de la variable d'environnement "$ SINCEDB_PATH" ou "$ HOME / .sincedb".

Exemple de configuration

input {
    file {
        path => "/tmp/logfile_to_analyse"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}
flazzarini
la source
28
Sur Windows, vous pouvez utiliser sincedb_path => "NUL"pour obtenir le même effet. Détails ici
Chris Magnuson
11
Si les fichiers sont assez anciens (plus de 24h), il est très utile d'ajouter une option ingnore_older => 0pour que logstash les prenne quelle que soit la date. Par défaut, si les fichiers sont plus anciens, 24h sera ignoré.
mtfk
1
@mtfk: Super trouvaille! Merci d'avoir signalé les ignore_older => 0travaux dans logstash! J'ai été coincé par le même problème que le questionneur. Semble être une découverte non évidente! (googler "ignore_older" et "logstash" n'affiche que des pages sur filebeat, je n'ai trouvé aucune trace de la façon de gérer cela dans logstash)
Mike Lutz
Comment ajouter ceci en utilisant FileBeat
Sunilkumar Ramamurthy
@SunilkumarRamamurthy Je crois que si vous laissez l'option ignore_olderdans votre configuration filebeat, filbeat est obligé de lire à nouveau le fichier entier elastic.co/guide/en/beats/filebeat/current/...
flazzarini
19

L'historique de stockage du fichier du plugin de "tailing" dans le fichier sincedb, par défaut: sous $ HOME / .sincedb *, voir http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

Le fichier since db contient une ligne ressemblant à:

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

Donc, si vous souhaitez analyser à nouveau un fichier complet, vous devez:

  • supprimer les fichiers sindedb
  • OU supprimez uniquement la ligne correspondante dans le fichier sincedb, vérifiez le numéro d'inode avant de votre fichier ( ls -i yourFile | awk '{print $1}')
  • Et redémarrez Logstash

Avec la clé start_position => "beginning", Logstash analysera tout le fichier.

Exemple de fichier sincedb:

ouinault
la source
1
Concernant start_position => "beginning", la documentation dit:> Cette option ne modifie que les situations de "premier contact" où un fichier est nouveau et jamais vu auparavant. Si un fichier a déjà été vu auparavant, cette option n'a aucun effet.
Brad
10

Logstash conservera l'enregistrement au format $HOME/.sincedb_*. Vous pouvez supprimer tous les .sincedbet redémarrer logstash, Logstash analysera le fichier.

Ben Lim
la source
9

En combinant toutes les réponses, devinez que c'est la meilleure façon d'analyser les fichiers. J'ai fait la même chose pour mes tests.

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

Pour un test rapide, au lieu de ignore_older, vous pouvez également touch /tmp/access_logmodifier l'horodatage du fichier.

vikas027
la source
sachez que l'ajout de la configuration ignore_older => 0fera le contraire.
panchicore le
5

Si vous utilisez logstash-forwarder, recherchez .logstash-forwarderplutôt un fichier dans votre maison :

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}
Elwarren
la source
3
S'il est installé en tant que package, vérifiez /var/lib/logstash-forwarder/.
Wesley Baugh
3

Après la suppression, $HOME/.sincedb_*il n'intégrait toujours pas de données pour moi.

Après avoir essayé un tas de choses, j'ai supprimé tout sauf le .conffichier principal /etc/logstash/conf.det redémarré Logstash, et tout a fonctionné. Je ne peux que supposer qu'il y avait quelque chose dans l'un des .conffichiers sur lequel logstash s'accrochait silencieusement.

Seth
la source
Si je me souviens bien, j'ai ensuite activé un indicateur de débogage et cela m'a dit pourquoi il était en colère plutôt que suspendu silencieusement. Je pense qu'il cherchait un numéro de version dans les données, mais parfois les données ne contenaient pas de numéro. Le chèque pour savoir quel était le nombre planterait s'il ne s'agissait pas d'un nombre, alors j'ai dû d'abord tester qu'il s'agissait d'un nombre, puis demander de quel numéro il s'agissait.
Seth
1

En fait, la réparation à chaque fois est très coûteuse si le fichier contient des données volumineuses. Vous devez donc faire attention avant de faire cela. Si nous voulons le forcer à analyser à nouveau, définissez le paramètre à l'intérieur du bloc d'entrée

sincedb_path => "/dev/null" 

Cette option ne stockera pas le fichier .sincedb et logstash analysera à chaque fois. Mais si vous voulez analyser occasionnellement pas à chaque fois, ce que vous pouvez faire est de supprimer manuellement le chemin .sinceDb qui est créé lors de l'analyse du fichier. Généralement, il est présent dans le répertoire de base en tant que fichier caché si vous n'êtes pas un utilisateur root sinon dans le répertoire racine. Vous pouvez également définir sincedb_path sur un autre emplacement pour suivre facilement ce fichier.

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

Si vous voulez éviter de jouer avec les options de logstash, j'ai trouvé que renommer ou supprimer le fichier journal existant et créer un nouveau fichier à partir de l'ancien contenu du fichier entraînera logstash dans la réindexation.

GreensterRox
la source
0

Je l'ai trouvé dans mon répertoire personnel, mais après l'avoir supprimé, logstash a refusé de sélectionner à nouveau les fichiers journaux existants. La façon dont je l'ai fait fonctionner était d'ajouter

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

à mon plugin de fichier. Je pense à réinitialiser à chaque fois, il suffit de changer le chemin de sincedb_path

Joseph
la source
0

si vous utilisez tar.gz install filebeat, vous pouvez supprimer ce fichier $FilebeatPath/data/registry/filebeat/data.json, et réexécuter le fichier filebeat

LT
la source
0

Essayez de supprimer le /var/lib/logstashdossier de votre ENV

Rajitha Abeysekara
la source
-1

logstash version 5 nouveau répertoire est dans

<path.data>/plugins/inputs/file

La définition de path.data se trouve dans logstash.yml

foo01
la source