yum安装的nginx默认日志格式
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"'; server { listen 80 default_server; listen [::]:80 default_server; # 启用认证访问 auth_basic "nginx auth"; auth_basic_user_file /etc/nginx/auth; #/etc/nginx/auth用htpasswd生成,用户名密码都为root
nginx日志格式,为了对比,我把它换行了,去掉了单引号
$remote_addr - # 访问来源ip 后面的"-" 是个普通字符 $remote_user # 用户,只有在启用 auth_basic 认证访问的时候才会出现,否则是一个 "-" 字符 [$time_local] # 日期,时间,时区 "$request" # 请求地址 注意,这里有双引号 $status # 状态码 $body_bytes_sent # 包发送大小 "$http_referer" # 引用页 注意,这里有双引号 "$http_user_agent" # 客户端useragent信息(系统版本、浏览器等) 注意,这里有双引号 "$http_x_forwarded_for" # nginx做反向代理时的客户端地址 注意,这里有双引号
nginx访问日志(已换行)每一行与上面一一对应:
192.168.10.105 - root [31/Aug/2017:13:34:45 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36" "-"
特别说一下$http_referer的含义。
一个页面中会引用css、js、图片等资源,去请求这些资源的时候$http_referer字段就是对应的当前页面地址。
比如现在1.html代码如下,引入了一张图片。
<!DOCTYPE HTML> <html> <body> <p> 一幅图像: <img src="./1.jpg" width="128" height="128" /> </p> </body> </html>
nginx的访问日志如下:
# 下面这条日志,$http_referer 没有内容,默认用了 "-" 代替 192.168.10.105 - root [31/Aug/2017:14:09:23 +0800] "GET /1.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36" "-" # 下面这条日志 $http_referer 为 http://192.168.10.26/1.html,说明1.jpg是这个页面中引用的图片资源 192.168.10.105 - root [31/Aug/2017:14:09:23 +0800] "GET /1.jpg HTTP/1.1" 304 0 "http://192.168.10.26/1.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36" "-"
nginx中支持的日志格式可以从 https://www.rootop.org/pages/3070.html 这里查看。
明白了上面日志格式含义,再去看goaccess的日志格式
可以从 https://goaccess.io/man#custom-log 查看 “CUSTOM LOG/DATE FORMAT” 部分对于日志格式的定义
第一个知识点:goaccess 默认以空格做为分隔符
定义一个对应nginx日志格式的goaccess配置文件
time-format %H:%M:%S date-format %d/%b/%Y log-format %h %^ %^ [%d:%t %^] "%r" %s %b "%R" "%u" %^
time-format(时间格式)和date-format(日期格式)可以理解为定义了两个变量,并以此为变量名。后面是变量值。
可以在shell下执行 echo $(date +%d/%b/%Y:%H:%M:%S) ,输出的时间格式和日志里的时间格式是一样的(除了没有时区)
log-format 开始定义日志格式,%d和%t其实就是去调用变量,d代表调用日期变量,t代表调用时间变量
第二个知识点:不要忘记日志格式中的双引号,及其他字符,如[],否则会解析失败。
goaccess 格式参数解释:
%x 与时间格式和日期格式变量匹配的日期和时间字段。当使用时间戳而不是日期和时间在两个单独的变量中时使用这个。 %t time字段匹配时间格式变量。 %d date字段匹配日期格式变量。 %v 根据规范名称设置(服务器块或虚拟主机)的服务器名称。 %e 这是通过HTTP身份验证请求文档的用户ID。 %h host(客户端IP地址,IPv4或IPv6) %r 客户端的请求行。这需要围绕请求的特定分隔符(单引号,双引号等)可解析。否则,请使用特殊格式说明符(如%m,%U,%q和%H)的组合来解析各个字段。 注意:使用%r获取完整请求或%m,%U,%q和%H以形成请求,两者不要同时使用。 %m 请求方式。 %U 请求的URL路径。 注意:如果查询字符串在%U中,则不需要使用%q。但是,如果URL路径不包含任何查询字符串,则可以使用%q,并将查询字符串追加到请求中。 %q 查询字符串。 %H 请求协议。 %s 服务器发送回客户端的状态码。 %b 返回给客户端的对象的大小。 %R “Referer”HTTP请求标头。 %u 用户代理HTTP请求标头。 %D 服务请求所用的时间,以微秒为单位。 %T 以毫秒级分辨率提供服务所需的时间(秒)。 %L 服务请求所需的时间,以毫秒为单位,为十进制数。 %^ 忽略此字段。 %~ 向前移动日志字符串,直到找到一个非空格(!isspace)字符。 ~h X-Forwarded-For(XFF)字段中的主机(客户端IP地址,IPv4或IPv6)。
现在生成html。
[root@localhost ~]# goaccess -f /var/log/nginx/access.log -a -d -p b -o ./1.html
-p是指定配置文件,文件名叫b
-o是输出到文件,支持html json csv
更多参数可以去看 goaccess -h 帮助
关于goaccess实时显示:
在生成html时候加一个参数
--real-time-html
这时goaccess会在当前窗口一直运行,可以加–daemonize参数放到后台。
其次,它开启一个端口 7890 用于浏览器和goaccess的WebSocket连接获取最新数据。
原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/3858.html