Bonjour,
Je teste depuis deux jours la solution Logs Data Platform afin d'y traiter des logs d'accès issues d'un serveur Apache.
J'ai configuré le forward des logs via syslog-ng en TCP 6514 en suivant le tuto. Jusqu'ici tout est ok et je réceptionne bien les données dans Graylog.
Cependant je rencontre des problèmes de parsing.
Coté syslog-ng j'envoi mes logs avec le format suivant :
> Apr 18 15:32:36 - - [18/Apr/2017:15:32:35 +0000] "POST /?module=fileman&page=login&action=login HTTP/1.1" 200 440 "http://URL/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
Coté Graylog je réceptionne avec le parsing suivant :
> timestamp : Apr 18 15:32:36
> source : mon_serveur_web
> application_name : remote_ip
> message : - - [18/Apr/2017:15:32:35 +0000] "POST /?module=fileman&page=login&action=login HTTP/1.1" 200 440 "http://URL/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
En gros tout le contenu de ma log se trouve dans le champ "message" (à l’exception du champ timestamp, source et application_name). J'ai essayé de modifier le "FormatLog" de mon serveur Apache mais sans grand succès…
Quelqu'un pourrait m'indiquer la marche à suivre ?
Merci
Bonjour @Jean-MarcM,
Merci pour l'intérêt que vous portez à Logs Data Platform.
Je vous invite à tester en (quick win) cette approche
https://docs.ovh.com/gb/en/mobile-hosting/logs-data-platform/apache-logs/
Et en prod, celle-ci https://docs.ovh.com/gb/en/mobile-hosting/logs-data-platform/filebeat-logs/
Cordialement,
Bonjour,
Merci pour votre retour. J'avais déjà voulu tester la première solution mais que ce soit via la configuration globale ou via le virtual host j'ai une erreur lors du redémarrage du service Apache =>
> Apr 19 09:29:53 ip-172-31-17-255 apache2[29059]: AH00526: Syntax error on line 1 of /etc/apache2/conf-enabled/ldp.conf:
> Apr 19 09:29:53 ip-172-31-17-255 apache2[29059]: LogFormat takes 1-2 arguments, a log format string (see docs) and an optional format name
> Apr 19 09:29:53 ip-172-31-17-255 apache2[29059]: Action 'configtest' failed.
Bonjour @Jean-MarcM,
La documentation a une typo concernant la date que nous allons corriger au plus vite.
Le format suivant fonctionne:
> LogFormat "X-OVH-TOKEN:XXXXXXXXXXXXXXX\tdomain:%V\thost:%h\tserver:%A\ttime:%{sec}t\tident:%l\tuser:%u\tmethod:%m\tpath:%U%q\tprotocol:%H\tstatus_int:%>s\tsize_int:%b\treferer:%{Referer}i\tagent:%{User-Agent}i\tresponse_time_int:%D\tcookie:%{cookie}i\tset_cookie:%{Set-Cookie}o\tmessage:%h %l %u %t "%r" %>s %b\n" combined_ltsv
Par ailleurs si vous l'utilisez globalement, assurez vous que vos vhosts ne déclare pas déjà un CustomLog, car celui ci aura la préférence du système.
Cordialement,
Bonjour,
Merci en effet cela fonctionne avec ce format et je retrouve bien mes logs correctement parsé dans Graylog.
Cependant pour mes serveurs de prod je ne peux pas modifier les fichiers de configuration Apache. Les logs des différents serveurs sont centralisés sur un syslog-ng. Comment puis-je obtenir la même chose ? (comme précisé dans mon premier post lorsque je forward mes logs via syslog celle-ci ne sont pas parsés et j'ai uniquement le champ "message")
De mon coté j'ai configuré syslog-ng en suivant le modèle suivant :
https://docs.ovh.com/gb/en/mobile-hosting/logs-data-platform/how-to-log-your-linux/
Merci pour votre aide.
Bonjour @Jean-MarcM,
Plusieurs solutions sont possibles:
- Utiliser un template syslog-ng pour transformer le message en log structuré RFC5424 puis pousser sur le port ad hoc (6514 tls ou 514)
- Envoyer le message brut à un logstash hebergé par nos soins avec du syslog en entrée et un grok (voir COMBINEDAPACHELOG)
Nous proposons un wizard sur les outils de collecte pour le lancer rapidement:
https://community.ovhcloud.com/t/52046
Ok merci. Oui en effet la solution Logstach sera certainement envisagé si la solution est retenue et que nous passons à une offre pro.
Pour syslog-ng avez-vous des exemples de template Apache ?
Cela dépend fortement de votre version de syslog, du type et des formats custom éventuels adoptés.
Syslog-ng propose un parser de log apache documenté ici:
https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/apache-access-log-parser.html
En interne on préfère formater en LTSV (moins contraignant que RFC5424) pour s'adresser à Logs Data Platform.
Un exemple de template LTSV à adapter pour votre cas :
template t_apache_access_log {
template("type:web\tX-OVH-TOKEN:XXXXXXXXXXXXXXX\ttime:${APACHE.TIMESTAMP}\thost:${HOST}\tremote_ip:${APACHE.REMOTE_IP}\tdomain:${APACHE.HOST}\trequest_id:${APACHE.REQUEST_ID}\trequest:${APACHE.REQUEST}\tstatus_code:${APACHE.STATUS_CODE}\treponse_size:${APACHE.REPONSE_SIZE}\treferer:${APACHE.REFERER}\tuser_agent:${APACHE.USER_AGENT}\tcookie:${APACHE.COOKIE}\tmessage:${MSG}\n");
template_escape(no);
};
Un exemple de destination
destination dt_apache_access_ldp {
tcp("XXX.logs.ovh.com"
port(12201) tls(peer-verify("optional-untrusted"))
ts_format("rfc3339") template(t_apache_access_log)
keep-alive(yes)
so_keepalive(yes)
log-fifo-size(30000)
);
};
Et la pipeline de destination
log {
source(XXXXXXXXXXXXX);
# parser(XXXXXXXXXXXXX);
destination(dt_apache_access_ldp);
};
Votre cas fera sûrement l'objet d'un nouveau guide, mais pas d'ETA pour l'instant.
Bonjour et merci !
Je viens de tester et la conf LTSV pour syslog-ng et ça semble ok. Je vois bien mes logs partir vers la plateforme avec TCPdump mais par contre rien n'arrive dans mon Graylog ![]()
Voyez-vous quelque chose de votre coté ?
J'ai finalement trouvé la solution en me basant sur votre template LTSV et utilisant le module csvparser de syslog-ng.
Voici mon fichier de configuration final :
> source s_apache {
> file("/var/log/apache2/access.log" flags(no-parse));
> };
> template t_apache_access_log {
> template("type:apache-access.log\tX-OVH-TOKEN:XXXXXXXXXXXXXXXX\ttime:${APACHE.TIMESTAMP}\thost:${HOST}\tremote_ip:${APACHE.CLIENT_IP}\trequest:${APACHE.REQUEST_URL}\tstatus_code:${APACHE.REQUEST_STATUS}\treponse_size:${APACHE.CONTENT_LENGTH}\treferer:${APACHE.REFERER}\tuser_agent:${APACHE.USER_AGENT}\tmessage:${MSG}\n");
> template_escape(no);
> };
> destination dt_apache_access_ldp {
> tcp("XXX.logs.ovh.com"
> port(12201) tls(peer-verify("optional-untrusted"))
> ts_format("rfc3339") template(t_apache_access_log)
> keep-alive(yes)
> so_keepalive(yes)
> log-fifo-size(30000)
> );
> };
> parser p_apache {
> csv-parser(columns("APACHE.CLIENT_IP", "APACHE.IDENT_NAME", "APACHE.USER_NAME",
> "APACHE.TIMESTAMP", "APACHE.REQUEST_URL", "APACHE.REQUEST_STATUS",
> "APACHE.CONTENT_LENGTH", "APACHE.REFERER", "APACHE.USER_AGENT")
> flags(escape-double-char,strip-whitespace)
> delimiters(" ")
> quote-pairs('""')
> );
> };
> log {
> source(s_apache);
> parser (p_apache);
> destination(dt_apache_access_ldp);
> };
Merci pour votre aide. J'espère que ça pourras servir à d'autres !