nginx:logging-nginx

Ceci est une ancienne révision du document !


Stocker les logs Nginx en base de données

Installer syslog-ng et libdbd-mysql.

Créer un utilisateur MySQL et une base de données. Y créer la table suivante:

CREATE TABLE access_log (
   id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
   unixtime INT UNSIGNED,
   YEAR YEAR(4),
   MONTH INT,
   DAY INT,
   fulldate TIMESTAMP,
   remote_addr VARCHAR(50),
   remote_user VARCHAR(100),
   host VARCHAR(100),
   request_method VARCHAR(20),
   request_uri VARCHAR(2048),
   STATUS VARCHAR(10),
   body_bytes_send INT UNSIGNED,
   request_time FLOAT,
   http_referrer VARCHAR(2048),
   http_user_agent VARCHAR(500),
   http_x_forwareded_for VARCHAR(50),
   INDEX index_access_log_unixtime(unixtime),
   INDEX index_access_log_month(MONTH),
   INDEX index_access_log_day(DAY)
);

Spécifier le format des logs dans /etc/nginx/nginx.cong:

http {
    log_format  main '$remote_addr $remote_user [$time_local] "$host" $request_method "$request_uri" '
                     '$status $body_bytes_sent $request_time "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
}

Il faut ensuite que toutes les directives access_log soient du format:

access_log /path/log main;

Redémarrer Nginx.

Créer le fichier /etc/syslog-ng/conf.d/nginx.conf:

source s_nginx {
    # il est possible de spécifier plusieurs fichiers, juste dupliquer la ligne suivante:
    file("/var/log/nginx/access.log" flags(no-parse));
};
 
parser p_nginx {
    csv-parser(
       columns("REMOTE_ADDR", "REMOTE_USER", "TIME_LOCAL", "$HTTP_HOST", "REQUEST_METHOD", "REQUEST_URI", 
               "STATUS", "BODY_BYTES_SEND", "REQUEST_TIME", 
               "HTTP_REFERER","HTTP_USER_AGENT", "HTTP_X_FORWARDED_FOR")
       flags(escape-double-char,strip-whitespace)
       delimiters(" ")
       quote-pairs('""[]')
     );
};
 
destination d_sql {
      sql(
          type(mysql)
          host("localhost")
          port(3306)
          username("nginx")
          password("yourpassword")
          database("nginx_logs")
          table("access_log")
          columns("id int unsigned auto_increment primary key",
                  "unixtime int unsigned",
                  "year year(4)",
                  "month int",
                  "day int",
                  "fulldate timestamp",
                  "remote_addr varchar(50)",
                  "remote_user varchar(100)",
                  "host varchar(100)",
                  "request_method varchar(20)",
                  "request_uri varchar(2048)",
                  "status varchar(10)",
                  "body_bytes_send int unsigned",
                  "request_time float",
                  "http_referrer varchar(2048)",
                  "http_user_agent varchar(500)",
                  "http_x_forwareded_for varchar(50)")
          values(default,"${UNIXTIME}", "${YEAR}", "${MONTH}", "${DAY}", "${YEAR}-${MONTH}-${DAY} ${HOUR}-${MIN}-${SEC}",
               "${REMOTE_ADDR}","${REMOTE_USER}","${HTTP_HOST}","${REQUEST_METHOD}","${REQUEST_URI}",
               "${STATUS}","${BODY_BYTES_SEND}","${REQUEST_TIME}",
               "${HTTP_REFERER}","${HTTP_USER_AGENT}","${HTTP_X_FORWARDED_FOR}")
          indexes("unixtime")
          indexes("month")
          indexes("day")
          null("-")
        );
};
 
log { source(s_nginx); parser(p_nginx); destination(d_sql); };

Arrêter syslog-ng.

Tester que tout va bien avec la commande suivante:

syslog-ng -Fvde

Redémarrer syslog-ng.

  • nginx/logging-nginx.1616186756.txt.gz
  • Dernière modification : 2021/04/04 17:01
  • (modification externe)