优化Nginx日志:利用JSON格式输出,实现更好的日志分析

目录
文章目录隐藏
  1. 网上统一方法:修改 nginx.conf 配置文件
  2. 可能遇到的问题
  3. 正确操作
  4. Nginx 日志常用参数详解

优化 Nginx 日志:利用 JSON 格式输出,实现更好的日志分析

本笔记主要内容是优化 Nginx 日志:利用 JSON 格式输出,实现更好的日志分析,包含log_formataccess_log两种命令,通过示例代码为大家详细介绍具体实现,相信通过本文能够让大家的更好的学习或者工作,一起来看一下吧。

nginx 服务器日志相关指令主要有两条:

  1. 一条是log_format,用来设置日志格式;
  2. 另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小。

log_format 指令用来设置日志的记录格式,它的语法如下:

log_format name format {format ...}

其中 name 表示定义的格式名称,format 表示定义的格式样

网上统一方法:修改 nginx.conf 配置文件

http {
    include       mime.types;
    default_type  application/octet-stream;
    charset  utf-8;
    
    # 原有日志格式,不能注释或者去掉
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time';
    # json 日志格式
    log_format log_json '{"@timestamp": "$time_local", '
                        '"remote_addr": "$remote_addr", '
                        '"referer": "$http_referer", '
                        '"request": "$request", '
                        '"status": $status, '
                        '"bytes": $body_bytes_sent, '
                        '"agent": "$http_user_agent", '
                        '"x_forwarded": "$http_x_forwarded_for", '
                        '"up_addr": "$upstream_addr",'
                        '"up_host": "$upstream_http_host",'
                        '"up_resp_time": "$upstream_response_time",'
                        '"request_time": "$request_time"'
                        ' }';
 
    access_log  logs/access.log log_json; # 引用日志格式名称
 
    (省略内容)
}

在 Nginx 的配置文件 nginx.conf 中,我们定义了两种的日志格式:main 和 log_json,其中 main 为普通的文本格式,log_json 为 json 格式。

log_json 其实就是手工构造一个 json 字符串。定义了 json 的日志格式后,便可以指定 access log 为 json 格式,修改 Nginx 的配置,重启 Nginx ,便可以看到 json 格式的日志,重启 Nginx。

可能遇到的问题

可能遇到的问题

