0


logrotate对nginx做日志切割-实现按照每天切割

logrotate简述

logrotate程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间。

通过在/etc/logrotate.d/ 目录下进行自定义配置相关参数,从而达到想要的切割日志方案。

准备环境

1.检查当前系统是否存在logrotate

rpm -qa logrotate

2.安装logrotate

yum -y install logrotate

注:一般centos系统默认会安装有logrotate

logrotate目录

/etc/logrotate.conf # logrotate主配置文件
/usr/sbin/logrotate # logrotate二进制文件
/etc/logrotate.d/ # 自定义logrotate配置文件
/var/lib/logrotate/logrotate.status # logrotate管理日志执行记录的状态文件

说明:如果您在

logrotate.d

目录下配置了Nginx的轮转规则,那么需要等待

logrotate.conf

指定的执行周期。默认logrotate.conf指定周期是一周。

可以查看logrotate.conf文件 cat /etc/logrotate.conf

see "man logrotate" for details

global options do not affect preceding include directives

rotate log files weekly

weekly # 每周执行一次轮转存储

keep 4 weeks worth of backlogs

rotate 4 # 保存4个文件,意思就是只保存四周的日志文件也就是一个月

create new (empty) log files after rotating old ones

create # 轮转后,创建一个新的空文件,指定logrotate自动建立新的日志文件,新的日志文件具有和原来的文件一样的权限。

use date as a suffix of the rotated file

dateext # 使用当期日期作为轮转日志的后缀名

uncomment this if you want your log files compressed

#compress

packages drop log rotation information into this directory

include /etc/logrotate.d # 将 /etc/logrotate.d/ 目录中的所有文件都加载进来

system-specific logs may be also be configured here.

logrotate命令参数说明

-d, --debug :debug模式,测试配置文件是否有错误。

-f, --force :强制转储文件。

-m, --mail=command :压缩日志后,发送日志到指定邮箱。

-s, --state=statefile :使用指定的状态文件。

-v, --verbose :显示转储过程。

logrotate -d /etc/logrotate.d/nginx # 查看配置好的nginx文件是否有错误 如果有错误会出现 skipping 关键字

logrotate -vf /etc/logrotate.d/nginx # 立即执行配置好的nginx文件,并显示执行信息

logrotate文件编写常用参数

compress                                   通过gzip 压缩转储以后的日志
nocompress                                不做gzip压缩处理
copytruncate                              用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate                           备份日志文件不过不截断
create mode owner group             轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate                                    不建立新的日志文件
delaycompress                           和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress                        覆盖 delaycompress 选项,转储同时压缩。
missingok                                 如果日志丢失,不报错继续滚动下一个日志
errors address                           专储时的错误信息发送到指定的Email 地址
ifempty                                    即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty                               当日志文件为空时,不进行轮转
mail address                             把转储的日志文件发送到指定的E-mail 地址
nomail                                     转储时不发送日志文件
olddir directory                         转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir                                   转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts                           运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate                                 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate                               在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
daily                                       指定转储周期为每天
weekly                                    指定转储周期为每周
monthly                                  指定转储周期为每月
rotate count                            指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
dateext                                  使用当期日期作为命名格式
dateformat .%s                       配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数,是时间戳的形式命名
size(或minsize) log-size            当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
size = 5 或 size 5 (>= 5 个字节就转储)
size = 100k 或 size 100k
size = 100M 或 size 100M

说明:如果参数不选择dateext 切割的日志文件命名是access.log.1,access.log.2依次类推,选择了dateext参数,access.log.20230918这样安装当前日期命名。

copytruncate 和 create 两种方式只能选一个

copytruncate 方式是将日志文件复制一份后清空原日志文件的内容,并对复制的文件进行归档操作,应用程序继续向原日志文件输出日志。因日志文件复制与清空操作存在时间间隔,所以切割操作会因日志量的大小及实时产生的频率存在丢失的情况;

create 方式是将日志文件重命名,因日志文件的 inode 编号不变,应用程序会向新命名的文件输出日志。Logrotate 新创建原日志文件名的文件后执行重启或以信号机制通知应用程序重新向新日志文件输出日志内容,完成切割操作;

logrotate实际举例

在进行logrotate编写nginx日志切割配置之前,应该先对nginx的配置做处理(nginx.conf)

配置nginx的access.log、error.log日志输出位置

    # 自定义access.log的保存的信息
    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       /data/nginx_logs/access.log main;
    error_log        /data/nginx_logs/error.log;

