The main
parameter in Nginx's access_log
directive refers to a predefined log format name. When you see configuration like:
access_log /var/log/nginx/access.log main;
It means Nginx will use the log format named "main" to structure the access log entries. This format isn't magical - it's simply a commonly used default name that's preconfigured in most Nginx installations.
The main
log format is typically defined earlier in your Nginx configuration using the log_format
directive. A standard definition looks like:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
You can create multiple log formats and reference them by name. For example:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format minimal '$remote_addr [$time_local] "$request" $status';
Then use them selectively:
access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/minimal.log minimal;
Here are some common scenarios where you might modify or create new log formats:
# For analytics tracking
log_format analytics '$remote_addr - $http_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
# For security monitoring
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'$http_cookie "$http_user_agent"';
- Always define your log formats before using them in access_log directives
- Consider creating separate log files for different purposes (analytics, debugging, security)
- For high-traffic servers, evaluate if you need all the log data or can use a minimal format
- Remember that more detailed logs consume more disk space and I/O resources
If you encounter errors about undefined log formats, check:
- The log format is defined before it's used
- There are no typos in the format name
- You haven't accidentally commented out the log_format directive
When configuring Nginx logging, you might encounter this syntax:
access_log /var/log/nginx/access.log main
The main
parameter isn't explicitly documented in the official Nginx docs, which can be confusing for developers.
The main
parameter refers to a predefined log format. Nginx comes with a default log format called "combined", but you can define custom formats in your configuration:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Here's how you might use it in a complete server block:
http {
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
server {
access_log /var/log/nginx/access.log main;
location / {
root /var/www/html;
}
}
}
Understanding this parameter is crucial when:
- Creating custom log formats for specific analytics needs
- Setting up log parsing for monitoring tools
- Debugging complex request flows
You can define multiple log formats and use them conditionally:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent';
log_format debug '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'$request_time $upstream_response_time';
server {
access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/debug.log debug if=$debug;
}