给Nginx配置日志格式和调整日期格式

摘要:
效果比较官方默认日志格式#官方默认日志文件格式Log_ formatmain‘$server_name$remote_addr-$remote_user[$time_local]“$request”$status$body_bytes_send“$http_referer”“$http_user_agent”“$shttp_x_forwarded_for”';#输出结果127.0.0.1--[01/Jul

效果对比

官方默认日志格式

# 官方默认日志格式
log_format  main  '$server_name $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';

# 输出结果
127.0.0.1 - - [01/Jul/2020:03:25:17 +0800] "GET /resource/js/bootstrap.min.js HTTP/1.1" 200 36816 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "192.168.0.1"
127.0.0.1 - - [01/Jul/2020:03:25:17 +0800] "GET /resource/js/jquery.min.js HTTP/1.1" 200 95962 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "192.168.0.1"

修改后的日志格式

# 自定义格式
log_format main '$year-$month-$day $hour:$minutes:$seconds|$request_method|$request_uri|$http_host|$server_name|$status|$request_time|$remote_addr|$http_x_forwarded_for|$http_referer|$http_user_agent';

# 输出结果
2020-07-01 11:30:54|GET|/|www.baidu.com|www.baidu.com|304|0.000|127.0.0.1|192.168.0.1|-|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
2020-07-01 11:30:59|GET|/favicon.ico|www.baidu.com|www.baidu.com|200|0.000|127.0.0.1|192.168.0.1|https://www.www.com/|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36

注意:

年月日这些时间变量均为自定义,需要在每一个server下面添加这个代码

server {

	....
	if ($time_iso8601 ~ "^(d{4})-(d{2})-(d{2})T(d{2}):(d{2}):(d{2})") {
			set $year $1;
			set $month $2;
			set $day $3;
			set $hour $4;
			set $minutes $5;
			set $seconds $6;
	}
	....
}

nginx内置变量

变量名称变量描述
$arg_PARAMETER客户端GET请求中PARAMETER 字段的值
$args客户端请求中的参数
$binary_remote_addr远程地址的二进制表示
$body_bytes_sent已发送的消息体字节数
$content_lengthHTTP请求信息中content-length的字段
$content_type请求信息中content-type字段
$cookie_COOKIE客户端请求中COOKIE头域的值
$document_root针对当前请求的根路径设置值
$document_uri与$uri相同
$host请求信息中的host头域,如果请求中没有Host行,则等于设置的服务器名
$http_HEADERHTTP请求信息里的HEADER地段
$http_host与$host相同,但是如果请求信息中没有host行,则可能不同客户端cookie信息
$http_cookie客户端cookie信息
$http_referer客户端是从哪一个地址跳转过来的
$http_user_agent客户端代理信息,也就是你客户端浏览器
$http_via最后一个访问服务器的IP
$http_x_forwarded_for相当于访问网路访问的路径
$is_args如果有args的值,则等于”?”,否则为空
$limit_rate对连接速率的限制
$nginx_version当前Nginx的版本
$pid当前Nginx服务器的进程的进程ID
$query_string与$args相同
$remote_addr客户端IP地址
$remote_port客户端的端口
$remote_user客户端的用户名,用于 auth basic module验证
$request客户端请求
$request_body客户端发送的报文体
$request_body_file发送后端服务器的本地临时缓存文件的名称
$request_filename当前请求的文件路径名,由root或alias指令与URI请求生成
$request_method请求后端数据的方法,例如”GET”,”POST”
$request_uri请求的URI,带参数,不包含主机名
$scheme所用的协议,如http或者HTTPS,比如rewrite^(.+)$$scheme://mysite.name$redirect
$sent_http_cache_control对应http请求头中的Cache-Control,需要打开chrome浏览器,右键检查,选中network,点中其中一个请求的资源
$sent_http_connection对应http请求中的Connection
$sent_http_content_type对应http请求中的Content-Type
$sent_last_modified对应请求中的Last-Modified
$server_addr服务端的地址
$server_name请求到达的服务器名
$server_port请求到达服务器端口号
$server_protocol请求协议的版本号,HTTP1.0/HTTP1.1
$uri请求的不带请求参数的URI,可能和最初的值有不同,比如经过重定向之类的

参数和执行流程说明

log_format main '$year-$month-$day-$hour:$minutes:$seconds|$request_method|$request_uri|$http_host|$server_name|$status|$request_time|$remote_addr|$http_x_forwarded_for|$http_referer|$http_user_agent';


main									# 表示给当前格式的命名
$year-$month-$day-$hour:$minutes:$seconds	                        # 使用自己定义的变量
$request_method								# 请求方法,比如GET或者POST
$request_uri								# 请求URI
$http_host								# 请求信息中的host
$server_name								# 实际nginx匹配到的host(因为一个server可以有多个name,这个时候貌似输出的是第一个name,所以多个的时候可能会和$http_host不一致)
$status									# 返回的http状态码
$request_time								# 请求所花费的时间
$remote_addr								# 正常请求中的客户端ip地址,但是如果经过反向代理,这个时候是127.0.0.1
$http_x_forwarded_for						        # 如果经过反向代理,这个字段可以拿到原本的ip地址
$http_referer								# 来源地址,如果是通过其他网页来源访问到的,这里可以看到
$http_user_agent							# 浏览器请求头
---


