- 前言:
接著上一篇文章《記一次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 協議》,轉載必須註明作者和本文連結