Configuration Logs ElasticSearch

De EjnTricks

Cet article présente la configuration de ces traces pour une installation de ElasticSearch.

Pour rappel, l'installation a été réalisée manuellement avec une externalisation du fichier de configuration.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Study icon.png Pré requis

La configuration des fichiers traces s'effectue à l'aide de deux fichiers dans le répertoire config. Le premier, elasticsearch.yml, permet de positionner des variables d'environnements. Le second, log4j2.properties contient la configuration de l'outil Log4J2.

Dans le cadre de cette installation, le répertoire config a été externalisé dans le répertoire /var/opt/elasticsearch/common.


Icon-Configuration-Settings.png Variables environnement

La première configuration à mettre en place concerne l'option path.logs dans la section Paths du fichier elasticsearch.yml. Il faut spécifier l'emplacement du répertoire où sont créés les fichiers traces. Afin de centraliser les logs, les fichiers seront placés dans le répertoire /var/log/elasticsearch.

#
# Path to log files:
#
#path.logs: /path/to/logs
path.logs: /var/log/elasticsearch

Il est nécessaire de préparer l'environnement.

#sudo mkdir /var/log/elasticsearch
#sudo chown elasticsearch:adm /var/log/elasticsearch
#sudo chmod o-rwx /var/log/elasticsearch

A noter, les permissions sont accordées au groupe adm comme cela est d'usage pour ce type de fichier sur une instance Linux.


Logo LOG4J.jpg Log4J2

ElasticSearch utilise le framework Log4J2 pour générer les traces d'exécution. La configuration s'effectue simplement à travers le fichier log4j2.properties dans le répertoire config.

La configuration standard permet de générer un ensemble de fichier.

  • CLUSTER.logCLUSTER est remplacé par le nom du cluster configuré, avec une rotation tous les 128 Mo et journalière;
  • CLUSTER_deprecation.logCLUSTER est remplacé par le nom du cluster configuré, avec une rotation tous les gigas;
  • CLUSTER_index_search_slowlog.logCLUSTER est remplacé par le nom du cluster configuré, avec une rotation journalière;
  • CLUSTER_index_indexing_slowlog.logCLUSTER est remplacé par le nom du cluster configuré, avec une rotation journalière;


Icon ACL.png Permission

L'objectif est d'avoir les permissions suivantes.

  • Lecture et écriture pour propriétaire;
  • Lecture pour le groupe;
  • Aucune pour les utilisateurs.

L'utilisation de Log4J2 permet de mettre en place ces sécurité à l'aide de l'élément de configuration filePermissions sur les appenders. Pour cela, il faut modifier le fichier log4j2.properties afin d'y ajouter des configurations du type suivant.

appender.<APPENDER_NAME>.filePermissions = rw-r-----

<APPENDER_NAME> est remplacé par le nom de l'appender cible.

Dans le cadre de cette installation, ils sont tous modifiés.

status = error

# log action execution errors for easier debugging
logger.action.name = org.elasticsearch.action
logger.action.level = debug

appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n

appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz
appender.rolling.filePermissions = rw-r-----
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size = 128MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.fileIndex = nomax
appender.rolling.strategy.action.type = Delete
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-*
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB

rootLogger.level = info
rootLogger.appenderRef.console.ref = console
rootLogger.appenderRef.rolling.ref = rolling

appender.deprecation_rolling.type = RollingFile
appender.deprecation_rolling.name = deprecation_rolling
appender.deprecation_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation.log
appender.deprecation_rolling.layout.type = PatternLayout
appender.deprecation_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n
appender.deprecation_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation-%i.log.gz
appender.deprecation_rolling.filePermissions = rw-r-----
appender.deprecation_rolling.policies.type = Policies
appender.deprecation_rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.deprecation_rolling.policies.size.size = 1GB
appender.deprecation_rolling.strategy.type = DefaultRolloverStrategy
appender.deprecation_rolling.strategy.max = 4

logger.deprecation.name = org.elasticsearch.deprecation
logger.deprecation.level = warn
logger.deprecation.appenderRef.deprecation_rolling.ref = deprecation_rolling
logger.deprecation.additivity = false

appender.index_search_slowlog_rolling.type = RollingFile
appender.index_search_slowlog_rolling.name = index_search_slowlog_rolling
appender.index_search_slowlog_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_search_slowlog.log
appender.index_search_slowlog_rolling.layout.type = PatternLayout
appender.index_search_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n
appender.index_search_slowlog_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_search_slowlog-%d{yyyy-MM-dd}.log
appender.index_search_slowlog_rolling.filePermissions = rw-r-----
appender.index_search_slowlog_rolling.policies.type = Policies
appender.index_search_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.index_search_slowlog_rolling.policies.time.interval = 1
appender.index_search_slowlog_rolling.policies.time.modulate = true

