通过logrotate实现nginx容器内日志按天存储
场景
最近底层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或–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
相关文章:

通过logrotate实现nginx容器内日志按天存储
场景 最近底层api需要上集群,于是用nginx做了转发,但是随着时间的增长,nginx的日志越来越大,磁盘空间也顶不住了,于是需要对日志进行分割,由于nginx原生是不支持日志按天存储和分割的,网上也介…...

广东珠海电子行业导入MES系统需要注意什么
一、电子行业工厂的生产特征 1.高度自动化: 电子行业的生产车间大多采用高度自动化的生产设备制造工艺。自动化流水线能够实现高效、精准和连续的生产过程,提升产品完整性和生产率。 2.多样化和个性化定制需求: 电子产品市场的需求多样化&…...

小红书2023/08/06Java后端笔试 AK
T1(模拟、哈希表) #include <bits/stdc.h>using namespace std;typedef long long LL; typedef pair<string, int> PSI;const int N 1e5 10;void solve() {string line, t;getline(cin, line);line ;vector<PSI> ans;unordered_m…...

3、有序数组的平方
有一个有序数组从大到小排列:-10 -5 1 2 3 4,将他们的每一项平方,然后再形成新的有序数组。 解法:双指针 因为前面是负数,后面是正数,平方和的最大值一定是从两端取得,所以可以定义一个头指针和…...

用于自然语言处理 (NLP) 的 MLOps
介绍 自然语言处理( NLP )的人工智能关注的是计算机和人们如何用日常语言进行交流。鉴于 NLP 模型在生产系统中的部署,我们需要简化 NLP 应用程序的不断使用,从而使 MLOps(机器学习操作)对 NLP 有所帮助。在生产系统中自动创建、训练、测试和部署 NLP 模型是 MLOps for …...

C#抽象静态方法
抽象静态方法 在C# 11中,引入了对抽象静态接口成员的支持。这个特性可以让你在接口中定义静态抽象方法、属性、或事件。具体来说,一个接口可以定义一个或多个抽象静态成员,这些成员没有具体的实现。任何实现该接口的类或结构必须提供这些成员…...

小研究 - Mysql快速全同步复制技术的设计和应用(一)
Mysql半同步复制技术在高性能的数据管理中被广泛采用,但它在可靠性方面却存在不足.本文对半同步复制技术进行优化,提出了一种快速全同步复制技术,通过对半同步数据复制过程中的事务流程设置、线程资源合理应用、批量日志应用等技术手段&#…...

HTML <samp> 标签
定义和用法 以下元素都是短语元素。虽然这些标签定义的文本大多会呈现出特殊的样式,但实际上,这些标签都拥有确切的语义。 我们并不反对使用它们,但是如果您只是为了达到某种视觉效果而使用这些标签的话,我们建议您使用样式表&a…...

C之(8)linux动态库编译框架
C之(8)Linux动态库编译基础框架 Author: Once Day Date:2023年8月5日 漫漫长路,有人对你微笑过嘛… 参考引用文档: VERSION (LD) (sourceware.org)Warning Options (Using the GNU Compiler Collection (GCC))All about symbo…...

Zabbix网络拓扑配置
一、简介 网络拓扑功能是一项非常重要的功能,它可以直观展示网络设备主机状态及端口传输速率等指标信息,帮助运维人员快速发现和定位故障问题;Zabbix同样配备了强大的网络拓扑功能,如何使用Zabbix拓扑图功能创建一个公司网络拓扑…...
2.4G芯片XL2408开发板,SOP16封装,芯片集成1T 8051内核单片机
XL2408开发板可用于2.4G芯片XL2408开发板的开发调试。XL2408烧录仿真需要使用WS_LINK。XL2408开发板烧录仿真需要接4根线:PA13:DIO,PA14:CLK,VCC,GND。 XL2408芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块,…...

iPhone苹果手机地震预警功能怎么开启?
iPhone苹果手机地震预警功能怎么开启? 1、打开iPhone苹果手机设置; 2、在iPhone苹果手机设置内找到辅助功能; 3、在辅助功能内找到触控; 4、在iPhone苹果手机辅助功能触控内找到振动,如果是关闭状态请启; …...

Storm学习之使用官方Docker镜像快速搭建Storm运行环境
文章目录 0.前言搭建完的效果 1.教程1.1.docker 安装 zookeeper1.2. 安装 storm nimbus1.3.docker 安装 supervisor1.4.docker 安装 storm-ui1.5.查看已经启动的容器1.6.提交topology到 storm集群 2.总结3.参考文档 0.前言 Apache Storm 官方也出了Docker 镜像 https://hub.do…...

【GTest学习】
1. GTest简介: GTest 就是 Google Test, 它是一个免费开源的测试框架, 用于编写测试用 C语言编写的程序(C 程序也能用, 但是需要用 C编译器编译)。gtest的官方网站是:http://code.google.com/p/googletest/ 2.GTest下载与环境搭建: GTest 下…...

