web-dev-qa-db-fra.com

Utilisation de Log4J avec LogStash

Je suis nouveau sur LogStash. J'ai des journaux écrits à partir d'une application Java dans Log4J. Je suis en train d'essayer d'obtenir ces journaux dans ElasticSearch. Pour ma vie, je n'arrive pas à l'obtenir pour fonctionner de manière cohérente. Actuellement, j'utilise la configuration de logstash suivante:

input {
  file {
    type => "log4j"
    path => "/home/ubuntu/logs/application.log"
  }
}
filter {
  grok {
    type => "log4j"
    add_tag => [ "ApplicationName" ]
    match => [ "message", "%{TIMESTAMP_ISO8601:timestamp}  %{LOGLEVEL:level}" ]
  }
}
output {
  elasticsearch {
    protocol => "http"
    codec => "plain"
    Host => "[myIpAddress]"
    port => "[myPort]"
  }
}

Cette configuration semble être aléatoire. Je ne sais pas pourquoi. Par exemple, j'ai deux messages. L'un fonctionne et l'autre lance un échec d'analyse. Pourtant, je ne sais pas pourquoi. Voici les messages et leurs résultats respectifs:

Tags                   Message
------                 -------
["_grokparsefailure"]  2014-04-04 20:14:11,613 TRACE c.g.w.MyJavaClass [pool-2- 
                       thread-6] message was null from https://domain.com/id-1/env-
                       MethodName

["ApplicationName"]    2014-04-04 20:14:11,960 TRACE c.g.w.MyJavaClass [pool-2-
                       thread-4] message was null from https://domain.com/id-1/stable-
                       MethodName

Celui avec ["ApplicationName"] a mes champs personnalisés de timestamp et level. Cependant, l'entrée avec ["_grokparsefailure"] n'a PAS mes champs personnalisés. Le plus étrange est que les journaux sont presque identiques, comme indiqué dans la colonne de message ci-dessus. Cela m'embrouille vraiment, mais je ne sais pas comment comprendre le problème ni comment le dépasser. Quelqu'un sait-il comment utiliser les journaux d'importation log4j dans logstash et obtenir les champs suivants de manière cohérente:

  • Niveau de journal
  • Horodatage
  • Message du journal
  • Nom de la machine
  • Thread

Merci pour toute aide que vous pouvez fournir. Même si je peux juste le niveau de journal, l'horodatage et le message de journal, ce serait une aide ÉNORME. Je l'apprécie sincèrement!

27
user3469584

Je recommande d'utiliser l'écouteur de socket log4j pour logstash et l'appender de socket log4j.

Logstash conf:

input {
  log4j {
    mode => server
    Host => "0.0.0.0"
    port => [logstash_port]
    type => "log4j"
  }
}
output {
  elasticsearch {
    protocol => "http"
    Host => "[myIpAddress]"
    port => "[myPort]"
  }
}

log4j.properties:

log4j.rootLogger=[myAppender]
log4j.appender.[myAppender]=org.Apache.log4j.net.SocketAppender
log4j.appender.[myAppender].port=[log4j_port]
log4j.appender.[myAppender].remoteHost=[logstash_Host]

Il y a plus d'informations dans les documents logstash pour leur entrée log4j: http://logstash.net/docs/1.4.2/inputs/log4j

25
ranxxerox

Il semble que la solution SocketAppender qui a été utilisée auparavant soit obsolète en raison d'un problème de sécurité. Actuellement, la solution recommandée consiste à utiliser log4j fileAppender, puis à transmettre le fichier via le plugin filebeat à logstash, puis à filtrer. Pour plus d'informations, vous pouvez consulter les liens ci-dessous:

https://www.elastic.co/blog/log4j-input-logstash

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html

1
Arijit B

Sur mon blog J'ai décrit comment envoyer des messages JSON à ElasticSearch puis les analyser avec GROK. Cliquez pour voir le billet de blog avec la description et Java exemple Dans le message, vous trouverez la description mais aussi un simple projet maven avec exemple (projet complet sur github).

J'espère que cela vous aide.

1
albgorski