首页 > 系统相关 >使用logrotate做nginx日志分割

使用logrotate做nginx日志分割

时间:2023-04-02 17:11:57浏览次数:44  
标签:文件 etc 转储 nginx logrotate 日志

一、logrotate介绍

logrotate是centos自带命令,其他linux操作系统可能需要自行安装,用来进行日志切割和定期删除,简单来说就是将某个日志文件按照时间或大小分割成多份,删除时间久远的日志。

日志用来帮助我们了解程序运行情况,定位程序bug,如果不对日志及时进行清理就会占据磁盘空间,尤其对于服务器类型的项目,需要长期运行,日志量更大,一年前的日志大部分情况下对我们是无用的也无需保留,并且如果我们的日志记录频率很高,全部存储在一个文件中,文件是很大的,当需要查看时,使用vim或者其他软件打开也会很卡。

 

二、配置讲解

logrotate是基于crond服务(定时任务)来运行的,

有几个重要的配置:

1、/etc/logrotate.conf(主配置)和/etc/logrotate.d/*(子配置)

/etc/logrotate.conf是全局配置,logrotate.conf里面包含include /etc/logrotate.d这句,加载子配置文件的意思,说明/etc/logrotate.d/目录下是具体的配置,一般是以服务名称命名,比如yum等配置。主配置和子配置有冲突时,以子配置的规则为准。

logrotate配置文件及常用参数解释如下:

常见配置参数:

daily :指定转储周期为天天
weekly :指定转储周期为每周
monthly :指定转储周期为每个月
rotate count :指定日志文件删除以前转储的次数,0指没有备份,5 指保留5 个备份
tabooext [+] list:让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave,v, 和 ~
missingok:在日志轮循期间,任何错误将被忽略,例如“文件没法找到”之类的错误。
size size:当日志文件到达指定的大小时才转储,bytes(缺省)及KB(sizek)或MB(sizem)
compress: 经过gzip压缩转储之后的日志
nocompress: 不压缩
copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate: 备份日志文件可是不截断
create mode owner group : 转储文件,使用指定的文件模式建立新的日志文件
nocreate: 不创建新的日志文件
delaycompress: 和 compress 一块儿使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress: 覆盖 delaycompress选项,转储同时压缩。
errors address : 专储时的错误信息发送到指定的Email 地址
ifempty :即便是空文件也转储,这个是logrotate 的缺省选项。
notifempty :若是是空文件的话,不转储
mail address : 把转储的日志文件发送到指定的E-mail地址
nomail : 转储时不发送日志文件
olddir directory:储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir: 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript: 在转储之前须要执行的命令能够放入这个对,这两个关键字必须单独成行
2、/var/lib/logrotate.status,是logrotate自己的日志文件
记录logrotate的运行情况,可以查看被logrotate管理的日志文件的最后备份时间
3、logrotete 命令参数
加-d运行该命令,只是测试此时是否满足日志分割的条件,实际上并没有进行分割备份文件
如logrotate -vfd /etc/logrotate.d/nginx
如果去掉 d 关键字,则进行实际运行,-f 参数,强制执行日志分割清理的功能,我觉得加上更好,因为执行logrotate命令要检查很多(比如系统时间等),导致执行失败,所以直接 -f 强制执行,简单粗暴
logrotate -vf /etc/logrotate.d/nginx
不是root用户执行的话,则选择有能获取root权限的用户,加sudo

 

三、实现

实现方式有两种
方案1:是在原有的配置下新增(在主配置或子配置新增),依旧被原来的cron管理,系统的cron管理一般是每天执行一次,基于计划任务/etc/cron.daily/logrotate
方案2:是在自己在任意位置新建配置文件,然后自己写定时任务来管理,自己写定时任务更灵活,可以每小时,每天23:59:00,每周等任何时刻执行logrotate命令,但两者原理是一样的,都是logrotate命令被执行时就按照logrotate配置文件来切割清理日志
案例:方案2,每天23:59:00执行logrotate命令,按天清理,保留5天
step1,任意位置写配置文件,权限改成644
step2,写定时任务,定时执行logrotate
crontab -e写入,内容为“ 59 23 * * * /usr/sbin/logrotate -f /home/zmq/daily_logrotate ”
step3,修改系统时间,测试效果
调整系统时间为23:58:30,等待30s
切割成功,logrotate本身的日志也记录在/var/lib/logrotate.status里了

 

四、注意事项

1、如果像我这样,自己新增一个配置文件,需要给配置文件的权限设置成644及以下,否则logrotate不生效
2、如果切割日志的文件所在目录权限大于755,则logrotate不生效,解决办法是修改父目录,如logs的目录权限小于等于755
error: skipping "/usr/local/nginx/logs/access.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

 3,配置文件/etc/logrotate.d/nginx中,如执行通知nginx进行重新打开新日志文件的地方,nginx.pid的路径要写正确,不然就出现,正常的日志文件是空的,而新的日志数据写入到了旧的已经改名的文件中。如下,故意将进程号路径写错,查看access.log的inode,

 然后执行logrotate -vf /etc/logrotate.d/nginx

查看logs下的文件列表,已经切割了,但查看access.log-20230402文件的inode和之前access.log的inode一样。这是因为nginx进程号并未查到,未通知nginx重新打开日志文件,nginx还用以前access.log文件名的inode,就写入了access.log-20230402文件中,所以出现此意想不到的状况。当nginx重启,或者reload,再或者reopen,都会再次重新打开新的access.log文件,也即正常了。

 

 将进程号路径写对后,两个文件的inode就不一样了。

 注意: /bin/kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` 由于加入了-USR1参数,所以并不是杀死nginx进程,而是通知nginx执行相应级别的操作,-USR1相当于nginx 的reopen, -USR2相当于reload,所以不用担心这个操作会对nginx造成什么影响。故,不清楚作用的,也不要乱改参数,特别是工作中的生产环境。

标签:文件,etc,转储,nginx,logrotate,日志
From: https://www.cnblogs.com/gaowenwenwen/p/17276164.html

相关文章

  • 孤狼老师-接口测试自动化(Python版完整版)-日志记录&测试报告
            此时,由于每次执行方法前,都会执行一遍setup,故每次都要初始化一次LoggerHelper方法,每次都会加载一次配置文件,优化LoggerHelper:        针对多个接口用例,使用如下方式:   ......
  • Nginx知识总结
    1、什么的nginx?Nginx是高性能的HTTP和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,由报告表明能支持高达50000哥并发连接数。在实际的使用中,tomcat大约能支持500个并发连接数,nginx大约能支持5000个并发连接数2.1、正向代理需要在客户端配置代理服务器进行指定网......
  • nginx反向代理内外网跳转
    一个域名(www.abc.com),指向了公司的外网IP(59.108.xx.xx),公司的外网IP(59.108.xx.xx),映射到一台内网服务器37(172.16.2.37),以下简称37服务器。另一台内网服务器38是资源服务器(172.16.2.38),上传了很多的图片,以下简称38服务器。 其中,37服务器是外网访问我们服务器的唯一入口,其中配置了......
  • sql server 收缩日志文件
    在SQLServer中,可以使用DBCCSHRINKFILE命令来收缩数据库的事务日志文件。下面是一个示例:USE<database_name>GO--收缩日志文件DBCCSHRINKFILE(<log_file_name>,<target_size_in_MB>)其中,<database_name>是要操作的数据库名称,<log_file_name>是要收缩的事......
  • 一个循环采集CPU的etl日志的脚本
    一个循环采集CPU的etl日志的脚本mdD:\\tempsetTargetDriveEtl=D:\\temp@echooffSET/A"index=1"SET/A"count=10":whileif%index%leq%count%(echoThevalueofindexis%index%wmicprocesswherename="wprui.exe"......
  • 自研日志实用工具类
    今天我来分享一个关于日志的问题和解法。问题没有界面的后端程序在实际运行中发生了什么事,通常是通过日志来探查。所以日志非常重要。数据库记录了程序运行的结果,日志记录了程序运行的过程。但是日志经常出现一个问题,日志量太多,以至于把重要的日志淹没在里面。未能及时......
  • openfeign开启日志
    openfeign的日志级别有:NONE:默认,不开启日志BASIC:只记录请求方法和URL以及响应状态代码和执行时间HEADERS:记录基本信息以及请求和响应标头。FULL:记录请求和响应的标题、正文和元数据。  全局日志加入Logger.LevelBean:@ConfigurationpublicclassMyConfigration{......
  • shell 脚本之一键部署安装 Nginx
    今天咸鱼给大家分享个源码编译安装Nginx的shell脚本 这个shell脚本可重复执行 完整源码放在最后 定义一个变量来存放nginx版本号version=1.15.4 nginx下载地址:http://nginx.org/download/ 下列函数功能则是判断当前步骤是否执行成功,并将结果输出出......
  • 通过Sysmon+Nxlogs收集Windows Server 2012服务器日志-并以Syslog形式发送Json格式数
    0x01环境介绍WindowsServer2012已经安装部署好了域控,目的除了收集Windows服务器本身的日志外还收集域控环境下的各种日志。0x02Nxlog配置和使用使用社区版本即可,下载地址:https://nxlog.co/downloads/nxlog-ce#nxlog-community-edition使用的版本是当前最新版本安装过程就省略,......
  • linux日志总结
    0x00前言Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。本文简介一下Linux系统日志及日志分析技巧。0x01日志简介1.1日志服务syslogd介绍说到Linux的日志,就不得不提到syslogd。它是大部分Linux发行版默认的......