How to Log Nginx Variables for Debugging in Access/Error Logs


2 views

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;