[JAVAee]网络通信基础
目录 IP地址 端口号 网络协议 五元组 TCP/IP五层模型 网络互连之间的目的就是为了相互通信,传输数据,是可以不同进程间的基于网络的数据传输. 而IP就可以确定网络通信的双方. IP地址 IP地址主要用于定位标识网络主机或其他网络设备的网络地址.(就像快递的收货地址一般…...

【HDFS】BlockManager#checkRedundancy方法详解
BlockManager#checkRedundancy这个方法只有一处调用点, 就是FSNamesystem#finalizeINodeFileUnderConstruction方法。 TODO:补充FSNamesystem#finalizeINodeFileUnderConstruction方法的调用点。 checkRedundancy方法的参数的BlockCollection对象bc,解释一下,INodeFile类是…...

c++ 拷贝构造
我们思考一下这个问题: 观察以下代码,在运行的时候会崩溃 想一想为什么 #include<iostream> using namespace std;//栈类 typedef int DataType; class Stack { public://默认构造:Stack(size_t capacity 3){_array (DataType*)ma…...

MISRA 2012学习笔记(1)-Directives
文章目录 说明Directives2 编译与构建Dir 2.1 3 需求可追溯性Dir 3.1 4 代码设计Dir 4.1Dir 4.2Dir 4.3Dir 4.4Dir 4.5Dir 4.6Dir 4.7Dir 4.8Dir 4.9Dir 4.10Dir 4.11Dir 4.12Dir 4.13 说明 以下等级一般分为三种,建议,必要,强制 建议&#…...

升级node版本后vue2的项目node-sass、sass-loader安装报错(14.x升级到16.x)
node升级到16.x版本后,对应的node-sass需要升级到^6.0.0,此时sass-loader的版本需要升级到10.2.0以上 ,具体对应版本规则可参考链接: https://github.com/webpack-contrib/sass-loader/releases?page3 vue2通过vue/cli创建的项目࿰…...

深入理解CSS选择器:选择正确的方式掌控样式与布局
文章目录 CSS 概括CSS 选择器元素选择器(Element Selector)类选择器(Class Selector)ID 选择器(ID Selector)通用选择器(Universal Selector)属性选择器(Attribute Selec…...

qt设置控件的风格样式
设置tablewidget ui.tableWidget_MaterialLibrary->setStyleSheet("QTableView {""color:#DCDCDC;""background-color: #444444;""border: 1px solid #242424;""alternate-background-color:#525252;""gridline-co…...

简单易懂的Transformer学习笔记
1. 整体概述 2. Encoder 2.1 Embedding 2.2 位置编码 2.2.1 为什么需要位置编码 2.2.2 位置编码公式 2.2.3 为什么位置编码可行 2.3 注意力机制 2.3.1 基本注意力机制 2.3.2 在Trm中是如何操作的 2.3.3 多头注意力机制 2.4 残差网络 2.5 Batch Normal & Layer Narmal 2.…...

C语言经典小游戏之三子棋(超详解释+源码)
“纵有疾风来,人生不言弃,风乍起,合当奋意向此生。” 今天我们一起来学习一下三子棋小游戏用C语言怎么写出来? 三子棋小游戏 1.游戏规则介绍2.游戏准备3.游戏的实现3.1生成菜单3.2游戏的具体实现3.2.1初始化棋盘3.2.2打印棋盘3.2…...

宝塔Linux面板点击SSL闪退打不开?怎么解决?
宝塔Linux面板点击SSL证书闪退如何解决?旧版本的宝塔Linux面板确实存在这种情况,如何解决?升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法: 宝塔面板点击SSL证书闪退解决方法 问题:宝塔Linux面板…...

Problem: 6953. 判断是否能拆分数组
Problem: 6953. 判断是否能拆分数组 文章目录 思路解题方法复杂度Code 思路 针对题目中的以下目标,可以转换寻求数组中是否存在前后两个元素之和>m的情况,如果存在则返回ture,如果不存在则返回false。能这样转换的原因是,如果…...

MobiSys 2023 | 多用户心跳监测的双重成形声学感知
注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷达学报 等)。本次介绍的论文是:<<MobiSys’23,Multi-User A…...

Netty:ChannelInitializer添加到ChannelPipeline完成任务以后会自动删除自己
说明 io.netty.channel.ChannelInitializer是一个特殊的ChannelInboundHandler。它的主要作用是向 Channel对应的ChannelPipeline中增加ChannelHandler。执行完ChannelInitializer的initChannel(C ch)函数以后,ChannelInitializer就会从ChannelPipeline自动删除自己…...

【VUE】项目本地开启https访问模式(vite4)
在实际开发中,有时候需要项目以https形式进行页面访问/调试,下面介绍下非vue-cli创建的vue项目如何开启https 环境 vue: ^3.2.47vite: ^4.1.4 根据官方文档:开发服务器选项 | Vite 官方中文文档 ps:首次操作,不要被类…...

【状态估计】一维粒子滤波研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

设计模式-迭代器模式在Java中使用示例
场景 为开发一套销售管理系统,在对该系统进行分析和设计时,发现经常需要对系统中的商品数据、客户数据等进行遍历, 为了复用这些遍历代码,开发人员设计了一个抽象的数据集合类AbstractObjectList,而将存储商品和客户…...