通过logrotate实现nginx容器内日志按天存储

场景

最近底层api需要上集群,于是用nginx做了转发,但是随着时间的增长,nginx的日志越来越大,磁盘空间也顶不住了,于是需要对日志进行分割,由于nginx原生是不支持日志按天存储和分割的,网上也介绍了通过配置nginx.conf的方式实现按天存储,但是经过本地简单测试并未生效,而且感觉不是很灵活,没有继续深挖。

于是选择了更为强大和灵活的logrotate方式。

logrotate简要介绍

logrotate是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间。 使用logrotate指令,可以轻松管理系统所产生的记录文件。每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。

下面是logrotate的一些重要概念和功能:

  1. 配置文件:logrotate的配置文件位于/etc/logrotate.conf和/etc/logrotate.d/目录下。其中,logrotate.conf是主配置文件,而/etc/logrotate.d/目录则包含其他应用程序的单独配置文件,每个配置文件对应一个应用程序的日志轮转规则。
  2. 日志轮转规则:每个日志文件都可以在配置文件中定义一个轮转规则。这些规则包含了日志文件的路径、轮转周期(如每天、每周、每月等)以及保留的日志文件数量。
  3. 预定义选项:logrotate提供了一些预定义的选项,例如daily(每天轮转)、weekly(每周轮转)、monthly(每月轮转)等。你可以在配置文件中使用这些选项来定义日志文件的轮转周期。
  4. 轮转方式:logrotate支持不同的轮转方式,包括copytruncate(复制并截断)、rotate(旋转,即重命名并创建新文件)等。copytruncate方式会复制当前日志内容到新文件,然后截断当前日志文件,这样应用程序可以继续写入新文件。
  5. postrotate和prerotate:在轮转之前或之后,logrotate可以运行用户定义的脚本。这在你需要在轮转期间执行额外操作时非常有用,比如重新启动服务或压缩旧日志文件。
  6. 配置检查:logrotate提供了一个-d选项,可以用来检查配置文件的语法和效果,以帮助你确认轮转规则是否按预期工作。
  7. 手动轮转:尽管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或–debug:debug 模式,详细显示指令执行过程,测试配置文件是否有错误
    -f或–force :强制转储文件
    -s<状态文件>或–state=<状态文件>:使用指定的状态文件
    -v或–version:显示转储过程
    -m或–mail=command :压缩日志后,发送日志到指定邮箱。
    -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 nobody
