log 阶段是http请求处理11个阶段的最后一个阶段。
这个阶段主要靠ngx_http_log_module模块来处理。
功能:把http请求相关信息记录到日志中。
注意:这个模块是没有办法禁用的。
语法:
Syntax: log_format $name [escape=default|json|none] string ...;
Default: log_format combined "...";
Context: http
log_format就是定义日志的格式 ,其默认值是combined,只能出现在http的上下文中。
默认格式:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent ' '"$http_referer"
"$http_user_agent"';
日志文件路径配置
Syntax: access_log $path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
access_log 主要控制日志路径,及是否打开访问日志。format是可选项如果不填,则默认使用log_format也就是默认的combined
path路径里可以包含变量的,比如我们用一个Nginx搭建了好几个域名的服务。默认情况下所有域名的日志都是在同一个日志文件里的。我们可以在path中加上host的变量,这样每个域名都有自己单独的日志文件了。
还可以根据条件判断是否记录请求日志。
日志缓存
功能:如果每次日志都要写入磁盘,那么会频繁引发io调用,所以批量将内存中的日志写入磁盘,可以提升性能。
使用缓存后将日志写入磁盘的时机:
1. 所有待写入磁盘的日志大小超出缓存大小,也就是缓存中的大小超出access_log 中的buffer大小。
2. 达到flush知道的过期时间。比如flush 是1分钟,到了1分钟没有到达buffer大小也会写入磁盘。和redis的设计思想有类似的地方。
3. worker进程执行reopen命令,或正在关闭的时候也会记录日志。
日志还有压缩功能
- 功能:批量压缩内存中的日志后,再写入磁盘。
- buffer大小默认是64KB
- 压缩级别默认是1 (1最快 压缩率最低,9 最慢 压缩率最高)
文件句柄缓存
当我们日志文件名中包含变量时,可能会被经常打开关闭,还有一种优化方案,就是缓存一些文件句柄。
语法
Syntax: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
Default: open_log_file_cache off;
Context: http, server, location
Syntax: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off; Default: open_log_file_cache off; Context: http, server, location
参数详解
- max:缓存内的最大文件句柄数量,超出后用LRU算法淘汰
- inactive:文件访问完后在这段时间内不会被关闭。默认是10秒
- min_uses:在inactive时间内使用次数超过min_uses才会继续存在内存中。
- valid:超出valid时间后,将对缓存的日志文件检查是否存在。默认是60s
- off:关闭缓存功能。
本文暂时没有评论,来添加一个吧(●'◡'●)