背景:
因为我这边是通过 nginx 去代理了很多域名,所以会有很多平台访问的日志,通过在 nginx.conf 主配置文件增加  include vhosts/*.conf; 导入主机配置,所以会存在一个 server 段中只能有一个名称的问题。

正确操作

修改 nginx.conf 配置文件:

[root@elk-nginx-01 conf]# cd /data/services/nginx/conf/
[root@elk-nginx-01 conf]# pwd
/data/services/nginx/conf
[root@elk-nginx-01 conf]# ll
总用量 72
-rw-r--r-- 1 root root 1077 9 月   3 09:45 fastcgi.conf
-rw-r--r-- 1 root root 1077 9 月   3 09:45 fastcgi.conf.default
-rw-r--r-- 1 root root 1007 9 月   3 09:45 fastcgi_params
-rw-r--r-- 1 root root 1007 9 月   3 09:45 fastcgi_params.default
-rw-r--r-- 1 root root 2837 9 月   3 09:45 koi-utf
-rw-r--r-- 1 root root 2223 9 月   3 09:45 koi-win
-rw-r--r-- 1 root root 5231 9 月   3 09:45 mime.types
-rw-r--r-- 1 root root 5231 9 月   3 09:45 mime.types.default
-rw-r--r-- 1 root root 3729 9 月   3 15:49 nginx.conf
-rw-r--r-- 1 root root 2656 9 月   3 13:59 nginx.conf-bak0903
-rw-r--r-- 1 root root 2656 9 月   3 09:45 nginx.conf.default
-rw-r--r-- 1 root root  636 9 月   3 09:45 scgi_params
-rw-r--r-- 1 root root  636 9 月   3 09:45 scgi_params.default
drwxr-xr-x 2 root root  134 9 月   3 11:34 sslkeys
-rw-r--r-- 1 root root  664 9 月   3 09:45 uwsgi_params
-rw-r--r-- 1 root root  664 9 月   3 09:45 uwsgi_params.default
drwxr-xr-x 2 root root   87 9 月   3 16:53 vhosts
-rw-r--r-- 1 root root 3610 9 月   3 09:45 win-utf
[root@elk-nginx-01 conf]# vim nginx.conf
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    charset  utf-8;
    
    # 原有日志格式,不能注释
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time';
    # json 日志格式
    log_format json '{"@timestamp": "$time_local", '
                        '"remote_addr": "$remote_addr", '
                        '"referer": "$http_referer", '
                        '"request": "$request", '
                        '"status": $status, '
                        '"bytes": $body_bytes_sent, '
                        '"agent": "$http_user_agent", '
                        '"x_forwarded": "$http_x_forwarded_for", '
                        '"up_addr": "$upstream_addr",'
                        '"up_host": "$upstream_http_host",'
                        '"up_resp_time": "$upstream_response_time",'
                        '"request_time": "$request_time"'
                        ' }';
 
    #导入主机配置
    include vhosts/*.conf;
 
    (省略内容)
}
保存退出!
 
[root@elk-nginx-01 conf]# pwd
/data/services/nginx/conf
[root@elk-nginx-01 conf]# cd vhosts/
[root@elk-nginx-01 vhosts]# ll
总用量 12
-rw-r--r-- 1 yfbkf yfbkf  921 9 月   3 15:37 gonggao.conf
-rw-r--r-- 1 yfbkf yfbkf 1482 9 月   3 16:50 gongdan.conf
-rw-r--r-- 1 yfbkf yfbkf 1151 9 月   3 14:42 gongmo.conf

nginx.conf 配置文件效果

然后重启 nginx。

总结:

  1. 原有的日志格式不能注释或者去掉,只能新增一个 log_format
  2. 新增自定义一份日志记录格式,需要注意,log_format 指令设置的名称在配置文件中是不能重复的(比如我 json 日志格式名称 json)
  3. 原有的日志格式如果调整了,需要在 log 后加上名称才生效

Nginx 日志常用参数详解

    log_format json '{"@timestamp":"$time_iso8601",'
                     '"scheme":"$scheme",'
                     '"http_referer":"$http_referer",'
                     '"args":"$args",'
                     '"http_user_agent":"$http_user_agent",'
                     '"remote_addr":"$remote_addr",'
                     '"hoste":"$host",'
                     '"server_name":"$server_name",'
                     '"server_protocol":"$server_protocol",'
                     '"request_method":"$request_method",'
                     '"request_uri":"$request_uri",'
                     '"uri":"$uri",'
                     '"request_length":"$request_length",'
                     '"body_byte_sent": "$body_bytes_sent",'
                     '"request_time":"$request_time",'
                     '"server_addr":"$server_addr",'
                     '"status": $status,'
                     '"bytes_sent":"$bytes_sent",'
                     '"upstream_addr":"$upstream_addr",'
                     '"upstream_status":"$upstream_status",'
                     '"upstream_connect_time":"$upstream_connect_time",'
                     '"upstream_response_time":"$upstream_response_time",'
                     '"request_id":"$request_id"'
                     '}';

可以加上这些:
$request_filename:当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成。
$http_cookie:客户端 cookie 信息
$http_host #请求地址,即浏览器中你输入的地址(IP 或域名)
$server_port:请求到达服务器的端口号。
$connection_requests 当前通过一个连接获得的请求数量。
  • $remote_addr:记录访问网站的客户端地址
  • $remote_user:远程客户端用户名称
  • $time_local:记录访问时间与时区
  • $request:表示 request 请求头的行
  • $status:http 状态码,记录请求返回的状态,例如:200、404、301 等
  • $body_bytes_sent:服务器发送给客户端的响应 body 字节数,发送给客户端的文件主体内容的大小,比如 899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。
  • $http_referer:记录此次请求是从哪个链接访问过来的,可以根据 refer 进行防盗链设置
  • $http_user_agent:记录客户端访问信息,例如:浏览器,手机客户端等
  • $http_x_forwarded_for:客户端的真实 ip,通常 web 服务器放在反向代理的后面,这样就不能获取到客户的 IP 地址了,通过$remote_add 拿到的 IP 地址是反向代理服务器的 iP 地址。反向代理服务器在转发请求的 http 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的 IP 地址和原来客户端的请求的服务器地址。
  • $http_host 请求地址,即浏览器中你输入的地址(IP 或域名)
  • $ssl_protocol:SSL 协议版本
  • $ssl_cipher:交换数据中的算法
  • $upstream_status:upstream 状态,比如成功是 200
  • $upstream_addr:当 ngnix 做负载均衡时,可以查看后台提供真实服务的设备
  • $upstream_response_time:请求过程中,upstream 响应时间
  • $request_time:整个请求的总时间,请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
  • $args:这个变量等于请求行中的参数,同$query_string
  • $content_length:请求头中的 Content-length 字段。
  • $content_type:请求头中的 Content-Type 字段。
  • $document_root:当前请求在 root 指令中指定的值。
  • $host:请求主机头字段,否则为服务器名称。
  • $http_user_agent:客户端 agent 信息
  • $http_cookie:客户端 cookie 信息
  • $limit_rate:这个变量可以限制连接速率。
  • $request_method:客户端请求的动作,通常为 GET 或 POST。
  • $remote_addr:客户端的 IP 地址。
  • $remote_port:客户端的端口。
  • $remote_user:已经经过 Auth Basic Module 验证的用户名。
  • $request_filename:当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成。
  • $scheme:HTTP 方法(如 http,https)。
  • $server_protocol:请求使用的协议,通常是 HTTP/1.0 或 HTTP/1.1。
  • $server_addr:服务器地址,在完成一次系统调用后可以确定这个值。
  • $server_name:服务器名称。
  • $server_port:请求到达服务器的端口号。
  • $request_uri:包含请求参数的原始 URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
  • $uri:不带请求参数的当前 URI,$uri 不包含主机名,如”/foo/bar.html”。
  • $document_uri:与$uri 相同。
[apps@ngx-ali01 conf]$ cat nginx.conf
user  apps apps;
worker_processes  auto;

error_log /apps/svr/tengine/logs/nginx_error.log error;
pid /apps/svr/tengine/logs/nginx.pid;

worker_rlimit_nofile 65535;

events {
    use epoll;
    worker_connections  65535;
}


http {
      log_format main '{"@timestamp":"$time_iso8601",'
                        '"@source":"$server_addr",'
                        '"idc":"huzhou",'
                        '"http_cookie":"$http_cookie",'
                        '"hostname":"$hostname",'
                        '"ip":"$http_x_forwarded_for",'
                        '"client":"$remote_addr",'
                        '"request_method":"$request_method",'
                        '"scheme":"$scheme",'
                        '"domain":"$server_name",'
                        '"referer":"$http_referer",'
                        '"request":"$request_uri",'
                        '"args":"$args",'
                        '"size":$body_bytes_sent,'
                        '"request_body":"$request_body",'
                        '"status": $status,'
                        '"responsetime":$request_time,'
                        '"upstreamtime":"$upstream_response_time",'
                        '"upstreamaddr":"$upstream_addr",'
                        '"http_user_agent":"$http_user_agent",'
                        '"https":"$https"'
                        '}';

        access_log /apps/svr/tengine/logs/access.log main;

        limit_conn_zone $server_name zone=perserver:10m;
        limit_conn_zone $binary_remote_addr zone=perip:20m;
#       limit_req_zone $rt_filtered_ip zone=qps:10m rate=30r/s;

        include mime.types;
        default_type    application/octet-stram;
        server_tokens   off;
        server_tag      off;
        server_info     off;
        server_names_hash_bucket_size 128;
        sendfile        on;
        keepalive_timeout 65;
        gzip  on;
        gzip_http_version 1.1;
        gzip_vary on;
        gzip_comp_level 6;
        gzip_proxied any;
        gzip_types text/plain  text/css application/json  application/x-javascript text/xml application/xml application/xml+rss text/javascript application/x-shockwave-flash image/png image/x-icon image/gif image/jpeg;
        gzip_buffers 16 8k;
        proxy_temp_path /dev/shm/temp;
        proxy_cache_path /dev/shm/cache levels=2:2:2 keys_zone=cache_go:20m inactive=1d max_size=2g;

        vhost_traffic_status_zone;
        vhost_traffic_status_filter_by_host on;
        include conf.d/*.conf;
        include ztoky_cn/*.conf;
}

以上就是关于 Nginx 日志输出配置 json 格式的全部内容了,更多相关 Nginx 日志输出 json 内容请搜索码云笔记以前的文章,感谢阅读。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系maynote@foxmail.com处理
码云笔记 » 优化Nginx日志:利用JSON格式输出,实现更好的日志分析

发表回复