Nginx'te Özel Erişim ve Hata Günlüğü Formatlarını Yapılandırma


Nginx HTTP sunucusu, son derece özelleştirilebilir olağanüstü bir günlük kaydı olanağına sahiptir. Bu yazıda, Linux'ta Nginx için erişim ve hata günlükleri için kendi formatlarınızı nasıl yapılandıracağınızı açıklayacağız.

Bu kılavuzun amacı, hata ayıklama, sorun giderme veya web sunucunuzda ve web uygulamalarında (istek izleme gibi) ortaya çıkan olayların analizi amacıyla özel günlük formatlarını yapılandırmak için günlüklerin nasıl oluşturulduğunu anlamanıza yardımcı olmaktır.

Ayrıca Okuyun: Linux için 4 İyi Açık Kaynak Günlük İzleme ve Yönetim Aracı

Bu makale, erişim/hata günlüklerinin yapılandırılması ve Nginx'te koşullu günlük kaydının nasıl etkinleştirileceği konusunda sizi aydınlatacak üç bölümden oluşmaktadır.

Nginx'te Erişim Günlüklerini Yapılandırma

Nginx altında, sunucuya yapılan tüm istemci istekleri, ngx_http_log_module modülü kullanılarak erişim günlüğüne belirtilen biçimde kaydedilir.

Varsayılan günlük dosyası log/access.log'dur (Linux sistemlerinde genellikle /var/log/nginx/access_log) ve günlük kaydı için varsayılan biçim normalde birleştirilmiş veya ana günlük dosyasıdır biçimi (bu bir dağıtımdan diğerine değişebilir).

access_log yönergesi (bağlam dışında konum ve sınırdaysa http, sunucu, konum için geçerlidir) günlük dosyasını ayarlamak için kullanılır ve log_format yönergesi (bağlam dışında geçerlidir) kullanılır. Yalnızca http bağlamı) günlük biçimini ayarlamak için kullanılır. Günlük formatı, ortak değişkenler ve yalnızca günlük yazıldığı sırada oluşturulan değişkenler tarafından tanımlanır.

Günlük formatını yapılandırmaya yönelik sözdizimi şöyledir:

log_format format_name 'set_of_variables_to_define_format';

ve erişim günlüğünü yapılandırmaya yönelik sözdizimi şöyledir:

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]];

Aşağıdaki, CentOS 7'deki varsayılan Nginx yapılandırma dosyasından /etc/nginx/nginx.conf'dan bir alıntıdır.

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;
}

Bu günlük formatı aşağıdaki günlük girişini sağlar.

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"

Aşağıda, bazı varsayılan değişkenleri kullanarak web uygulamalarımıza gelen istekleri izlemek için kullandığımız başka bir yararlı günlük kaydı biçimi bulunmaktadır; en önemlisi istek kimliğine sahiptir ve istemci konum ayrıntılarını (ülke, ülke kodu, bölge ve şehir) günlüğe kaydeder.

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 ';

Bunu şu şekilde kullanabilirsiniz:

access_log  /var/log/nginx/access.log custom;

Bu, şu şekilde görünen bir günlük girişi üretecektir.

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 

Aynı düzeydeki access_log yönergelerini kullanarak birden fazla günlük belirtebilirsiniz, burada http bağlamında birden fazla günlük dosyası kullanıyoruz.

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;
}

Aşağıda, sıkıştırmayla ilgili değişkenler içeren günlük formatları ve sıkıştırılmış günlük dosyaları oluşturmak için yararlı olan daha gelişmiş günlük yapılandırma örnekleri yer almaktadır:

access_log /var/log/nginx/custom_log custom buffer 32k;
access_log /path/to/log.gz compression  gzip  flush=5m;

Nginx'te Hata Günlüklerini Yapılandırma

