Nicksxs's Blog

What hurts more, the pain of hard work or the pain of regret?

0%

# nginx 日志小记

发表于 2022-04-17 分类于 nginx 阅读次数： 阅读次数： Disqus：

nginx 默认的日志有特定的格式，我们也可以自定义，

默认的格式是预定义的 combined

    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

而如果需要额外的一些配置的话可以自己定义 `log_format` ，比如我想要给日志里加上请求时间，那就可以自己定义一个 `log_forma`t 比如添加下

    $request_time
    request processing time in seconds with a milliseconds resolution;
    time elapsed between the first bytes were read from the client and the log write after the last bytes were sent to the client

    log_format combined_extend '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" "$request_time"';

然后其他的比如还有 gzip 压缩，可以设置压缩级别，flush 刷盘时间还有根据条件控制

这里的条件控制简单看了下还比较厉害

比如我想对2xx 跟 3xx 的访问不记录日志

    map $status $loggable {
        ~^[23]  0;
        default 1;
    }

    access_log /path/to/access.log combined if=$loggable;

当 `$loggable` 是 0 或者空时表示 if 条件为否，上面的默认就是 1，只有当请求状态 status 是 2xx 或 3xx 时才是 0，代表不用记录，有了这个特性就可以更灵活地配置日志

文章主要参考了 nginx 的 log 模块的文档