Cara Mengonfigurasi Akses Kustom dan Format Log Kesalahan di Nginx


Server Nginx HTTP memiliki fasilitas logging fenomenal yang sangat dapat disesuaikan. Pada artikel ini, kami akan menjelaskan cara mengonfigurasi format akses dan log kesalahan Anda sendiri untuk Nginx di Linux.

Tujuan dari panduan ini adalah untuk membantu Anda memahami bagaimana log dihasilkan, sehingga dapat mengonfigurasi format log khusus untuk tujuan debugging, pemecahan masalah, atau analisis tentang apa yang terjadi di dalam server web Anda serta aplikasi web (seperti permintaan penelusuran).

Baca Juga: 4 Alat Pemantauan dan Manajemen Log Sumber Terbuka yang Baik untuk Linux

Artikel ini terdiri dari tiga bagian yang akan mencerahkan Anda tentang mengonfigurasi log akses/kesalahan dan cara mengaktifkan logging bersyarat di Nginx.

Mengonfigurasi Log Akses di Nginx

Di bawah Nginx, semua permintaan klien ke server dicatat dalam log akses dalam format tertentu menggunakan modul ngx_http_log_module.

File log default adalah log/access.log (biasanya /var/log/nginx/access_log pada sistem Linux) dan format default untuk logging biasanya adalah gabungan atau format utama. format (ini dapat bervariasi dari satu distro ke distro lainnya).

Direktif access_log (berlaku di http, server, lokasi, jika berada di lokasi dan batas kecuali konteks) digunakan untuk mengatur file log dan direktif log_format (berlaku di bawah konteks http saja) digunakan untuk mengatur format log. Format log dijelaskan oleh variabel umum, dan variabel yang dihasilkan hanya pada saat log ditulis.

Sintaks untuk mengonfigurasi format log adalah:

log_format format_name 'set_of_variables_to_define_format';

dan sintaks untuk mengkonfigurasi access log adalah:

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

Berikut ini adalah kutipan dari file konfigurasi Nginx default /etc/nginx/nginx.conf di 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;
}

Format log ini menghasilkan entri log berikut.

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"

Berikut ini adalah format logging lain yang berguna yang kami gunakan untuk menelusuri permintaan ke aplikasi web kami menggunakan beberapa variabel default, yang paling penting memiliki ID permintaan dan mencatat rincian lokasi klien (negara, kode negara, wilayah dan kota).

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

Anda dapat menggunakannya seperti ini:

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

Ini akan menghasilkan entri log yang muncul seperti ini.

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 

Anda dapat menentukan beberapa log menggunakan arahan access_log pada tingkat yang sama, di sini kami menggunakan lebih dari satu file log dalam konteks http.

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

Berikut ini adalah contoh konfigurasi logging tingkat lanjut, yang berguna untuk format log yang berisi variabel terkait kompresi dan untuk membuat file log terkompresi:

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

Mengonfigurasi Log Kesalahan di Nginx

Jika Nginx mengalami gangguan apa pun, ia akan mencatat informasi mengenai gangguan tersebut di log kesalahan. Masalah ini memiliki tingkat keparahan yang berbeda-beda: debug, info, pemberitahuan, peringatkan, kesalahan (ini adalah level default dan berfungsi secara global), crit, alert, atau emerg.

File log default adalah log/error.log, namun biasanya terletak di /var/log/nginx/ pada distribusi Linux. Direktif error_log digunakan untuk menentukan file log, dan dapat digunakan dalam konteks utama, http, mail, stream, server, lokasi (dalam urutan itu).

Anda juga harus memperhatikan bahwa:

  • Konfigurasi dalam konteks utama selalu diwarisi oleh level yang lebih rendah dalam urutan di atas.
  • dan konfigurasi di tingkat yang lebih rendah mengesampingkan konfigurasi yang diwarisi dari tingkat yang lebih tinggi.

Anda dapat mengonfigurasi pencatatan kesalahan menggunakan sintaks berikut:

error_log /path/to/log_file log_level;

Misalnya:

error_log /var/log/nginx/error_log warn; 

Ini akan memerintahkan Nginx untuk mencatat semua pesan jenis warn dan tingkat log yang lebih parah crit, alert, dan emerg pesan.

Pada contoh berikutnya, pesan tingkat crit, alert, dan emerg akan dicatat.

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

Pertimbangkan konfigurasi di bawah ini, di sini, kami telah mendefinisikan error logging pada level yang berbeda (dalam konteks http dan server). Jika terjadi kesalahan, pesan akan ditulis ke satu log kesalahan saja, log yang paling dekat dengan tingkat munculnya kesalahan.

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

Jika Anda menggunakan lebih dari satu arahan error_log seperti pada konfigurasi di bawah ini (tingkat yang sama), pesan akan ditulis ke semua log yang ditentukan.

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

Mengonfigurasi Logging Bersyarat di Nginx

Dalam beberapa kasus, kita mungkin ingin Nginx melakukan pencatatan log bersyarat pada pesan. Tidak setiap pesan harus dicatat oleh Nginx, oleh karena itu kita dapat mengabaikan entri log yang tidak penting atau kurang penting dari log akses kita untuk kejadian tertentu.

Kita dapat menggunakan modul ngx_http_map_module yang membuat variabel yang nilainya bergantung pada nilai variabel lain. Parameter di dalam blok peta (yang seharusnya ada di konten http saja) menentukan pemetaan antara sumber dan nilai yang dihasilkan.

Untuk pengaturan seperti ini, permintaan tidak akan dicatat jika kondisi bernilai “0 ” atau string kosong. Contoh ini mengecualikan permintaan dengan kode status HTTP 2xx dan 3xx.

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

Berikut adalah contoh lain yang berguna untuk men-debug aplikasi web dalam tahap pengembangan. Ini akan mengabaikan semua pesan dan hanya mencatat informasi debug.

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

Anda dapat mengetahui informasi lebih lanjut, termasuk login ke syslog di sini.

Itu saja untuk saat ini! Dalam panduan ini, kami menjelaskan cara mengonfigurasi format logging khusus untuk akses dan log kesalahan di Nginx. Gunakan formulir umpan balik di bawah untuk mengajukan pertanyaan atau menyampaikan pendapat Anda tentang artikel ini.