nginx日志按天优化

  • 前言:
    接着上一篇文章《记一次nginx拦截爬虫》,发现服务器nginx日志非常不好看,时间长了一大堆都在一个文件里边(甚至几年的),对于我这种linux小白就不友好了,所以想把日志分文件,这样至少我们去查看日志的时候会方便很多:

    按天分文件

    直接上nginx.conf配置
user nginx;
worker_processes 2;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include  /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_iso8601] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time';

    #引入time_iso8601模块 设置时间 日期变量
    map $time_iso8601 $logdate {
        #'~^(?<ymdh>\d{4}-\d{2}-\d{2}T\d{2})' $ymdh;
        '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
        default 'date-not-found';
    }

    #日志存放目录
    access_log /var/log/nginx/access-$logdate.log main;

    #日志缓存,将多个日志进行积累,达到一定量级后写入到磁盘,可以减少磁盘旋转,从而降低磁盘i/o,提升nginx能效
    open_log_file_cache max=10;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    #隐藏http版本号
    server_tokens off;
}

这样就会按照天生成日志文件;这里边最重要的就是引入$time_iso8601(这个是nginx里边自带的一个时间格式)进行自定义变量,不需要额按编译。

日期格式优化

  • nginx自带两种时间格式:
    $time_iso8601 形如 2023-03-29T16:58:49+08:00
    $time_local 形如 14/Nov/2022:08:28:14 +0000
    可以看出$time_local的格式看起来不是很美妙,对于我自己来说肯定按照 ‘年月日时分秒’ 这样看更顺眼一些,所以我们在自定义日志格式的时候,时间格式也是选择的是$time_iso8601

  • 时间怎么和我们本地时间一致
    时间格式顺眼了,但是发现时间还是UTC时区的时间,怎么处理呢:
    我这边使用的是docker-compose,可以直接配置环境变量。

version: '3'
services:
  d_nginx:
    container_name: c_nginx
    environment:
      TZ: 'Asia/Shanghai'

第二种就是Dockerfile中编译,一劳永逸。

FROM nginx:1.20.1-alpine
#定义时区参数
ENV TZ=Asia/Shanghai

有一些低版本的nginx做了以上两步还是不得行,有可能是因为缺少了tzdata时区数据包。

FROM nginx:1.12.1-alpine
#将alpine的源更换成阿里云的源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
#定义时区参数
ENV TZ=Asia/Shanghai
#安装时区数据包 
RUN apk add --update tzdata
#设置时区 
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone

经过上边的步骤nginx日志里边的格式和时间应该就是我自己想要的了。

给大家分享一个nginx日志分析工具

《goaccess》
goaccess nginx.log -a > nginx.html
这个工具能方便快速的分析nginx日志,能可视化的展示很多信息,帮助我们快速定位问题;比如接口的调用量(具体到某一个接口),访问者数量等等。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

cat /etc/logrotate.d/nginx

如果你使用宝塔

/www/wwwlogs/*.log {
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /www/server/nginx/logs/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

如果是默认的

/var/log/nginx/*log {
    create 0664 nginx root
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!