使用logrotate定期切割nginx日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 使用logrotate定期切割nginx日志

前言

默认情况下,nginx的日志都会写到access.log文件中,访问流量大的话,日志文件很快就会膨胀到几十G,不方便分析处理,也占用硬盘空间。借助linux自带的logrotate工具可以很方便地实现日志自动分割。

  • nginx日志目录:/usr/local/nginx/logs/

按天切割nginx日志的配置

vim /etc/logrotate.d/nginx

/usr/local/nginx/logs/*.log {
    daily
    size 10M
    minsize 10M
    rotate 30
    missingok
    notifempty
    compress
    nodelaycompress
    copytruncate
    dateext
    dateformat -%Y-%m-%d
    dateyesterday
    postrotate
        if [ -f /usr/local/nginx/logs/nginx.pid ];then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
    endscript
}

配置说明:

  • 按天切割
  • 文件大小为10M的时候才切割
  • 保留最近30天的日志文件
  • 切割中遇到日志错误忽略
  • 日志如果为空将不进行切割和压缩
  • 以gzip压缩
  • 不要将刚切割后的日志文件放到下个循环中进行压缩
  • 切割后的日志文件添加扩展名
  • 扩展名为年月日
  • 扩展名的年月日为昨天的日期
  • 在切割后执行 postrotate/endscript之间的命令,此处为热重启nginx

logrotate常用配置指令

指令 说明
daily 日志归档周期为1天。默认周期
hourly 日志归档周期为1小时
weekly 日志归档周期为1周
monthly 日志归档周期为1月,通常为每月的第一天
size 日志文件可被归档的最小值
minsize 日志文件可被归档的最小值,没到归档周期执行时间,不会执行归档操作
maxsize 日志文件大小超过设定值时,即使没到归档周期执行时间,也会执行归档操作
rotate 保留归档文件数,默认为0
missingok 如果日志文件不存在,则不显示错误信息
nomissingok 如果日志文件不存在,则显示错误信息。默认配置
notifempty 如果日志文件为空,则不进行归档操作。默认配置
ifempty 即使日志文件为空,也执行归档操作
compress 对归档文件启用压缩,默认为gzip压缩
nocompress 不压缩归档文件。默认配置
compresscmd 指定压缩归档文件的命令,默认为gzip压缩
delaycompress 在下一个归档周期再对当前归档文件进行压缩
nodelaycompress 不延迟压缩。默认配置

使用crontab定时执行logrotate

因为系统默认的logrotate规则可能会随机,所以直接删了默认规则,自行定义。

  1. rm -rf /etc/cron.daily/logrotate
  2. 使用crontab -e新建crontab规则:00 00 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx,这样每天凌晨0点0分就会执行nginx日志切割。注意确认logrotate命令的位置。

脚本方式

有的环境也用shell脚本+crontab的方式实现了nginx日志切割

#!/bin/bash
# description: nginx日志切割脚本
set -u
LogDir="/home/admin/apps/openresty/nginx/logs" # nginx日志路径
Expires=15 # 日志保留时长, 15天
function init() {
    if [[ ! -d ${LogDir} ]]; then
        echo "${LogDir} not found"
        exit 1
    fi
}
function main() {
    cd ${LogDir}
    for logfile in $(ls *.log);do
        local logDate=$(date "+%F")
        local gzipfile="${logfile}-${logDate}.gz"
        gzip -c ${logfile} > ${gzipfile}
        cat /dev/null > ${logfile}
    done
    find ./* -type f -mtime +${Expires} -iname "*.gz" | xargs rm -f
}
init
main
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
17天前
|
关系型数据库 MySQL 数据库
DZ社区 mysql日志清理 Discuz! X3.5数据库可以做定期常规清理的表
很多站长在网站日常维护中忽略了比较重要的一个环节,就是对于数据库的清理工作,造成数据库使用量增加必须多的原因一般有2个:后台站点功能开启了家园,此功能现在很少有论坛会用到,但是灌水机会灌入大量垃圾信息致使站长长时间未能发觉;再有就是程序默认的一些通知类表单会存放大量的、对于网站日常运行并无意义的通知信息。
33 2
|
2月前
|
应用服务中间件 nginx
nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
【8月更文挑战第27天】nginx error日志 client intended to send too large body: 1434541 bytes 如何处理?
167 6
|
2月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
2月前
|
存储 监控 应用服务中间件
查看nginx日志文件
器性能和提高网站可用性。掌握日志文件的路径、查看方法和基本分析技能对于任何服务器管理员来说都是必备技能。
99 1
|
2月前
|
存储 Ubuntu 应用服务中间件
如何在 Ubuntu VPS 上配置 Nginx 的日志记录和日志轮转
如何在 Ubuntu VPS 上配置 Nginx 的日志记录和日志轮转
27 4
|
2月前
|
存储 应用服务中间件 nginx
部署ELK+filebeat收集nginx日志
部署ELK+filebeat收集nginx日志
105 0
部署ELK+filebeat收集nginx日志
|
2月前
|
应用服务中间件 Linux nginx
Nginx log 日志文件较大,按日期生成 实现日志的切割
Nginx log 日志文件较大,按日期生成 实现日志的切割
498 0
|
2月前
|
应用服务中间件 nginx
[nginx]日志中记录自定义请求头
[nginx]日志中记录自定义请求头
|
2月前
|
应用服务中间件 Shell nginx
shell分析nginx日志的一些指令
shell分析nginx日志的一些指令
|
应用服务中间件 Apache nginx
nginx自己写日志切割脚本
转自本人的博客:http://blog.teier.cn
1488 0