logger.index_search_slowlog_rolling.name = index.search.slowlog
logger.index_search_slowlog_rolling.level = trace
logger.index_search_slowlog_rolling.appenderRef.index_search_slowlog_rolling.ref = index_search_slowlog_rolling
logger.index_search_slowlog_rolling.additivity = false

appender.index_indexing_slowlog_rolling.type = RollingFile
appender.index_indexing_slowlog_rolling.name = index_indexing_slowlog_rolling
appender.index_indexing_slowlog_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_indexing_slowlog.log
appender.index_indexing_slowlog_rolling.layout.type = PatternLayout
appender.index_indexing_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n
appender.index_indexing_slowlog_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_indexing_slowlog-%d{yyyy-MM-dd}.log
appender.index_indexing_slowlog_rolling.filePermissions = rw-r-----
appender.index_indexing_slowlog_rolling.policies.type = Policies
appender.index_indexing_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.index_indexing_slowlog_rolling.policies.time.interval = 1
appender.index_indexing_slowlog_rolling.policies.time.modulate = true

logger.index_indexing_slowlog.name = index.indexing.slowlog.index
logger.index_indexing_slowlog.level = trace
logger.index_indexing_slowlog.appenderRef.index_indexing_slowlog_rolling.ref = index_indexing_slowlog_rolling
logger.index_indexing_slowlog.additivity = false


appender.audit_rolling.type = RollingFile
appender.audit_rolling.name = audit_rolling
appender.audit_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_access.log
appender.audit_rolling.layout.type = PatternLayout
appender.audit_rolling.layout.pattern = [%d{ISO8601}] %m%n
appender.audit_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_access-%d{yyyy-MM-dd}.log
appender.audit_rolling.filePermissions = rw-r-----
appender.audit_rolling.policies.type = Policies
appender.audit_rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.audit_rolling.policies.time.interval = 1
appender.audit_rolling.policies.time.modulate = true

logger.xpack_security_audit_logfile.name = org.elasticsearch.xpack.security.audit.logfile.LoggingAuditTrail
logger.xpack_security_audit_logfile.level = info
logger.xpack_security_audit_logfile.appenderRef.audit_rolling.ref = audit_rolling
logger.xpack_security_audit_logfile.additivity = false

logger.xmlsig.name = org.apache.xml.security.signature.XMLSignature
logger.xmlsig.level = error
logger.samlxml_decrypt.name = org.opensaml.xmlsec.encryption.support.Decrypter
logger.samlxml_decrypt.level = fatal
logger.saml2_decrypt.name = org.opensaml.saml.saml2.encryption.Decrypter
logger.saml2_decrypt.level = fatal


User-group-icon.png Nom groupe

Les fichiers de trace étant créés par le compte de démarrage du service, les permissions sont hérités de celui-ci. Or il n'existe pas d'option pour indiquer le groupe. Donc dans le cadre de cette installation, les permissions sont affectées à elasticsearch:elasticsearch, or il est souhaité que ce soit elasticsearch:adm.

La documentation de Log4J2 indique qu'il est possible d'effectuer ce paramétrage à l'aide de la propriété fileGroup, cf https://logging.apache.org/log4j/2.x/manual/appenders.html#FileAppender.

Cependant, cela ne semble pas fonctionner avec cette installation, et pour être homogène avec les autres produits de la suite ELK, la commande chmod est utilisée avec l'argument g+s sur le répertoire des traces.

#sudo chmod g+s /var/log/elasticsearch

Ainsi, les propriétés sont hérités lors de la création d'un nouveau fichier dans le répertoire /var/log/elasticsearch.


Java format icon.png JVM

Un autre type de trace est configuré pour le garbage collector de la JVM dans le fichier jvm.properties, dans le répertoire config de la distribution.

En fonction de la version utilisée, l'option loggc (version 8 de Java) ou log:gc (version 9) doit être modifiée. Seul le répertoire de stockage est modifié, avec l'emplacement /var/log/elasticsearch au lieu du sous répertoire logs de l'instance.

## JDK 8 GC logging

8:-XX:+PrintGCDetails
8:-XX:+PrintGCDateStamps
8:-XX:+PrintTenuringDistribution
8:-XX:+PrintGCApplicationStoppedTime
#8:-Xloggc:logs/gc.log
8:-Xloggc:/var/log/elasticsearch/gc.log
8:-XX:+UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m

# JDK 9+ GC logging
#9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
9-:-Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m
# due to internationalization enhancements in JDK 9 Elasticsearch need to set the provider to COMPAT otherwise
# time/date parsing will break in an incompatible way for some date patterns and locals
9-:-Djava.locale.providers=COMPAT

Warning-icon.png Attention contrairement aux configuration Log4J2, il n'est pas possible de spécifier des permissions sur ce fichier. Les droits seront alors ceux par défaut, soit 644.