Sådan konfigureres brugerdefinerede adgangs- og fejllogformater i Nginx
Nginx HTTP-server har en fænomenal logningsfacilitet, som er meget tilpasselig. I denne artikel vil vi forklare, hvordan du konfigurerer dine egne formater til adgangs- og fejllogfiler til Nginx i Linux.
Målet med denne vejledning er at hjælpe dig med at forstå, hvordan logfiler genereres, således at konfigurere brugerdefinerede logformater med henblik på fejlfinding, fejlfinding eller analyse af, hvad der udfolder sig inden på din webserver samt webapplikationer (såsom sporingsanmodninger).
Denne artikel er lavet af tre sektioner, der vil oplyse dig om konfiguration af adgangs-/fejllogfiler, og hvordan du aktiverer betinget logføring i Nginx.
Konfiguration af adgangslogfiler i Nginx
Under Nginx gendannes alle klientanmodninger til serveren i adgangsloggen i et bestemt format ved hjælp af modulet ngx_http_log_module.
Standardlogfilen er log/access.log (normalt/var/log/nginx/access_log på Linux-systemer), og standardformatet til logning er normalt det kombinerede eller hovedformat (dette kan variere fra en distro til en anden).
Access_log-direktivet (anvendeligt i http, server, placering, hvis det er i placering og grænse undtagen kontekst) bruges til at indstille logfilen, og log_format-direktivet (gælder kun under http-konteksten) bruges til at indstille logformatet. Logformatet er beskrevet af almindelige variabler og variabler, der kun genereres på det tidspunkt, hvor en log er skrevet.
Syntaksen til konfiguration af et logformat er:
log_format format_name 'set_of_variables_to_define_format';
og syntaksen til konfiguration af adgangslog er:
access_log /path/to/log_file format_name; #simplest form OR access_log /path/to/log_file [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
Følgende er et uddrag fra standard Nginx-konfigurationsfilen /etc/nginx/nginx.conf på CentOS 7.
http { #main log format log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log; }
Dette logformat giver følgende logindgang.
127.0.0.1 - dbmanager [20/Nov/2017:18:52:17 +0000] "GET / HTTP/1.1" 401 188 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"
Følgende er et andet nyttigt logningsformat, som vi bruger til at spore anmodninger til vores webapplikationer ved hjælp af nogle af standardvariablerne, det vigtigste har anmodnings-id'et og logger klientplaceringsoplysninger (land, landekode, region og by).
log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_x_forwarded_for" $request_id ' '$geoip_country_name $geoip_country_code ' '$geoip_region_name $geoip_city ';
Du kan bruge det på denne måde:
access_log /var/log/nginx/access.log custom;
Dette vil producere en logindgang, der ser sådan ud.
153.78.107.192 - - [21/Nov/2017:08:45:45 +0000] "POST /ngx_pagespeed_beacon?url=https%3A%2F%2Fwww.example.com%2Fads%2Ffresh-oranges-1509260795 HTTP/2.0" 204 0 "https://www.suasell.com/ads/fresh-oranges-1509260795" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" a02b2dea9cf06344a25611c1d7ad72db Uganda UG Kampala Kampala
Du kan angive flere logfiler ved hjælp af access_log-direktiverne på samme niveau, her bruger vi mere end en logfil i http-sammenhæng.
http{ ##default log format log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ##request tracing using custom format log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_x_forwarded_for" $request_id ' '$geoip_country_name $geoip_country_code ' '$geoip_region_name $geoip_city '; ##this uses the default log format access_log /var/log/nginx/access.log; ##this uses the our custom log format access_log /var/log/nginx/custom_log custom; }
Følgende er mere avancerede logningskonfigurationseksempler, som er nyttige til logformater, der indeholder kompressionsrelaterede variabler og til oprettelse af komprimerede logfiler:
access_log /var/log/nginx/custom_log custom buffer 32k; access_log /path/to/log.gz compression gzip flush=5m;
Konfiguration af fejllogfiler i Nginx
Hvis Nginx oplever fejl, registrerer den information om dem i fejlloggen. Disse problemer falder under forskellige sværhedsgrader: fejlretning, info, meddelelse, advarsel, fejl (dette er standardniveauet og fungerer globalt), kritik, alarm eller opstå.
Standardlogfilen er log/error.log, men den er normalt placeret i/var/log/nginx/på Linux-distributioner. Error_log-direktivet bruges til at specificere logfilen, og den kan bruges i hoved-, http-, mail-, stream-, server-, placeringskontekst (i den rækkefølge).
Du skal også bemærke, at:
- Konfigurationer i hovedkonteksten nedarves altid af lavere niveauer i ovenstående rækkefølge.
- og konfigurationer i de lavere niveauer tilsidesætter de konfigurationer, der er arvet fra de højere niveauer.
Du kan konfigurere fejllogning ved hjælp af følgende syntaks:
error_log /path/to/log_file log_level;
For eksempel:
error_log /var/log/nginx/error_log warn;
Dette vil instruere Nginx om at logge alle meddelelser af typen advarsler og mere alvorlige logniveau kritikere, advarsler og nye meddelelser.
I det næste eksempel logges beskeder om kritik-, alarm- og nye niveauer.
error_log /var/www/example1.com/log/error_log crit;
Overvej konfigurationen nedenfor, her har vi defineret fejllogning på forskellige niveauer (i http- og serverkontekst). I tilfælde af en fejl skrives meddelelsen til kun en fejllog, den nærmeste det niveau, hvor fejlen er opstået.
http { log_format compression '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; error_log /var/log/nginx/error_log crit; server { listen 80; server_name example1.com; #this logs errors messages for example1.com only error_log /var/log/nginx/example1.error_log warn; …... } server { listen 80; server_name example2.com; #this logs errors messages for example2.com only error_log /var/log/nginx/example1.error_log; ……. } }
Hvis du bruger mere end et error_log-direktiv som i konfigurationen nedenfor (samme niveau), skrives meddelelserne til alle angivne logfiler.
server { listen 80; server_name example1.com; error_log /var/www/example1.com/log/error_log warn; error_log /var/log/nginx/example1.error_log crit; …... }
Konfiguration af betinget logning i Nginx
I nogle tilfælde vil vi muligvis have Nginx til at udføre betinget logning af meddelelser. Ikke alle meddelelser skal logges af Nginx, derfor kan vi ignorere ubetydelige eller mindre vigtige logposter fra vores adgangslogger til bestemte tilfælde.
Vi kan bruge ngx_http_map_module-modulet, der opretter variabler, hvis værdier afhænger af værdierne for andre variabler. Parametrene inde i en kortblok (som kun skal findes i http-indholdet) angiver en kortlægning mellem kilde og resulterende værdier.
For denne type indstilling logges en anmodning ikke, hvis betingelsen evalueres til “0”
eller en tom streng. Dette eksempel udelukker anmodninger med HTTP-statuskoder 2xx og 3xx.
http{ map $status $condition { ~^[23] 0; default 1; } server{ access_log /path/to/access.log custom if=$condition; } }
Her er et andet nyttigt eksempel til fejlfinding af en webapplikation i en udviklingsfase. Dette ignorerer alle meddelelser og logger kun fejlretningsoplysninger.
http{ map $info $debuggable { default 0; debug 1; } server{ …….. access_log /var/log/nginx/testapp_debug_access_log debug if=$debuggable; #logs other requests access_log /var/log/nginx/testapp_access.log main; ……. } }
Du kan finde ud af mere information, herunder logning til syslog her.
Det er alt for nu! I denne vejledning forklarede vi, hvordan du konfigurerer brugerdefineret logningsformat til adgangs- og fejllogfiler i Nginx. Brug feedbackformularen nedenfor til at stille spørgsmål eller dele dine tanker om denne artikel.