2. AU MENU
Les logs , pourquoi faire ?
Logger en java : comment, avec quoi
Coté système : syslog and friends
Centralisation des logs : les outils récents
3. APPROCHE TRADITIONNELLE
<ab>@l,vu pue ntoe lslg dn ~tma/tf/os?
bru al os ovz etyr e os as /octsuflg
<ab>o aueciia
bru n
n rtcl
<e> hm,j rgre
dv
mk e ead
4. POURQUOI ON PARLE PEU DES LOGS
Pas exactement glamour
Difficile à vendre aux clients, et donc au management
5. POURQUOI IL FAUDRAIT EN PARLER
Connaissance de l'usage d'une application
Connaissance de l'usage d'une plateforme
Détection d'anomalies
Et bien sûr debuggage
6. CE QU'ON ATTEND D'UN SYSTÈME DE LOGS
Collecte de messages issus de différentes sources
Normalisation des messages issus de ces sources
Accessibilité des messages
Simplification de la recherche d'information
7. CE QU'ON N'ATTEND PAS FORCÉMENT D'UN
SYSTÈME DE LOGS
Archivage pour raison légales
Stockage infini de fichiers
8. MAIS QU'EST-CE QU'UNE LOG ?
Un message émis par une application (donc par un
développeur)
Qui / Quand / Où / Quoi
11. PUIS VINRENT...
jdk-logging
Introduction d'un framework de logging dans le JDK 1.4
Peu de succès : API limitée, log levels non standards
commons-logging
Tentative de création d'une facade pour unifier des
implémentations différentes
Succès mitigé
12. POUR EN ARRIVER À SLF4J ET LOGBACK
Créés par ... Ceki Gülcü
slf4j
Successeur de commons-logging
Bindings pour les autres frameworks
logback
Successeur de log4j
13. LES RAISONS DE CHOISIR SLF4J
Approche "facade"
Bindings pour une intégration facile
sfjaijr #fcd
l4-p.a
aae
lgakcascjr#ipeetto
obc-lsi.a
mlmnain
lgakcr.a #ipeetto
obc-oejr
mlmnain
jloe-l4.a #rmlc cmoslgigjr
c-vrsfjjr
epae omn-ogn.a
lgjoe-l4.a #rmlc lgj
o4-vrsfjjr
epae o4
jlt-l4 #big jv.tllgig
u-osfj
rde aaui.ogn
14. LES RAISONS DE CHOISIR LOGBACK
Plus performant
Semble avoir une meilleure gestion de la concurrence
Configuration similaire à log4j
Format des messages à la StringFormat
15. LES RAISONS DE CHOISIR LOGBACK
Reload des configurations
Modularisation via des includes, des variables...
Gestion des conditions (if, else)
Gestion de la rotation
Gestion de la compression (bof)
19. NIVEAU DE LOG
CHOISIR LE BON LOG LEVEL N'EST PAS UNE OPTION
/ tu soy
/ re tr
lge.eu(Smti'vr bdhpee"
ogrdbg"oehn ey a apnd)
20. CONTENU DU MESSAGE
Donner un maximum de contexte : identifiants, contenu des
variables
Le MDC est là pour automatiser ça
#fle o itretr
itr r necpo
Srn ueI =gtsrdoeo(;
tig srd
eUeISmhw)
MCpt"srd,ueI)
D.u(ueI" srd;
#lgakpten
obc atr
%{srd
XueI}
21. CONTENU DU MESSAGE
Eviter les informations sensibles
Eviter les codes d'erreur ésotériques
lge.ro(Err00";
ogrerr"ro 04)
Ne pas oublier la stacktrace
lge.ro(Errwiedigsuf,e;
ogrerr"ro hl on tf" )
#v
s
lge.ro()
ogrerre;
22. PERFORMANCE
Eviter les logs dans des boucles
Conditionner les logs si construction de message complexe
i (ogriDbgnbe(){
f lge.seuEald)
lge.eu(Pitn {,{ ad{" vle,vle,vle)
ogrdbg"rnig } } n }, au1 au2 au3;
}
23. COMME TOUT CODE, LES LOGS SONT À REFACTORER
Après recette en dev
Après passage en prod
26. SYSLOG
Un protocole créé dans les années 80 pour gérer les logs
sendmail, puis unix
Utilisé pour écrire des logs sur disque, mais aussi pour
envoyer ces logs à d'autres machines
27. LES COMPOSANTES D'UN MESSAGE SYSLOG
Timestamp
Message
Hostname
Facility : 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
28. EXEMPLE DE MESSAGE SYSLOG
<8 CO Ot41:70 spotdg-e2189--(ot CD(c /& rnprs7> RN c
41:1 upr-iidv 30
ro) M
d
& u-at rpr /t/rnhul)
eot ecco.ory
29. SYSLOG AND FRIENDS
Les limitations du syslog originel ont donné lieu à des
implémentations concurrentes
D'abord syslog-ng
Puis rsyslog
30. EXEMPLE DE CONFIGURATION RSYSLOG
/t/sso.of
ecrylgcn
$oLa iusc #poie spotfrlclsse lgig
Mdod mxok
rvds upr o oa ytm ogn
$oLa iko
Mdod mlg #poie kre lgigspot(rvosydn b rlg)
rvds enl ogn upr peiul oe y kod
#Mdodimr #poie -MR- msaecpblt
$oLa mak
rvds -AK- esg aaiiy
#poie UPsso rcpin
rvds D ylg eeto
#Mdodiup
$oLa md
#UPevru 54
$DSreRn 1
$cinieealTmlt RYLGTaiinlieomt
AtoFlDfutepae SSO_rdtoaFlFra
$nldCni /t/sso./.of
Icueofg ecrylgd*cn
31. EXEMPLE DE CONFIGURATION RSYSLOG
/t/sso./0dfutcn
ecrylgd5-eal.of
#
#Frtsm sadr lgfls Lgb fclt.
is oe tnad o ie. o y aiiy
#
at,uhrv*
uhatpi.
/a/o/uhlg
vrlgat.o
**at,uhrvnn
.;uhatpi.oe
-vrlgsso
/a/o/ylg
#rn*
co.
/a/o/rnlg
vrlgco.o
#amn*
deo.
-vrlgdeo.o
/a/o/amnlg
kr.
en*
-vrlgkr.o
/a/o/enlg
#p.
lr*
-vrlglrlg
/a/o/p.o
mi.
al*
-vrlgmi.o
/a/o/allg
#sr*
ue.
-vrlgue.o
/a/o/srlg
34. OBJECTIFS DE LOGROTATE
Ne pas laisser les logs devenir trop volumineuses
Ne pas laisser s'accumuler les archives de logs
35. PRINCIPE DE LOGROTATE
Le script / t / r n d i y l g o a eest exécuté
ecco.al/ortt
tous les jours
Et traite par défaut toutes les configurations présentes dans
/t/ortt.
eclgoaed
36. EXEMPLE DE CONFIGURATION
/t/ortt./pce
eclgoaedaah2
/a/w//os*lg/a/o/pce/lg {
vrww*lg/.o vrlgaah2*o
diy
al
msigk
isno
dtet
aex
rtt 1
oae 0
mxg 1
aae 0
cmrs
opes
iepy
fmt
cet 64ro am
rae 4 ot d
saesrps
hrdcit
psrtt
otoae
i [- /a/u/pce.i ] te
f
f vrrnaah2pd ; hn
/t/ntdaah2rsat>/e/ul
ecii./pce etr
dvnl
f
i
edcit
nsrp
}
39. LOGSTASH
UN PIPELINE DE TRAITEMENT D'ÉVÈNEMENTS COMPOSÉ :
d'inputs : f l , s s o ...
ie ylg
de filtres et codecs : m l i i e g o , m t t ...
utln, rk uae
d'outputs : g a l g e a t c e r h l b a o
r y o , l s i s a c , i r t ...
Cela donne un système extrêmement souple
40. LOGSTASH : EXEMPLE D'INPUT
Tail d'un fichier sur disque
fl {
ie
tp = "yaah-ces
ye > m-pceacs"
pt = [/a/o/pce/yacs.o"
ah > "vrlgaah2m-ceslg]
ecue= [*g"
xld > ".z]
dbg= tu
eu > re
tg = [acs'
as > 'ces]
}
41. LOGSTASH : EXEMPLE DE FILTRE
Structuration d'un message avec g o
rk
go {
rk
tg = [acs'
as > 'ces]
#121..4-[9Ot21:64:9+20|yevrf|
7.902||0/c/020:80 00]msre.r
#43PS /pw/2gsinar HT/.|0|18570||12
4|OT d/sv/etonie TP112034|495-124
pten= "{PCEACS_ATR}
atr > %AAH_CESPTEN"
pten_i = "dt/t/osahaetpten."
atrsdr > /aaeclgts/gn/atrsd
}
Définition d'une pattern
AAH_CESPTEN%COEBAKT%PP}{OTcretsre}{IE
PCEACS_ATR {LS_RCE}{IE%HS:urn_evr%PP}
%ITpr}{IE%WR:eb %ETNEUIAHAA_RSA:eus}
{N:ot%PP}{ODvr} {XEDDRPTPRMO_TRrqet
HT/{UBRhtvrin%PP}{AHO_UBRrsos}{IE
TP%NME:tpeso}{IE%DS_RNME:epne%PP}
%DS_RNME:ye}{IE%DS_RNME:eus_ie
{AHO_UBRbts%PP}{AHO_UBRrqettm}
%PP}{AHO_UBRttlrqettm}{IE%DS_RWR:hSsind
{IE%DS_RNME:oa_eus_ie%PP}{AHO_ODppesoI}
%PP}{AHO_ODpd%PP}{NQEI:nqed
{IE%DS_RWR:i}{IE%UIU_DuiuI}
42. LOGSTASH : EXEMPLE DE FILTRE
Suppression d'un message avec g e
rp
ge {
rp
tg
as
= [acs'
> 'ces]
ngt = tu
eae > re
mth = ["msae,"iae/ ]
ac
>
@esg" /mgs"
}
43. LOGSTASH : EXEMPLE DE FILTRE
Modification d'un message avec m t t
uae
mtt {
uae
tg
as
gu
sb
}
= [ao_in]
> 'nnsg'
= [
>
"msae,
@esg"
"m/r?in(09-AZ+"
/yulsg=[-az-]),
"m/r?in<RVT>
/yulsg=PIAE"
]
44. LOGSTASH : EXEMPLE DE FILTRE
Recomposition d'une stacktrace avec m l i i e
utln
mliie{
utln
tp = "yjv-ye
ye > m-aatp"
pten= ""
atr > ^s
wa = "rvos
ht > peiu"
}
45. LOGSTASH : EXEMPLE D'OUTPUT
Envoi des logs vers graylog2 et vers la console
gl {
ef
hs = "ylgcletrcm
ot > m-o-olco.o"
tg = [acs'
as > 'ces]
lvl= "no
ee > if"
}
sdu {dbg= tu }
tot
eu > re
46. LOGSTASH : LES LIMITES
Refactoring fréquents, donc upgrades douloureux
Consommation CPU et mémoire
47. GRAYLOG2
UN SYSTÈME EN DEUX PARTIES
graylog2-server, un collecteur écrit en java
graylog2-web, une webapp rails
Le tout se base sur le format GELF
(attention gros changements à venir)
48. LE FORMAT GELF
UNE VERSION ENRICHIE ET SOUPLE DU FORMAT SYSLOG
{
"eso" "."
vrin: 10,
"ot:"w1,
hs" ww"
"hr_esg" "hr msae,
sotmsae: Sot esg"
"ulmsae:"akrc hrmr suf,
fl_esg" Bctae eennoe tf"
"ietm" 19892.1,
tmsap: 2199842
"ee" 1
lvl: ,
"aiiy:"amn-akn"
fclt" pyetbced,
"ie:"vrwwsmfl.b,
fl" /a/w/oeier"
"ie:36
ln" 5,
"ue_d:4,
_sri" 2
"smtiges" "o"
_oehn_le: fo
}
49. GRAYLOG2-SERVER
UN AGENT JAVA QUI :
récolte les logs qui lui sont envoyées (par logstash, une appli
java...)
les stocke dans une instance elasticsearch
50. GRAYLOG2-WEB
UNE WEBAPP QUI :
affiche tous les messages
permet une recherche multi-critères
dispose d'un mécanisme de permissions
permet d'explorer les données avec des requêtes libres
55. GRAYLOG2-WEB : LES LIMITES
Peu de problèmes applicatifs mais...
Migrations infernales
Changements technologiques fréquents
Recherche textuelle parfois déroutante pour l'utilisateur
56. EXEMPLE D'APPLICATION : SUIVI D'UNE
REQUÊTE
On veut pouvoir suivre une requête dans tous les système
de l'application
On va donc générer un identifiant unique pour cette
requête, et le faire passer de couche en couche
RqetedrstUIU_D%UIU_De
eusHae e NQEI {NQEI}
122.0.2|7.4011[4Ot21:90:0+20|
7.31110122..1|2/c/030:52 00]
scr.iiot.oa|4|E /sruigclbc=o.otrstaa
euedgpselcl43GT j/otn?alakfsRue.eDt
HT/.|0|1|36|36|hbqeh379vgeo1
TP11205114714733ug9sibbvvbt|
238UjswZQAIRcAA
57|mGKYWAB9tAAV
57. EXEMPLE D'APPLICATION : SUIVI D'UNE
REQUÊTE
Coté applicatif java, il faut pouvoir recevoir cet id sous
forme de header http, ou ampq
/ AQ
/ MP
MCpt"NQEI" msaegtedr(.e(UIU_D,Srn.ls);
D.u(UIU_D, esg.eHaes)gt"NQEI" tigcas)
/ o
/ u
/ HT
/ TP
MCptMCUIU,rqetgtedr"NQEI")
D.u(D_NQE eus.eHae(UIU_D);
Mais aussi le faire passer sous forme de header
Msaerprispoete =nwMsaerpris)
esgPoete rpris
e esgPoete(;
poete.eHae(UIU_D,MCgt"NQEI")
rprisstedr"NQEI" D.e(UIU_D);
dgpsebthidxr2/021-03:404[24][5km25v1vrr2u5
iiot-ac-nee 41/031:85.2 301 udkks1s2h30jo]
[27d7f7838503de13 [mcaYWAHpeAAu
f63dbdfa9e5fbe23] UjnwZQAADIAA]
[d1a27c082b47ac17 [ipesnTsEeuo-]IF
6560f84b9e9273a0] SmlAycakxctr1 NO
cmdgpsebthcr.o luce.eRlcrcnJbanhreoao:1o.iiot.ac.oejb anhrNweiTaigoLuceDcrtr5
Apnigt Nwei tascinteprmtr=301
pedn o eRlc rnato h aaee
24
61. COLLECTE : FLUME
“Flume is a distributed, reliable, and available
service for efficiently collecting, aggregating,
and moving large amounts of log data. It has a
simple and flexible architecture based on
streaming data flows. It is robust and fault
tolerant with tunable reliability mechanisms
and many failover and recovery mechanisms.
It uses a simple extensible data model that
allows for online analytic application.”
Créé chez Cloudera, donné à la fondation Apache
Orienté big data
Beaucoup plus souple que scribe
62. COLLECTE : FLUENTD
“Fluentd is a fully free and fully open-source
log collector that instantly enables you to have
a ‘Log Everything’ architecture with 125+
types of systems. Fluentd treats logs as JSON,
a popular machine-readable format. It is
written primarily in C with a thin-Ruby
wrapper that gives users flexibility.”
Créé chez TreasureData
Assez proche de logstash
Beaucoup d'inputs / outputs, peu de filtres
63. VISUALISATION : KIBANA
Projet indépendant, passé depuis sous l'ombrelle
elasticsearch
Se branche sur n'importe quel index elasticsearch
Une option à suivre, malgré quelques lacunes de sécurité