1、概述 nginx切割日志的方式有多种,例如定时任务脚本重命名日志、lograte工具自动切割日志等 这些方式在平常都可以满足日志切割的,但是在高并发的web访问的情况下,如果每天0:00开始切割日志,会有部分前一天的日志打印到新的日志文件中,另外当web中日志文件 较多时,通过脚本或工具的方式切割的效率较低。 2、解决方案 方案一;配置文件自定义nginx变量,日志文件调整为按日期的变量。
server {
listen 80;
server_name localhost;
charset utf-8;
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
}
access_log log/front.access_$year$month$day.log main;
方案二: 用tengine代替nginx 方式一:tengine的变量属性,可以做到分钟级别以及秒级别切割日志 access_log log/access_$year$month$day$hour$minute.log main; 方式二:异步日志打印回滚: 日志pipe功能使用独立进程打印日志,不会阻塞worker进程,worker进程与独立日志进程间通过pipe进行通讯,rollback功能依赖日志pipe功能,提供基于tengine自身的日志回滚功能,支持,按照时间间隔、文件大小进行回滚,并支持配置,backup文件的个数。日志回滚模块会按照配置的条件将log文件rename成backup文件,然后重新写新日志文件 logpath: 日志输出路径 interval:日志回滚间隔,默认0(永不回滚) baknum:backup文件保留个数,默认1(保留1个) maxsize:log文件最大size,默认0(永不回滚) adjust: 按时间回滚时,回滚时间随机延后,用于规避集群同时触发回滚动作,默认60 (60s) http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log "pipe:rollback logs/access_log interval=1h baknum=5 maxsize=2G" main; } (责任编辑:liangzh) |