gestion des logs sur une plateforme web

64
GESTION DES LOGS SUR UNE PLATEFORME WEB

Upload: fredcons

Post on 20-Jun-2015

978 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Gestion des logs sur une plateforme web

GESTION DES LOGS SURUNE PLATEFORME WEB

Page 2: Gestion des logs sur une plateforme web

AU MENULes logs , pourquoi faire ?Logger en java : comment, avec quoiCoté système : syslog and friendsCentralisation des logs : les outils récents

Page 3: Gestion des logs sur une plateforme web

APPROCHE TRADITIONNELLE<barbu> @all, vous pouvez nettoyer les logs dans ~/tomcat/stuff/logs ?<barbu> on a une critical<dev> hmmk, je regarde

Page 4: Gestion des logs sur une plateforme web

POURQUOI ON PARLE PEU DES LOGSPas exactement glamourDifficile à vendre aux clients, et donc au management

Page 5: Gestion des logs sur une plateforme web

POURQUOI IL FAUDRAIT EN PARLERConnaissance de l'usage d'une applicationConnaissance de l'usage d'une plateformeDétection d'anomaliesEt bien sûr debuggage

Page 6: Gestion des logs sur une plateforme web

CE QU'ON ATTEND D'UN SYSTÈME DE LOGSCollecte de messages issus de différentes sourcesNormalisation des messages issus de ces sourcesAccessibilité des messagesSimplification de la recherche d'information

Page 7: Gestion des logs sur une plateforme web

CE QU'ON N'ATTEND PAS FORCÉMENT D'UNSYSTÈME DE LOGS

Archivage pour raison légalesStockage infini de fichiers

Page 8: Gestion des logs sur une plateforme web

MAIS QU'EST-CE QU'UNE LOG ?Un message émis par une application (donc par undéveloppeur)Qui / Quand / Où / Quoi

Page 9: Gestion des logs sur une plateforme web

LOGGER EN JAVA

Page 10: Gestion des logs sur une plateforme web

AU COMMENCEMENT ÉTAIT LOG4JCréé par Ceki GülcüUtilisé depuis 1823

Page 11: Gestion des logs sur une plateforme web

PUIS VINRENT...jdk-logging

Introduction d'un framework de logging dans le JDK 1.4Peu de succès : API limitée, log levels non standards

commons-loggingTentative de création d'une facade pour unifier desimplémentations différentesSuccès mitigé

Page 12: Gestion des logs sur une plateforme web

POUR EN ARRIVER À SLF4J ET LOGBACKCréés par ... Ceki Gülcüslf4j

Successeur de commons-loggingBindings pour les autres frameworks

logbackSuccesseur de log4j

Page 13: Gestion des logs sur une plateforme web

LES RAISONS DE CHOISIR SLF4JApproche "facade"Bindings pour une intégration facile

slf4j-api.jar # facadelogback-classic.jar # implementationlogback-core.jar # implementationjcl-over-slf4j.jar # remplace commons-logging.jarlog4j-over-slf4j.jar # remplace log4jjul-to-slf4j # bridge java.util.logging

Page 14: Gestion des logs sur une plateforme web

LES RAISONS DE CHOISIR LOGBACKPlus performantSemble avoir une meilleure gestion de la concurrenceConfiguration similaire à log4jFormat des messages à la StringFormat

Page 15: Gestion des logs sur une plateforme web

LES RAISONS DE CHOISIR LOGBACKReload des configurationsModularisation via des includes, des variables...Gestion des conditions (if, else)Gestion de la rotationGestion de la compression (bof)

Page 16: Gestion des logs sur une plateforme web

LOGBACK : MODULARISATION DES CONFIGS<included> <jmxConfigurator/> <property name="pattern" value="${origin} %d{dd/MM/yyyy-HH:mm:ss.SSS} [%X{pid}] [%X{phpSessionId}] [%X{userId}] [%X{uniqueId}] [%X{functionalId}] [%thread] %level %C:%L - %msg%n" scope ="context"/> <include resource="logback-appender-console.xml"/> <include resource="logback-appender-graylog.xml"/> <include resource="logback-appender-file.xml"/> <include resource="logback-custom-loggers.xml"/> <include resource="logback-root.xml"/></included>