Nginx'in herhangi bir aksaklık yaşaması durumunda, bunlarla ilgili bilgileri hata günlüğüne kaydeder. Bu sorunlar farklı önem düzeylerine tabidir: hata ayıklama, bilgi, bildirim, uyarı, hata Strong> (bu, varsayılan düzeydir ve genel olarak çalışır), kritik, uyarı veya acil durum.

Varsayılan günlük dosyası log/error.log'dur, ancak normalde Linux dağıtımlarında /var/log/nginx/ konumunda bulunur. error_log yönergesi günlük dosyasını belirtmek için kullanılır ve ana, http, posta, akış, sunucu, konum bağlamında (bu sırayla) kullanılabilir.

Şuna da dikkat etmelisiniz:

  • Ana bağlamdaki konfigürasyonlar her zaman daha düşük seviyeler tarafından yukarıdaki sıraya göre devralınır.
  • ve daha düşük seviyelerdeki konfigürasyonlar, daha yüksek seviyelerden devralınan konfigürasyonları geçersiz kılar.

Aşağıdaki sözdizimini kullanarak hata günlüğünü yapılandırabilirsiniz:

error_log /path/to/log_file log_level;

Örneğin:

error_log /var/log/nginx/error_log warn; 

Bu, Nginx'e warn türündeki ve daha ciddi düzeydeki kritik, alert ve acil türündeki tüm iletileri günlüğe kaydetmesi talimatını verecektir. mesajlar.

Bir sonraki örnekte, kritik, uyarı ve acil düzeylerindeki mesajlar günlüğe kaydedilecektir.

error_log /var/www/example1.com/log/error_log crit;

Aşağıdaki yapılandırmayı göz önünde bulundurun; burada farklı düzeylerde (http ve sunucu bağlamında) hata günlüğünü tanımladık. Bir hata durumunda mesaj, hatanın ortaya çıktığı seviyeye en yakın olan yalnızca bir hata günlüğüne yazılır.

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;
        		…….
    	}
}

Aşağıdaki yapılandırmada olduğu gibi birden fazla error_log yönergesi kullanırsanız (aynı düzey), iletiler belirtilen tüm günlüklere yazılır.

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;
            	…...
	}

Nginx'te Koşullu Günlüğü Yapılandırma

Bazı durumlarda Nginx'in mesajların koşullu günlüğünü tutmasını isteyebiliriz. Her mesajın Nginx tarafından günlüğe kaydedilmesi gerekmez, bu nedenle belirli durumlar için erişim günlüklerimizden önemsiz veya daha az önemli günlük girişlerini göz ardı edebiliriz.

Değerleri diğer değişkenlerin değerlerine bağlı olan değişkenler oluşturan ngx_http_map_module modülünü kullanabiliriz. Bir harita bloğunun içindeki parametreler (yalnızca http içeriğinde bulunması gereken), kaynak ve sonuç değerleri arasındaki eşlemeyi belirtir.

Bu tür bir ayar için, koşulun “0 ” veya boş bir dize olarak değerlendirilmesi durumunda istek günlüğe kaydedilmeyecektir. Bu örnek, 2xx ve 3xx HTTP durum kodlarına sahip istekleri hariç tutar.

http{
	map $status $condition {
		~^[23] 0;
    		default 1;
	}
	server{
		access_log  /path/to/access.log  custom if=$condition;
	}
}

İşte geliştirme aşamasında bir web uygulamasında hata ayıklamaya yönelik başka bir yararlı örnek. Bu, tüm mesajları göz ardı edecek ve yalnızca hata ayıklama bilgilerini günlüğe kaydedecektir.

 
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; 
		…….
	}
}

Sistem günlüğüne giriş yapmak da dahil olmak üzere daha fazla bilgiyi burada bulabilirsiniz.

Şimdilik bu kadar! Bu kılavuzda Nginx'te erişim ve hata günlükleri için özel günlük kaydı formatının nasıl yapılandırılacağını açıkladık. Bu makale hakkında soru sormak veya düşüncelerinizi paylaşmak için aşağıdaki geri bildirim formunu kullanın.