NGINX 日志log 格式定义(format) & 筛选记录(map)

一、 NGINX日志格式自定义(format)

在http配置中添加log_format,并在使用log的地方选择模板,可以按照自定义格式输出日志。

这里需要注意的点:如果要在http中引入其他文件的配置,其他文件中若需要使用nginx.conf中的log_format,请将log_format配置放置于include语句之前。

# /nginx/conf/nginx.conf

worker_processes  2;

error_log  logs/error.log  info;

events {
    worker_connections  1024;
}


http {
	# 自定义模板
    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  logs/access.log  main;
    
    include       mime.types;
    
    # 如果include中内容需要使用模板,需要将include语句放置于模板定义之后
    include hosts/*.conf;
    include hosts/upstm/*.conf;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;

    #gzip  on;
    client_max_body_size 20M;
    client_body_buffer_size 20M;
    fastcgi_intercept_errors on;

    server {
        listen       8088;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

二、NGINX日志筛选记录(map)

使用map,可以控制哪些日志输出,哪些日志不输出。假设一种情况:我们控制某台ip的访问日志不打入至log中,则可以使用remote字段+正则来过滤日志,具体实现方式如下:

http {
	# 使用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"';
    
    # 使用map定义过滤规则,map [字段变量] [过滤规则名称定义] {}
    map $remote_addr $iploggable {
        default 1; # default 为默认情况下,1为输出,0为不输出
        ~^172.28.126.101 0; # ~后跟正则,^172.28.126.101为正则(表示以这个ip开头的),0表示不输出,所以此过滤规则为:172.28.126.101的访问请求日志不打印
    }

	# 在日志输出位置后加上模板名称,则表示使用自定义模板输出日志,在模板名称后加上if=[过滤规则],则可以控制当前日志过滤规则
    access_log  logs/access.log  main if=$iploggable;
}

假设另外一种情况,有探活的机器来检查我们项目的check_health.html文件,并且频率极高,这样会导致我们log文件增长快,并且记录不到真实的访问log,根据请求的log规律,我们可以这样设置:
NGINX 日志log 格式定义(format) & 筛选记录(map)_第1张图片

http {
	# 使用log_format自定义模板
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" - $uri'
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    # 使用map定义过滤规则,map [字段变量] [过滤规则名称定义] {}
    map $uri $check_health_log {
        default 1; # default 为默认情况下,1为输出,0为不输出
        ~^/check_health.html 0; # ~后跟正则,^/check_health.html为正则,0表示不输出,所以此过滤规则为:uri为/check_health.html 的访问请求日志不打印
    }

	# 在日志输出位置后加上模板名称,则表示使用自定义模板输出日志,在模板名称后加上if=[过滤规则],则可以控制当前日志过滤规则
    access_log  logs/access.log  main if=$check_health_log;
}

你可能感兴趣的:(linux,nginx,服务器,运维)