Même s'il existe déjà une réponse acceptée, la solution semble ne pas être valide.
nginx a la directive log_format, qui a un contexte de http. Cela signifie que le log_format ne peut être (valide) que dans la section http {} du fichier de configuration, PAS dans les sections du serveur!
D'autre part, nous avons une si directive, qui a un contexte du serveur et l'emplacement.
nous ne pouvons pas utiliser « si » et « log_format » dans une section de serveur (ce qui est fait dans la solution retenue)
Ainsi, le si n'est pas utile ici, aussi si le mal (http://wiki.nginx.org/IfIsEvil)! Nous avons besoin de quelque chose qui travaille à contexte http parce que là, le log_format peut être définie d'une manière valable, et c'est le seul endroit en dehors du contexte du serveur, où nos hôtes virtuels sont définis ...
Heureusement, il y a une fonction carte dans nginx! map remappe certaines valeurs en nouvelles valeurs (accessibles dans les variables qui peuvent être utilisées dans une directive log_format). Et le bon message: Cela fonctionne aussi avec des expressions régulières.
Mettons donc nos adresses IPv4 et IPv6 en adresses anonymisées. Cela doit être fait en 3 étapes, car la carte ne peut pas accumuler les valeurs retournées, elle peut seulement renvoyer des chaînes ou des variables, pas une combinaison des deux. Donc, au début, nous récupérons la partie d'IP que nous voulons avoir dans les fichiers de log, la seconde carte renvoie la partie qui symbolise la partie anonymisée, et la troisième règle de carte les assemble à nouveau.
Voici les règles qui vont dans le contexte http {}:
map $remote_addr $ip_anonym1 {
default 0.0.0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" $ip;
"~(?P<ip>[^:]+:[^:]+):" $ip;
}
map $remote_addr $ip_anonym2 {
default .0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0;
"~(?P<ip>[^:]+:[^:]+):" ::;
}
map $ip_anonym1$ip_anonym2 $ip_anonymized {
default 0.0.0.0;
"~(?P<ip>.*)" $ip;
}
log_format anonymized '$ip_anonymized - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log anonymized;
Après avoir ajouté ceci à votre fichier de configuration nginx.conf, souvenez-vous de recharger votre nginx. Vos fichiers journaux doivent maintenant contenir des adresses IP anonymes, si vous utilisez le format de journal "anonymisé" (c'est le paramètre de format de la directive access_log).
connexes (apache): http://serverfault.com/q/343031/75968 – cweiske