J'ai une série de microservices créés à l'aide de Spring Boot en tant que conteneurs docker avec docker-compose. Je souhaite centraliser les fichiers journaux, je pense donc à utiliser ELK (s'exécutant dans un autre conteneur). Comment obtenir les fichiers journaux des conteneurs Docker basés sur Spring Boot vers ELK, sont-ils poussés des conteneurs vers ELK ou vice versa?
Tout exemple de configuration ou de bibliothèques récentes serait très apprécié.
3 Réponses :
Vous pouvez envoyer des données d'une source à ELK à l'aide de Data Collector.
L'une d'entre elles est Filebeat
Supposons que vous ayez une application Spring-boot s'exécutant sur Ubuntu Server.
Supposons que vous ayez configuré votre application pour stocker le journal dans le dossier / home / user / log /.
Maintenant, pour envoyer ces données de journal à ELK.
1. Vous devez installer Filebeat
Harvesting Data from your log path.
Plus de détails ici
2. Ouvrez Filebeat conf et ajoutez votre emplacement de journal.
sudo filebeat -e
changez l'adresse IP pour ELK dans la section Elastic / Logstash et Kibana du même fichier.
Remarque: vous pouvez activer la sortie vers Elastic ou Logstash afin de décommenter n'importe quelle section. Je suggérerais d'essayer d'abord l'élastique.
3. Démarrez Filebeat pour envoyer le journal.
Remarque: Le serveur ELK doit être opérationnel et accessible depuis votre serveur Spring Boot.
Pour commencer
sudo nano /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true // enable this paths: - /var/log/*.log - /home/user/log/*.log // add your log path
Si tout va bien, vous devriez voir le journal filebeat disant
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.6.0-amd64.deb sudo dpkg -i filebeat-6.6.0-amd64.deb
filebeat-*
Un grand merci pour l'information, je vais essayer de configurer cela. J'ai une question, j'exécute mes applications Spring Boot dans des conteneurs Docker. Dois-je ajouter filebeat à chaque conteneur ou devrais-je avoir filebeat comme conteneur séparé sur chaque hôte. Je prévois d'exécuter cette image de docker ELK séparément pour que filebeat l'envoie.
Cela dépend de l'exigence. Si vous pouvez collecter tous les journaux de conteneurs de démarrage de printemps à un emplacement en utilisant un fichier. Mais à long terme, je suggérerais d'avoir un fichier au niveau du conteneur pour éviter un seul point de défaillance.
C'est un bon point de départ, mais il présente deux problèmes: tout d'abord, le message de journal entier est juste une chaîne et vous ne pouvez pas agréger ou filtrer sur les niveaux de journal ou d'autres champs; vous devez analyser le message du journal. Deuxièmement, les journaux multilignes comme les stacktraces seront décomposés ligne par ligne (ce qui les rend pratiquement inutiles).
Merci, @xeraa pour l'avoir signalé. Même moi, j'ai été confronté à un problème que vous avez mentionné.
Deux problèmes:
Pour résoudre le premier problème, ajoutez un ajout de journal pour vous connecter au JSON. J'utilise Logback ici et vous devrez ajouter la dépendance net.logstash.logback: logstash-logback-encoder
:
filebeat.autodiscover: providers: - type: docker
Ensuite, vous peut collecter ce fichier et l'envoyer à Elasticsearch; tous les champs seront bien extraits et vos instructions de journal multilignes (comme les stacktraces) ne seront pas non plus brisées:
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %logger{36} [%thread] - %mdc - %msg %n</pattern> <charset>utf8</charset> </encoder> </appender>
Le deuxième problème est un peu plus délicat. J'utiliserais le journal JSON par défaut fourni par Docker, afin que votre application Java puisse simplement se connecter à la console:
filebeat.inputs: # Collect the JSON log files from the Spring Boot apps - type: log paths: - /var/log/apps/*.json json.keys_under_root: true json.add_error_key: true output.elasticsearch: hosts: ["{{ elasticsearch_host }}"]
Filebeat peut alors collecter automatiquement tous les journaux Docker (Filebeat va besoin d'avoir accès à / var / lib / docker / containers: / var / lib / docker / containers: ro
pour que cela fonctionne):
<appender name="json" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH:-.}/your-app-name.json</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>your-app-name.json.%d{yyyy-MM-dd}.gz</fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <mdc/> <timestamp> <timeZone>UTC</timeZone> </timestamp> <pattern> <pattern> { "log.level": "%level", "service.name": "${springAppName:-}", "process.pid": "${PID:-}", "thread": "%thread", "class": "%logger", "mdc": "%mdc", "message": "%message" } </pattern> </pattern> </providers> </encoder> </appender>
Pour éviter le problème d'analyse dans la première partie, vous devez en fait enregistrer JSON sur la console, puis le collecter.
assez bons points ... Je crois honnêtement que l'utilisation d'un appender est bien meilleure que d'écrire le fichier sur le disque et d'avoir à configurer la détection automatique des battements de fichiers.
Vous pouvez utiliser l'architecture ci-dessous,
Application de démarrage de printemps -> Kafka -> ELK
Pour cette architecture, 1. Configurez un appender Kafka sur le fichier xml Log4j. Ensuite, les journaux sont automatiquement poussés vers une rubrique Kafka. 2. Configurez la configuration de Log-stash en tant qu'abonné sur le sujet Kafka. 3. De plus, vous pouvez utiliser des filtres sur Log-stash.
ref: https://www.devglan.com / apache-kafka / stream-log4j-logs-to-kafka
Cela aiderait: logz.io/blog/docker-logging