Page 17: Gestion des logs sur une plateforme web

LOGBACK : GESTION DE CONDITIONS<included> <if condition="property("useFileLogger").equalsIgnoreCase("true")"> <then> <root level="INFO"> <appender-ref ref="FILE"> <appender-ref ref="GELF"> </appender-ref></appender-ref></root> </then> <else> <root level="INFO"> <appender-ref ref="STDOUT"> </appender-ref></root> </else> </if></included>

Page 18: Gestion des logs sur une plateforme web

INTERLUDE

QUELQUES BONNES PRATIQUES

Page 19: Gestion des logs sur une plateforme web

NIVEAU DE LOGCHOISIR LE BON LOG LEVEL N'EST PAS UNE OPTION

// true storylogger.debug("Somethin' very bad happened")

Page 20: Gestion des logs sur une plateforme web

CONTENU DU MESSAGEDonner un maximum de contexte : identifiants, contenu desvariablesLe MDC est là pour automatiser ça

# filter or interceptor String userId = getUserIdSomehow();MDC.put("userId", userId);

# logback pattern %X{userId}

Page 21: Gestion des logs sur une plateforme web

CONTENU DU MESSAGEEviter les informations sensiblesEviter les codes d'erreur ésotériques

logger.error("Error 0004");

Ne pas oublier la stacktrace

logger.error("Error while doing stuff", e);# vslogger.error(e);

Page 22: Gestion des logs sur une plateforme web

PERFORMANCEEviter les logs dans des bouclesConditionner les logs si construction de message complexe

if (logger.isDebugEnabled()) { logger.debug("Printing {}, {} and {}", value1, value2, value3);}

Page 23: Gestion des logs sur une plateforme web

COMME TOUT CODE, LES LOGS SONT À REFACTORERAprès recette en devAprès passage en prod

Page 24: Gestion des logs sur une plateforme web

LE DÉVELOPPEUR EST LE PREMIER RESPONSABLE DE LAQUALITÉ DES LOGS

Page 25: Gestion des logs sur une plateforme web

LES LOGS SYSTÈMEMessages système avec syslogNettoyage avec logrotate

Page 26: Gestion des logs sur une plateforme web

SYSLOGUn protocole créé dans les années 80 pour gérer les logssendmail, puis unixUtilisé pour écrire des logs sur disque, mais aussi pourenvoyer ces logs à d'autres machines

Page 27: Gestion des logs sur une plateforme web

LES COMPOSANTES D'UN MESSAGE SYSLOGTimestampMessageHostnameFacility : le composant système qui a envoyé le message (0 :kernel, 2 : mail, 16: local0...). FigéSeverity : de 0 (Emergency) à 7 (Debug)PRI (8 * Facility + Severity = useless)Le pid du process

Limité à de l'ASCII sur 1024 bytes

Page 28: Gestion des logs sur une plateforme web

EXEMPLE DE MESSAGE SYSLOG<78> CRON Oct 4 14:17:01 support-digi-dev2 13809 - - (root) CMD ( cd / && run-parts --

report /etc/cron.hourly)

Page 29: Gestion des logs sur une plateforme web

SYSLOG AND FRIENDSLes limitations du syslog originel ont donné lieu à desimplémentations concurrentesD'abord syslog-ngPuis rsyslog

Page 30: Gestion des logs sur une plateforme web

EXEMPLE DE CONFIGURATION RSYSLOG/etc/rsyslog.conf

$ModLoad imuxsock # provides support for local system logging$ModLoad imklog # provides kernel logging support (previously done by rklogd)#$ModLoad immark # provides --MARK-- message capability

# provides UDP syslog reception#$ModLoad imudp#$UDPServerRun 514

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

