东莞网站建设定制,wordpress 速度很慢,比价网站开发,wordpress团购主题场景
最近底层api需要上集群#xff0c;于是用nginx做了转发#xff0c;但是随着时间的增长#xff0c;nginx的日志越来越大#xff0c;磁盘空间也顶不住了#xff0c;于是需要对日志进行分割#xff0c;由于nginx原生是不支持日志按天存储和分割的#xff0c;网上也介…场景
最近底层api需要上集群于是用nginx做了转发但是随着时间的增长nginx的日志越来越大磁盘空间也顶不住了于是需要对日志进行分割由于nginx原生是不支持日志按天存储和分割的网上也介绍了通过配置nginx.conf的方式实现按天存储但是经过本地简单测试并未生效而且感觉不是很灵活没有继续深挖。
于是选择了更为强大和灵活的logrotate方式。
logrotate简要介绍
logrotate是一个日志文件管理工具。用于分割日志文件删除旧的日志文件并创建新的日志文件起到“转储”作用。可以节省磁盘空间。 使用logrotate指令可以轻松管理系统所产生的记录文件。每个记录文件都可被设置成每日每周或每月处理也能在文件太大时立即处理。
下面是logrotate的一些重要概念和功能
配置文件logrotate的配置文件位于/etc/logrotate.conf和/etc/logrotate.d/目录下。其中logrotate.conf是主配置文件而/etc/logrotate.d/目录则包含其他应用程序的单独配置文件每个配置文件对应一个应用程序的日志轮转规则。日志轮转规则每个日志文件都可以在配置文件中定义一个轮转规则。这些规则包含了日志文件的路径、轮转周期如每天、每周、每月等以及保留的日志文件数量。预定义选项logrotate提供了一些预定义的选项例如daily每天轮转、weekly每周轮转、monthly每月轮转等。你可以在配置文件中使用这些选项来定义日志文件的轮转周期。轮转方式logrotate支持不同的轮转方式包括copytruncate复制并截断、rotate旋转即重命名并创建新文件等。copytruncate方式会复制当前日志内容到新文件然后截断当前日志文件这样应用程序可以继续写入新文件。postrotate和prerotate在轮转之前或之后logrotate可以运行用户定义的脚本。这在你需要在轮转期间执行额外操作时非常有用比如重新启动服务或压缩旧日志文件。配置检查logrotate提供了一个-d选项可以用来检查配置文件的语法和效果以帮助你确认轮转规则是否按预期工作。手动轮转尽管logrotate会定期自动运行但你也可以通过运行logrotate -f /path/to/config命令来手动触发日志轮转。
首先我们需要在一个镜像镜像中有nginx、cron、logrotate 等软件该镜像的制作和下载可参考:https://blog.csdn.net/weixin_43702146/article/details/131958486
容器内logrotate安装Debian
Linux系统默认安装logrotate工具logrotate是基于cron来运行的其脚本是/etc/cron.daily/logrotate日志轮转是系统自动完成的。
实际运行时logrotate会调用配置文件/etc/logrotate.conf。可以在/etc/logrotate.d目录里放置自定义好的配置文件用来覆盖logrotate的缺省值
docker容器默认是不带logrotate工具的安装步骤可参考:https://blog.csdn.net/weixin_43702146/article/details/131958486
logrotate 使用方式以及参数解释 语法 logrotate [选项] [配置文件] [配置参数] 选项 -d或–debugdebug 模式详细显示指令执行过程测试配置文件是否有错误 -f或–force 强制转储文件 -s状态文件或–state状态文件使用指定的状态文件 -v或–version显示转储过程 -m或–mailcommand 压缩日志后发送日志到指定邮箱。 -usage显示指令基本用法 配置文件 指定lograote指令的配置文件可缺省缺省值为/etc/logrotate.conf 配置参数
指令含义daily每天轮转一次。默认情况下轮转周期是每周一次weekly指定转储周期为每周monthly指定转储周期为每月
指令含义rotate [count]保留旧日志文件的数量。例如rotate 5表示保留最近的5个旧日志文件。
指令含义dateext使用当期日期作为命名格式dateformat .%s配合dateext使用紧跟在下一行出现定义文件切割后的文件名必须配合dateext使用只支持 %Y %m %d %s 这四个参数
指令含义compress通过gzip 压缩转储以后的日志delaycompress在进行轮转时不立即压缩旧日志文件而是推迟一次压缩操作。通常与compress选项一起使用确保应用程序不会在压缩操作进行时无法写入新的日志数据。nocompress不做gzip压缩处理
指令含义create轮转时指定创建新文件的属性默认与之前的权限一致也可自定权限和组如create 640 nobody nobodynocreate不建立新的日志文件
指令含义size [size]当日志文件大小达到指定大小时触发轮转。可以使用k表示KBM表示MBG表示GB。例如size 100M表示日志文件大小达到100MB时进行轮转maxsize [size]设置日志文件的最大大小。一旦日志文件大小超过此限制将强制进行轮转。与size选项不同的是maxsize不会触发定期轮转它仅在日志文件大小超过限制时才生效minsize [size]设置日志文件的最小大小。如果日志文件大小小于此限制则不会进行轮转
指令含义ifempty即使日志文件为空文件也做轮转这个是logrotate的缺省选项notifempty只在日志文件非空时才进行轮转。如果日志文件为空logrotate不会执行轮转操作missingok如果日志文件不存在也不会报错。logrotate会继续执行其他轮转规则
指令含义postrotate [command] endscript在轮转之后postrotate 和 endscript 里面指定的命令将被执行通常用于重新启动服务或执行其他额外的操作prerotate [command] endscript在轮转之前prerotate 和 endscript 里面指定的命令将被执同样也可用于执行一些预处理操作sharedscripts在执行postrotate和prerotate时只运行一次共享脚本而不是每个日志文件分别执行dateyesterday在执行postrotate或prerotate时使用昨天的日期
指令含义copytruncate在轮转时将当前日志文件复制到新文件然后截断当前日志文件。这使得应用程序可以继续写入当前文件而不会受到日志文件名变化的影响nocopytruncate不使用复制并截断方式。旧日志文件会被重命名这可能导致应用程序无法继续写入日志
指令含义errors [address]专储时的错误信息发送到指定的Email 地址mail [address]把转储的日志文件发送到指定的E-mail 地址nomail转储时不发送日志文件
指令含义olddir [directory]转储后的日志文件放入指定的目录必须和当前日志文件在同一个文件系统noolddir转储后的日志文件和当前日志文件放在同一个目录下
使用logrotate测试切割
编辑配置文件
编辑文件 /etc/logrotate.d/nginx以下是一个简要按天存储的配置
/var/log/nginx/*.log {# 每天轮转daily# 忽略错误missingoknotifempty# 保留最近7个rotate 7# 禁用gzip压缩delaycompress# 创建新的文件create# 轮转后的日志文件后缀名为日期dateext# 轮转后执行脚本sharedscriptspostrotateif [ -f /var/run/nginx.pid ]; thenkill -USR1 cat /var/run/nginx.pidfiendscript
}修改状态文件
注意当手动执行logrotate /etc/logrotate.conf时执行之后并不会切割log文件。
logrotate的工作原理大概是每次切割操作、或首次切割会记录所有log文件的时间点在状态文件内 /var/lib/logrotate/status。
下一次执行的时候如果判断时间减去记录的时间已经超过一定时长配置的时间那么就会执行切割。
所以如果你想马上切割需要自己修改状态文件把时间改为1天前再执行。
修改状态文件vim /var/lib/logrotate/status
logrotate state -- version 2
/var/log/nginx/error.log 2023-8-7-22:35:37
/var/log/nginx/access.log 2023-8-7-22:35:37交互执行日志轮转logrotate -vf /etc/logrotate.d/nginx
root75e7c81b599d:/# logrotate -vf /etc/logrotate.d/nginx
reading config file /etc/logrotate.d/nginx
Creating stub state file: /var/lib/logrotate/status
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entriesHandling 1 logsrotating pattern: /var/log/nginx/*.log forced from command line (7 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
Creating new stateNow: 2023-08-07 22:35Last rotated at 2023-08-07 22:00log needs rotating
considering log /var/log/nginx/error.log
Creating new stateNow: 2023-08-07 22:35Last rotated at 2023-08-07 22:00log needs rotating
rotating log /var/log/nginx/access.log, log-rotateCount is 7
dateext suffix -20230807
glob pattern -[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
rotating log /var/log/nginx/error.log, log-rotateCount is 7
dateext suffix -20230807
glob pattern -[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
renaming /var/log/nginx/access.log to /var/log/nginx/access.log-20230807
creating new /var/log/nginx/access.log mode 0644 uid 101 gid 0
renaming /var/log/nginx/error.log to /var/log/nginx/error.log-20230807
creating new /var/log/nginx/error.log mode 0644 uid 101 gid 0
running postrotate script发现指定目录下的日志已经变成了
-rw-r--r-- 1 101 root 40745 Aug 7 22:41 access.log
-rw-r--r-- 1 root root 3173 Aug 7 14:32 access.log-20230806
-rw-r--r-- 1 101 root 61823 Aug 7 22:31 access.log-20230807
-rw-r--r-- 1 101 root 357 Aug 7 22:37 error.log
-rw-r--r-- 1 root root 2635 Aug 7 14:49 error.log-20230806
-rw-r--r-- 1 101 root 15466 Aug 7 22:35 error.log-20230807配合定时任务完成每天轮转
启动定时任务
service cron startcrontab语法
crontab [-u user] file
或者
crontab [-u user] [ -e | -l | -r ]参数说明:
-u user 是指设定指定 user 的时程表这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话就是表示设定自己的时程表。-e 执行文字编辑器来设定时程表-l 列出目前的时程表-r 删除目前的时程表(慎用)
设置每天0点执行日志轮转
crontab -e在弹出的编辑器内输入如下内容
59 23 * * * /usr/sbin/logrotate -f /home/zmq/daily_logrotatecrontab -l查看当前定时任务
root75e7c81b599d:/# crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use * in these fields (for any).
#
# Notice that tasks will be started based on the crons system
# daemons notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx