1
votes

Spring Boot et ELK

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é.


1 commentaires

3 Réponses :


1
votes

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
  1. Actualisez le tableau de bord Kibana et commencez à voir le journal. Par défaut, l'index créé sera filebeat-*


4 commentaires

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é.



3
votes

Deux problèmes:

  1. Vous ne souhaitez pas analyser vos fichiers journaux. Parce que personne ne veut écrire d'expressions régulières pour l'analyse et que c'est sujet aux erreurs.
  2. Si vous avez une configuration de conteneur plus dynamique, vous ne souhaitez pas vous connecter aux fichiers car la configuration de tous les répertoires ou fichiers montés en liaison est un PITA.

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.


1 commentaires

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.



3
votes

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


0 commentaires