Skip to content

Per-VirtualHost Logging

When you have multiple virtual hosts, keep separate logs for each one.

Configuration

error_log logs/main_error.log;

events {
    worker_connections 1024;
}

http {
    error_log logs/http_error.log error;

    server {
        server_name one.org;
        access_log logs/one.access;
        error_log logs/one.error error;
    }

    server {
        server_name two.org;
        access_log logs/two.access;
        error_log logs/two.error error;
    }
}

Example Output

A request for one.org/nonexistent.html outputs to logs/one.error:

2009/01/01 19:45:44 [error] 29874#0: *98 open() "/var/www/one/nonexistent.html" 
failed (2: No such file or directory), client: 11.22.33.44, server: one.org, 
request: "GET /nonexistent.html HTTP/1.1", host: "one.org"

Log Levels

The error_log directive has different default values depending on the context. Explicitly set the logging level in each server { } block.

Log Format Customization

You can also customize the access log format per virtual host:

http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"';

    log_format detailed '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        'rt=$request_time urt=$upstream_response_time';

    server {
        server_name api.example.com;
        access_log logs/api.access detailed;
    }

    server {
        server_name www.example.com;
        access_log logs/www.access main;
    }
}