nocreate不建立新的日志文件
指令含义
size [size]当日志文件大小达到指定大小时触发轮转。可以使用k表示KB,M表示MB,G表示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.pid`fiendscript
}

修改状态文件

注意,当手动执行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

root@75e7c81b599d:/# 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 start

crontab语法

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_logrotate

crontab -l查看当前定时任务:

root@75e7c81b599d:/# 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 cron's system
# daemon's 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/26480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus是什么以及特性[MyBatis-Plus系列] - 第481篇

​ 悟纤&#xff1a;师傅&#xff0c;宝宝不开心呢。 师傅&#xff1a;怎么不开心&#xff1f; 悟纤&#xff1a;感觉好多重复的代码来着。 师傅&#xff1a;是哪个部分重复的代码来着&#xff1f; 悟纤&#xff1a;就是对于一个model的增删改查部分。 师傅&#xff1a;那这…

1 swagger简单案例

1.1 加入依赖 <!--swagger图形化接口--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency><dependency><groupId>io.spri…

dotConnect for DB2 Crack

dotConnect for DB2 Crack dotConnect for DB2是一个增强的DB2 ORM数据提供程序&#xff0c;它构建在ADO.NET技术和IBM DB2.NET数据提供程序之上&#xff0c;为开发基于DB2的数据库应用程序提供了一个完整的解决方案。它允许您轻松地将DB2数据与广泛使用的面向数据的技术集成&a…

SpringBoot统一功能处理

我们要实现以下3个目标&#xff1a; 统一用户登录权限统一数据格式返回统一异常处理 1.用户的登录权限校验 1.1Spring AOP用户统一登录验证问题 Aspect Component public class UserAspect {// 定义切点controller包下、子孙包下所有类的所有方法Pointcut("execution(…

详解Gillespie算法:使用Python构建分子化学模拟及其在随机多智能体动力学中的应用

第一部分:Gillespie算法简介 Gillespie算法是一种利用蒙特卡洛抽样模拟化学体系随机动力学行为的方法[3]。它是由Joseph L. Doob提出的,用于生成具有已知反应速率的随机方程组的统计上正确的轨迹(可能的解)[5]。在本文中,我们将详细介绍Gillespie算法的原理,并使用Pytho…

机器学习中的工作流机制

机器学习中的工作流机制 在项目开发的时候&#xff0c;经常需要我们选择使用哪一种模型。同样的数据&#xff0c;可能决策树效果不错&#xff0c;朴素贝叶斯也不错&#xff0c;SVM也挺好。有没有一种方法能够让我们用一份数据&#xff0c;同时训练多个模型&#xff0c;并用某种…

【笔记】移动光猫改桥接

1. 登录后台 移动光猫的超管和密码&#xff08;百度的&#xff09; 账号&#xff1a;CMCCAdmin 密码&#xff1a;aDm8H%MdA 浏览器访问 192.168.1.1 并登录 2. 选择连接 点击“网络”&#xff0c;在“连接名称”下拉框选择 INTENET_R_VID 字样的连接&#xff0c;并截图备…

【GPT-3 】创建能写博客的AI工具

一、说明 如何使用OpenAI API&#xff0c;GPT-3和Python创建AI博客写作工具。 在本教程中&#xff0c;我们将从 OpenAI API 中断的地方继续&#xff0c;并创建我们自己的 AI 版权工具&#xff0c;我们可以使用它使用 GPT-3 人工智能 &#xff08;AI&#xff09; API 创建独特的…

84 | Python可视化篇 —— Pyecharts数据可视化

文章目录 1. 简介安装和环境设置2. 基本图表类型折线图(Line Chart)散点图(Scatter Plot)柱状图(Bar Chart)饼图(Pie Chart)地理地图(Geo Map)3. 数据处理和图表配置4. 高级图表类型5. 自定义选项和交互性6. 数据可视化和动态图7. 组合图表和多子图1. 简介 Pyechart…

js修改img的src属性显示变换图片到前端页面,img的src属性显示java后台读取返回的本地图片

文章目录 前言一、HTML 图像- 图像标签&#xff08; <img>&#xff09;1.1图像标签的源属性&#xff08;Src&#xff09;1.2图像标签源属性&#xff08;Src&#xff09;显示项目中图片1.3图像标签源属性&#xff08;Src&#xff09;显示网络图片 二、图像标签&#xff08…

了解Swarm 集群管理

Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API&#xff0c;所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。 支持的工具包括但不限…

前端安全XSS和CSRF讲解

文章目录 XSSXSS攻击原理常见的攻击方式预防措施 CSRFCSRF攻击原理常见攻击情景预防措施&#xff1a; CSRF和XSS的区别 XSS 全称Cross Site Scripting&#xff0c;名为跨站脚本攻击。为啥不是单词第一个字母组合CSS&#xff0c;大概率与样式名称css进行区分。 XSS攻击原理 不…

框框大学之——教育技术学

清一色劝退的教育技术学。。。。。。 https://www.kkdaxue.com/?current1&major%E6%95%99%E8%82%B2%E6%8A%80%E6%9C%AF%E5%AD%A6&pageSize10&sortFieldcreateTime&sortOrderdescend 总结&#xff1a; 1 杂而不经 2 摆烂劝退居多 3 适合躺平 4 考公不行 5 要多…

python 将excel 多行进行分组合并

def exc():"""# 需要用到分组的概念:将角色和业务单据的进行分组,结果合并为一行"""df pd.read_excel(test33.xlsx)# 设置需要分组的字段cols [姓名, 科目]#agg() 其中的参数字段为之后输出的表格中的列字段df df.groupby(cols).agg({姓名: f…

在GitHub上管理和协作的完全指南

介绍 GitHub 是一个强大的版本控制和协作平台&#xff0c;它不仅可以帮助你管理和跟踪项目的变化&#xff0c;还可以与他人进行协作。本文将详细介绍如何使用 GitHub 的各种功能来管理和协作项目。 目录 注册GitHub账号创建和管理仓库 创建仓库添加和管理文件分支管理合并请…

Python数据容器——列表(list)

数据容器入门 Python中的数据容器&#xff1a; 一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素 每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a;是否支持重复元…

Wordpress升级版本后插件和主题常见出错及处理方法整理【持续更新】

Wordpress报错怎么解决&#xff1f; 一般常用的排查方法&#xff1a; 暂时禁用所有插件&#xff1b;将主题更改为默认主题&#xff1b; 修改wp-config.php文件&#xff1b;更新固定链接设置&#xff0c;确保设置正确&#xff1b;检查.htaccess文件是否存在且是否可写&#xf…

QtAV for ubuntu16.04

下载ubuntu https://releases.ubuntu.com/16.04/ubuntu-16.04.7-desktop-amd64.iso 下载ffmpeg https://ffmpeg.org/download.html 下载QtAV https://github.com/wang-bin/QtAV/releases 更新 sudo apt update 安装库 sudo apt-get install libglu1-mesa-dev freeglut3-dev…

ETHERCAT转PROFIBUS连接到300plc的配置方法

由于捷米JM-DP-ECT&#xff0c;是自主研发的一款PROFIBUS从站功能的通讯网关&#xff0c;它的主要功能是将ETHERCAT设备接入到PROFIBUS网络中生产环境比较复杂有多个设备采用不同的协议这极大的阻碍了&#xff0c;各个设备的数据互通。 JM-DP-ECT这个小小的网关可不简单&#x…

SpringCloud项目打包注意事项以及可能出错的几种情况

SpringCloud项目打包注意事项和可能出错的几种情况 1、检查子模块中的 parent的pom文件路径 \<relativePath/\>2、检查打包插件的位置3、检查module是否重复引用 欢迎访问我的个人博客&#xff1a;https://wk-blog.vip 1、检查子模块中的 parent的pom文件路径 <relat…