$IncludeConfig /etc/rsyslog.d/*.conf

Page 31: Gestion des logs sur une plateforme web

EXEMPLE DE CONFIGURATION RSYSLOG/etc/rsyslog.d/50-default.conf

## First some standard log files. Log by facility.#auth,authpriv.* /var/log/auth.log*.*;auth,authpriv.none -/var/log/syslog#cron.* /var/log/cron.log#daemon.* -/var/log/daemon.logkern.* -/var/log/kern.log#lpr.* -/var/log/lpr.logmail.* -/var/log/mail.log#user.* -/var/log/user.log

Page 32: Gestion des logs sur une plateforme web

EXEMPLE DE CONFIGURATION RSYSLOG/etc/rsyslog.d/99-graylog2.conf

$template Graylog2Output,"<%PRI%> %APP-NAME% %TIMESTAMP% %HOSTNAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n"$ActionForwardDefaultTemplate Graylog2Output *.* @log-collector.mydomain.local:514

Page 33: Gestion des logs sur une plateforme web

LOGROTATE

Page 34: Gestion des logs sur une plateforme web

OBJECTIFS DE LOGROTATENe pas laisser les logs devenir trop volumineusesNe pas laisser s'accumuler les archives de logs

Page 35: Gestion des logs sur une plateforme web

PRINCIPE DE LOGROTATELe script /etc/cron.daily/logrotate est exécutétous les joursEt traite par défaut toutes les configurations présentes dans/etc/logrotate.d

Page 36: Gestion des logs sur une plateforme web

EXEMPLE DE CONFIGURATION/etc/logrotate.d/apache2

/var/www/*/logs/*.log /var/log/apache2/*log { daily missingok dateext rotate 10 maxage 10 compress ifempty create 644 root adm sharedscripts postrotate if [ -f /var/run/apache2.pid ]; then /etc/init.d/apache2 restart > /dev/null fi endscript}

Page 37: Gestion des logs sur une plateforme web

LIMITES DE LOGROTATESystème de datation pas très souplePas le meilleur ami des applications java

Page 38: Gestion des logs sur une plateforme web

LA CENTRALISATION DESLOGS

Récolter / transformer : logstashStocker / afficher : graylog2, kibana, elasticsearch

Page 39: Gestion des logs sur une plateforme web

LOGSTASHUN PIPELINE DE TRAITEMENT D'ÉVÈNEMENTS COMPOSÉ :

d'inputs : file, syslog...de filtres et codecs : multiline, grok, mutate...d'outputs : graylog, elasticsearch, librato...

Cela donne un système extrêmement souple

Page 40: Gestion des logs sur une plateforme web

LOGSTASH : EXEMPLE D'INPUTTail d'un fichier sur disque

file { type => "my-apache-access" path => ["/var/log/apache2/my-access.log"] exclude => ["*.gz"] debug => true tags => ['access']}

Page 41: Gestion des logs sur une plateforme web

LOGSTASH : EXEMPLE DE FILTREStructuration d'un message avec grok

grok { tags => ['access'] # 172.19.0.24|-|[09/Oct/2012:06:48:09 +0200]|myserver.fr| # 443|POST /dp/ws/v2/gestionnaire HTTP/1.1|200|3148|547905|-|11224 pattern => "%{APACHE_ACCESS_PATTERN}" patterns_dir => "/data/etc/logstash/agent/patterns.d" }

Définition d'une pattern

APACHE_ACCESS_PATTERN %{CLOSE_BRACKET}%{PIPE}%{HOST:current_server}%{PIPE}%{INT:port}%{PIPE}%{WORD:verb} %{EXTENDEDURIPATHPARAM_OR_STAR:request}HTTP/%{NUMBER:httpversion}%{PIPE}%{DASH_OR_NUMBER:response}%{PIPE}%{DASH_OR_NUMBER:bytes}%{PIPE}%{DASH_OR_NUMBER:request_time}%{PIPE}%{DASH_OR_NUMBER:total_request_time}%{PIPE}%{DASH_OR_WORD:phpSessionId}%{PIPE}%{DASH_OR_WORD:pid}%{PIPE}%{UNIQUE_ID:uniqueId}

Page 42: Gestion des logs sur une plateforme web

LOGSTASH : EXEMPLE DE FILTRESuppression d'un message avec grep

grep { tags => ['access'] negate => true match => [ "@message", "/images/" ]}

Page 43: Gestion des logs sur une plateforme web

LOGSTASH : EXEMPLE DE FILTREModification d'un message avec mutate

mutate { tags => ['anon_sign'] gsub => [ "@message", "/my/url?sign=([0-9a-zA-Z]+)", "/my/url?sign=<PRIVATE>" ]}

Page 44: Gestion des logs sur une plateforme web

LOGSTASH : EXEMPLE DE FILTRERecomposition d'une stacktrace avec multiline

multiline { type => "my-java-type" pattern => "̂\s" what => "previous"}

Page 45: Gestion des logs sur une plateforme web

LOGSTASH : EXEMPLE D'OUTPUTEnvoi des logs vers graylog2 et vers la console

gelf { host => "my-log-collector.com" tags => ['access'] level => "info"}

stdout { debug => true }

Page 46: Gestion des logs sur une plateforme web

LOGSTASH : LES LIMITESRefactoring fréquents, donc upgrades douloureuxConsommation CPU et mémoire

Page 47: Gestion des logs sur une plateforme web

GRAYLOG2UN SYSTÈME EN DEUX PARTIES

graylog2-server, un collecteur écrit en javagraylog2-web, une webapp railsLe tout se base sur le format GELF

(attention gros changements à venir)

Page 48: Gestion des logs sur une plateforme web

LE FORMAT GELFUNE VERSION ENRICHIE ET SOUPLE DU FORMAT SYSLOG{ "version": "1.0", "host": "www1", "short_message": "Short message", "full_message": "Backtrace here\n\nmore stuff", "timestamp": 1291899928.412, "level": 1, "facility": "payment-backend", "file": "/var/www/somefile.rb", "line": 356, "_user_id": 42, "_something_else": "foo"}

Page 49: Gestion des logs sur une plateforme web

GRAYLOG2-SERVERUN AGENT JAVA QUI :

récolte les logs qui lui sont envoyées (par logstash, une applijava...)les stocke dans une instance elasticsearch

Page 50: Gestion des logs sur une plateforme web

GRAYLOG2-WEBUNE WEBAPP QUI :

affiche tous les messagespermet une recherche multi-critèresdispose d'un mécanisme de permissionspermet d'explorer les données avec des requêtes libres

Page 51: Gestion des logs sur une plateforme web

VU DE HAUT CA DONNE

© http://www.graylog2.org/

Page 52: Gestion des logs sur une plateforme web

GRAYLOG2-WEB : LISTE DES MESSAGES

Page 53: Gestion des logs sur une plateforme web

GRAYLOG2-WEB : DÉTAIL D'UN MESSAGE

Page 54: Gestion des logs sur une plateforme web

GRAYLOG2-WEB : CONFIGURATION LOGBACK<appender name="GELF" class="me.moocar.logbackgelf.GelfAppender"> <facility>logback-gelf</facility> <graylog2serverhost>${graylogHost}</graylog2serverhost> <graylog2serverport>12201</graylog2serverport> <useloggername>true</useloggername> <usethreadname>true</usethreadname> <graylog2serverversion>0.9.6</graylog2serverversion> <chunkthreshold>1000</chunkthreshold> <messagepattern>%m%rEx</messagepattern> <additionalfield>pid:_pid</additionalfield> <additionalfield>origin:_origin</additionalfield> <additionalfield>userId:_userId</additionalfield> <additionalfield>uniqueId:_uniqueId</additionalfield> <additionalfield>phpSessionId:_phpSessionId</additionalfield> </appender>

Page 55: Gestion des logs sur une plateforme web

GRAYLOG2-WEB : LES LIMITESPeu de problèmes applicatifs mais...Migrations infernalesChangements technologiques fréquentsRecherche textuelle parfois déroutante pour l'utilisateur

Page 56: Gestion des logs sur une plateforme web

EXEMPLE D'APPLICATION : SUIVI D'UNEREQUÊTE

On veut pouvoir suivre une requête dans tous les systèmede l'applicationOn va donc générer un identifiant unique pour cetterequête, et le faire passer de couche en couche

RequestHeader set UNIQUE_ID %{UNIQUE_ID}e

172.23.101.120|172.24.0.111|[24/Oct/2013:09:05:20 +0200]|secure.digiposte.local|443|GET /js/routing?callback=fos.Router.setData HTTP/1.1|200|511|13467|13467|3h3buqge9hs3i7b9bvvgvebot1|25378|UmjGsKwYZWQAABI9RtcAAAAV

Page 57: Gestion des logs sur une plateforme web

EXEMPLE D'APPLICATION : SUIVI D'UNEREQUÊTE

Coté applicatif java, il faut pouvoir recevoir cet id sousforme de header http, ou ampq

// AMQPMDC.put("UNIQUE_ID", message.getHeaders().get("UNIQUE_ID", String.class)); // ou// HTTPMDC.put(MDC_UNIQUE, request.getHeader("UNIQUE_ID"));

Mais aussi le faire passer sous forme de header

MessageProperties properties = new MessageProperties();properties.setHeader("UNIQUE_ID", MDC.get("UNIQUE_ID"));

digiposte-batch-indexer 24/10/2013-10:38:54.024 [32041] [u5dkkmk2s51vs12vhr3r02juo5][f2673dd7bfd7f8a398e550f3bdee2133] [UmjcnawYZWQAAHApDeIAAAAu] [6d516a02f78c40b892eb94277a3ca107] [SimpleAsyncTaskExecutor-1] INFO com.digiposte.batch.core.job launcher.NewRelicTracingJobLauncherDecorator:51 - Appending to NewRelic transaction the parameter = 32041

Page 58: Gestion des logs sur une plateforme web

(TENTATIVE DE DÉMO GRAYLOG2)

Page 59: Gestion des logs sur une plateforme web

CENTRALISATION DES LOGS : LES AUTRESOPTIONS

SAASSystèmes de collecteSystèmes de visualisation

Page 60: Gestion des logs sur une plateforme web

SAAS : LES ACTEURSSplunkPapertrailLoggly

Page 61: Gestion des logs sur une plateforme web

COLLECTE : FLUME“Flume is a distributed, reliable, and availableservice for efficiently collecting, aggregating,

and moving large amounts of log data. It has asimple and flexible architecture based on

streaming data flows. It is robust and faulttolerant with tunable reliability mechanismsand many failover and recovery mechanisms.

It uses a simple extensible data model thatallows for online analytic application.”

Créé chez Cloudera, donné à la fondation ApacheOrienté big dataBeaucoup plus souple que scribe

Page 62: Gestion des logs sur une plateforme web

COLLECTE : FLUENTD“Fluentd is a fully free and fully open-source

log collector that instantly enables you to havea ‘Log Everything’ architecture with 125+

types of systems. Fluentd treats logs as JSON,a popular machine-readable format. It iswritten primarily in C with a thin-Ruby

wrapper that gives users flexibility.”

Créé chez TreasureDataAssez proche de logstashBeaucoup d'inputs / outputs, peu de filtres

Page 63: Gestion des logs sur une plateforme web

VISUALISATION : KIBANAProjet indépendant, passé depuis sous l'ombrelleelasticsearchSe branche sur n'importe quel index elasticsearchUne option à suivre, malgré quelques lacunes de sécurité

Page 64: Gestion des logs sur une plateforme web

QUESTIONS ?