Aller au contenu

logger-socket: Bibliothèque de Logger basée sur Raw-socket pour NGINX (basée sur nginx-module-lua)

Installation

Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

CentOS/RHEL 7 ou Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-logger-socket

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-logger-socket

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-logger-socket v0.1 publié le 18 février 2015.


Cette bibliothèque Lua est un module de journalisation à distance pour ngx_lua :

http://wiki.nginx.org/HttpLuaModule

Elle vise à remplacer le module standard de journalisation d'accès ngx_http_log_module de Nginx pour envoyer les journaux d'accès à un serveur distant via un socket non-bloquant. Un serveur de journalisation distant courant prenant en charge les sockets est syslog-ng.

Cette bibliothèque Lua tire parti de l'API cosocket de ngx_lua, qui garantit un comportement 100 % non-bloquant.

Synopsis

    server {
        location / {
            log_by_lua '
                local logger = require "resty.logger.socket"
                if not logger.initted() then
                    local ok, err = logger.init{
                        host = 'xxx',
                        port = 1234,
                        flush_limit = 1234,
                        drop_limit = 5678,
                    }
                    if not ok then
                        ngx.log(ngx.ERR, "échec de l'initialisation du logger : ",
                                err)
                        return
                    end
                end

                -- construire le message de journal d'accès personnalisé dans
                -- la variable Lua "msg"

                local bytes, err = logger.log(msg)
                if err then
                    ngx.log(ngx.ERR, "échec de l'enregistrement du message : ", err)
                    return
                end
            ';
        }
    }

Méthodes

Ce module de logger est conçu pour être partagé à l'intérieur d'un processus worker Nginx par toutes les requêtes. Actuellement, seul un serveur de journalisation distant est pris en charge. Nous pourrions prendre en charge le sharding de plusieurs serveurs de journalisation à l'avenir.

init

syntax: ok, err = logger.init(user_config)

Initialise le logger avec les configurations utilisateur. Ce logger doit être initialisé avant utilisation. Si vous ne l'initialisez pas, vous obtiendrez une erreur.

Les configurations utilisateur disponibles sont listées comme suit :

  • flush_limit

    Si la taille des messages mis en mémoire tampon plus la taille du message actuel atteint (>=) cette limite (en octets), les messages de journal mis en mémoire tampon seront écrits sur le serveur de journalisation. Par défaut, 4096 (4 Ko).

  • drop_limit

    Si la taille des messages mis en mémoire tampon plus la taille du message actuel est supérieure à cette limite (en octets), le message de journal actuel sera abandonné en raison de la taille limitée du tampon. La valeur par défaut de drop_limit est 1048576 (1 Mo).

  • timeout

    Définit le délai d'attente (en ms) pour les opérations suivantes, y compris la méthode connect. La valeur par défaut est 1000 (1 seconde).

  • host

    hôte du serveur de journalisation.

  • port

    numéro de port du serveur de journalisation.

  • path

    Si le serveur de journalisation utilise un socket de domaine unix de type stream, path est le chemin du fichier socket. Notez que host/port et path ne peuvent pas être tous deux vides. Au moins un doit être fourni.

  • max_retry_times

    Nombre maximal de tentatives de réessai après un échec de connexion à un serveur de journalisation ou un échec d'envoi de messages de journal à un serveur de journalisation.

  • retry_interval

    Le délai (en ms) avant de réessayer de se connecter à un serveur de journalisation ou de réessayer d'envoyer des messages de journal à un serveur de journalisation, par défaut 100 (0,1 s).

  • pool_size

    Taille du pool keepalive utilisée par sock:keepalive. Par défaut, 10.

  • max_buffer_reuse

    Nombre maximal de réutilisations du tampon de journalisation interne avant de créer un nouveau (pour éviter les fuites de mémoire).

  • periodic_flush

    Intervalle de vidage périodique (en secondes). Défini sur nil pour désactiver cette fonctionnalité.

  • ssl

    Booléen, activer ou désactiver la connexion via SSL. Par défaut, faux.

  • ssl_verify

    Booléen, activer ou désactiver la vérification de la correspondance de l'hôte et du certificat. Par défaut, vrai.

  • sni_host

    Définit le nom d'hôte à envoyer dans SNI et à utiliser lors de la vérification de la correspondance du certificat.

initted

syntax: initted = logger.initted()

Obtenez une valeur booléenne indiquant si ce module a été initialisé (en appelant la méthode init).

log

syntax: bytes, err = logger.log(msg)

Enregistre un message. Par défaut, le message de journal sera mis en mémoire tampon dans le module logger jusqu'à ce que flush_limit soit atteint, auquel cas le logger videra tous les messages mis en mémoire tampon vers le serveur de journalisation distant via un socket. bytes est le nombre d'octets qui ont été correctement mis en mémoire tampon dans le logger. Si bytes est nil, err est une chaîne décrivant le type d'erreur survenue cette fois. Si bytes n'est pas nil, alors err est un message d'erreur précédent. err peut être nil lorsque bytes n'est pas nil.

flush

syntax: bytes, err = logger.flush()

Vide immédiatement tous les messages mis en mémoire tampon vers le serveur distant. En général, vous n'avez pas besoin d'appeler cela manuellement car le vidage se produit automatiquement lorsque le tampon est plein.

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-logger-socket.