再说明一下时间格式
nginx日志有默认两种时间格式可以选择(目前只查询到这两个)
$time_local
输出格式: 01/Jul/2020:10:56:37

$time_iso8601
2020-07-01T11:16:35+08:00

但是上面两种都不是我们想要的,我们想要的是这种格式
yyyy-MM-dd HH:mm:ss
2020-07-01 11:21:00
---


所以需要我们对日志进行设置
nginx中的变量都是全局变量,但是只会对当前共享,所以需要在每一个server中定义出对应的变量,这样在每次日志记录的时候就可以使用这些变量了。
如果觉得这种方法太麻烦,也可以使用自编译的nginx或者openresty,这样可以直接通过lua解决。
这个问题,也可以在源代码中修改格式,因为我们这边是通过yum安装的,同时为了通用性,就选择这种添加变量的方式解决。


如果觉得这段代码稍微有点长,不愿意接受
那么可以单独写一个配置文件,然后使用include的方式倒入

按照日期存放

按天分割日志

if ($time_iso8601 ~ "^(d{4})-(d{2})-(d{2})") {
        set $year $1;
        set $month $2;
        set $day $3;
}
 access_log  /var/logs/nginx/access/$server_name_$year-$month-$day-access.log  main;

按小时、分、秒分割

if ($time_iso8601 ~ "^(d{4})-(d{2})-(d{2})T(d{2}):(d{2}):(d{2})")
{
    set $year $1;
    set $month $2;
    set $day $3;
    set $hour $4;
    set $minutes $5;
    set $seconds $6;
}
access_log  /var/logs/xxxx/access/xxxxx_xx_access_$year-$month-$day-$hour-$minutes-$seconds.log  main;

不记录日志

# 对不需要记录访问日志的server添加这两个代码可以关闭日志记录
server {
	....
	#不记录访问日志
	access_log  off;
	#不记录错误日志
	error_log /dev/null;
	....
}

其他注意事项

1. access日志修改目录后,记得要把访问权限给nginx的对应用户
        chown nginx:nginx /usr/local/nginx/logs/acces
	或者
	chmod -R 777 /usr/local/nginx/logs/acceserror
2. 日志不能使用日期格式,这个没有办法
3. 错误日志虽然不能修改日期格式,但是可以修改文件路径
4. 需要在http下面添加root的对应路径,或者server下面添加,否则比如反向代理这种接口会无法写出日志

转载请注明出处,本文链接是:https://www.889blog.com/2020/07/01/Nginx日志配置和时间格式化/

免责声明:文章转载自《给Nginx配置日志格式和调整日期格式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决:微信小程序富文本识别不了空白p标签的方法服务器虚拟化技术简介下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

浏览器内核Trident/Gecko/WebKit/Presto

“浏览器内核”主要指渲染引擎(Rendering Engine),负责解析网页语法(如HTML、JavaScript)并渲染、展示网页。因此,所谓的浏览器内核通常也就是指浏览器所采用的渲染引擎, 渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏览器内核对网页编写语法的解析也有所不同,因此同一网页在不同的内核浏览器里的渲 染、展示效果也可能...

【nginx】大文件下载

nginx自带文件读取功能,而且实现地很好。 比如直接读取txt文件,png图片等,用chrome可以直接获取到内容。 但是对于很大的文件,比如有2个G的视频,nginx如何吐出2G的内容呢? 实验: 准备很大的MP4文件(比如2G),nginx搭建好webserver,nginx开启access_log选项(log中要包含下载文件大小,http code...

nginx配合IIS实现简单负载均衡

在linux下部署nginx这里就不多说了。这篇文章主要介绍nginx部署好后,如何配合iis实现负载均衡,没用过java不过原理应该是一样的。1.IIS 部署两个站点端口分别为8081和8082 8081站点和8082站点如下【随便写了个没有样式的很丑的页面】,我特意加了111和222区分 2.设置nginx配置文件,实现简单的负载均衡【推荐xsh...

nginx 直接返回状态码

server { listen 80; server_name service.aaa.com; location /{ add_header Content-Type "text/plain;charset=utf-8"; # 上面这个配置为修改浏览器的请求头,为了应对chrome. # 如果不做上面的配置,chrome会直接下载。 return 200...

利用nginx 虚拟主机、请求转发实现不同端口web访问

一个服务器上挂一个网站实在是有点浪费;一个服务器上可以放多个网站;可以开启nginx的虚拟主机功能;利用访问的路径或者域名不同访问不同的文件夹;例如: 1、一台服务器上放多个网站使用nginx的配置文件 这是一个网站的配置文件; server { listen 80; server_name loc...

Vim配置Nginx语法高亮

在日常配置 Nginx 的时候,通常都是在服务器上使用 vim 来操作,但是 vim 操作 nginx.conf 的时候没有语法高亮和格式化。 有时候 nginx.conf 的配置层级很深,这样就会导致 nginx.conf 的缩进格式十分混乱。 其实 Nginx 的安装包中自带了 Vim 的插件,可以让 Vim 支持 nginx.conf 语法。 一般...