Nginx provides two primary log files for monitoring server activity:
- access.log: Records all HTTP requests (default location: /var/log/nginx/access.log)
- error.log: Captures server errors and warnings (default location: /var/log/nginx/error.log)
To log variables in access logs, modify your nginx.conf or server block configuration:
log_format custom_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'DebugVar: $my_custom_variable';
server {
access_log /var/log/nginx/access.log custom_log;
# Your server configuration...
}
Here are common debugging scenarios with corresponding configurations:
1. Logging Request Headers
log_format debug_headers '$remote_addr - $http_x_debug_token - $http_user_agent';
2. Capturing Custom Variables
set $debug_value "test_123";
access_log /var/log/nginx/debug.log debug_headers;
3. Conditional Logging
map $arg_debug $loggable {
default 0;
"1" 1;
}
server {
access_log /var/log/nginx/debug.log custom_log if=$loggable;
}
For error logging, use the error_log directive with debug level:
error_log /var/log/nginx/error.log debug;
Then in your location blocks:
location / {
error_log /var/log/nginx/specific_error.log debug;
# This will log all variables available in this context
}
For complex debugging, consider these approaches:
1. JSON-formatted Logs
log_format json_log escape=json
'{"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":"$status",'
'"custom_var":"$my_variable"}';
2. Dynamic Variable Creation
set $debug_composite "${request}${status}${server_name}";
access_log /var/log/nginx/composite.log main;
- Always test configuration changes with
nginx -t
before reloading - Debug logging impacts performance - disable in production
- Rotate logs regularly to prevent disk space issues
- Use
tail -f /var/log/nginx/access.log
for real-time monitoring
When debugging Nginx configurations, logging variables is essential. Nginx provides two primary log files:
- access.log: Records all client requests
- error.log: Captures server errors and debugging information
To log variables in access.log, modify your nginx.conf or site configuration:
log_format debug_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'DEBUG_VARS: $arg_foo=$arg_foo|$request_uri|$host';
access_log /var/log/nginx/access.log debug_log;
For more detailed debugging, use error_log with debug level:
error_log /var/log/nginx/error.log debug;
server {
location /test {
set $custom_var "debug_value";
error_log /var/log/nginx/debug.log debug;
# Additional configuration...
}
}
Example 1: Logging request headers
log_format headers_log '$http_user_agent $http_host $http_cookie';
access_log /var/log/nginx/headers.log headers_log;
Example 2: Conditional logging based on variables
map $arg_debug $loggable {
default 0;
"1" 1;
}
access_log /var/log/nginx/debug_access.log combined if=$loggable;
- Use separate log files for debugging to avoid polluting main logs
- Rotate debug logs frequently to prevent disk space issues
- Disable debug logging in production environments
- Consider using conditional logging for performance
For complex debugging, you can create custom variables:
set $debug_info "$request_method - $uri - $args";
access_log /var/log/nginx/custom_debug.log debug_log;