自定义access.log日志的参数信息说明:这个也是nginx自带的,只是现在把它的前面的注释取消了。

  • $remote_addr: 记录客户端的IP地址。
  • $remote_user: 记录客户端用户(如果有)。
  • [$time_local]: 记录请求的时间和日期(本地时间)。
  • "$request": 记录包含HTTP请求方法、URI和协议的字符串。
  • $status: 记录服务器响应的状态码。
  • $body_bytes_sent: 记录发送给客户端的响应体字节数。
  • "$http_referer": 记录引用页面的URL。
  • "$http_user_agent": 记录客户端浏览器或用户代理的信息。
  • "$http_x_forwarded_for": 记录通过代理服务器转发请求时的客户端真实IP地址。

大家重新配置了之后需要重启nginx。

1. 在/etc/logrotate.d目录下新建一个logrotate配置如:nginx

vim /etc/logrotate.d/nginx

2. 填写如下配置

/data/nginx_logs/*.log { # 对某个日志文件进行切割,这里填路径

    daily                # 按天切割
    missingok            # 如果日志丢失,不报错继续滚动下一个日志
    ifempty              # 空的文件也做切割
    rotate 180           # 备份数量180 其实也就是按天保存的话是180天
    dateext              # 切割后日志文件名+当前日志
    nocompress           # 不做压缩
    create 0644 nginx nginx # 创建一个新的并赋予权限 用户nginx 用户组nginx
    olddir /data/nginx_logs/days # 日志切割后存放路径
    sharedscripts
    postrotate 
      if [ -f /usr/local/nginx/logs/nginx.pid ]; then 
 
         kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    
      fi
    endscript
}

一般nginx.pid 在默认nginx日志文件夹下面

说明:postrotate 后面代码的含义:首先检查是否存在

/usr/local/nginx/logs/nginx.pid

文件,如果存在,则使用

kill -USR1

命令向Nginx主进程发送

USR1

信号来重新打开日志文件。这个操作可以使Nginx重新打开日志文件,实现日志切割效果而不需要重启Nginx服务。

注: kill -USR1 cat /usr/local/nginx/logs/nginx.pid 这个不是单引号,是反引号。

3. 检查是否配置有问题

logrotate -d /etc/logrotate.d/nginx

4. 测试

当你编辑好了,可以先直接执行

logrotate -f /etc/logrotate.d/nginx

查看你对应的文件是否保存对应日志文件

5. 配置定时任务

说明:为什么要配置定时任务?是因为logrotate.d下配置的日志轮转方案,是在logrotate.conf执行的时候才会执行,而logrotate.conf默认执行是按周执行一次,即使在Nginx的轮转规则中设置了每天一次的轮转频率,但仍然需要等待logrotate.conf的执行周期才会触发轮转操作。因为logrotate.conf是整个系统日志轮转的主配置文件,它会覆盖logrotate.d目录下的子配置文件。

方式一:直接配置logrotate的定时任务

crontab -e

如下配置:

每天凌晨执行

0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx

cront时间配置说明,注意有空格

command是路径

还有一种方式是写一个shell脚本定时去执行这个shell脚本,而这个shell脚本里面配置执行logrotate

方式二:通过shell代替

cd /data/nginx_logs

mkdir sh

vim nginx_logs.sh

#!/bin/bash
/usr/sbin/logrotate -vf /etc/logrotate.d/nginx

给nginx_logs.sh赋予执行权限

chmod +x /data/nginx_logs/sh/nginx_logs.sh

配置定时任务

crontab -e

0 0 * * * /data/nginx_logs/sh/nginx_logs.sh

达到的效果和方式一 一致。

6. 测试

你可以先设置定时任务执行时间,每分钟执行一次,这样就能检查到定时任务是否有问题。

每分钟执行

          • /usr/sbin/logrotate -vf /etc/logrotate.d/nginx

7. 查看定时任务

crontab -l

8. 检查cron日志

如果上述的切割没执行成功,可以检查cron的日志。检查定时任务是否存在错误。

cat /var/log/cron

参考:Nginx日志切割及配置_nginx日志切割配置_tag心动的博客-CSDN博客

Linux Logrotate日志切割管理_日志是每天分割_小百菜的博客-CSDN博客

标签: nginx linux 运维

本文转载自: https://blog.csdn.net/m0_52985087/article/details/132977490
版权归原作者 荒Huang 所有, 如有侵权,请联系我们删除。

“logrotate对nginx做日志切割-实现按照每天切割”的评论:

还没有评论