Linux日志管理-logrotate(crontab定时任务、Ceph日志转储)

news2024/11/20 11:24:12

文章目录

  • 一、logrotate概述
  • 二、logrotate基本用法
  • 三、logrotate运行机制
    • logrotate参数
  • 四、logrotate是怎么做到滚动日志时不影响程序正常的日志输出呢?
    • Linux文件操作机制
    • 方案一
    • 方案二
  • 五、logrotate实战--Ceph日志转储
  • 参考

一、logrotate概述

logrotate是一个用于管理Linux系统上的日志文件的工具,它的主要目的是确保日志文件不会变得过大,从而占用过多的磁盘空间并影响系统性能。当系统运行时间越长,生成的日志文件就越多,这些文件可能会变得非常大,导致磁盘空间不足。此外,如果日志文件太大,它们可能会变得不可读,从而导致难以诊断和解决问题。logrotate可以定期轮换旧的日志文件,并将它们压缩或删除,以释放磁盘空间并保持日志文件的可读性。它还可以在轮换时创建新的日志文件,以确保系统仍然可以记录重要的事件和错误信息。

logrotate旨在简化生成大量日志文件的系统上日志文件的管理。logrotate允许自动滚动、压缩、删除和邮寄日志文件。logrotate可以设置为每小时、每天、每周、每月或当日志文件达到一定大小时处理日志文件。因此,logrotate对于维护系统的稳定性和可靠性非常重要。它可以确保系统管理员能够及时发现和解决潜在的问题,并避免因日志文件过大而导致的性能问题。

二、logrotate基本用法

logrotate [OPTION...] <configfile>
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。

排障过程中的最佳选择是使用-d选项以预演方式运行logrotate。要进行验证,不用实际轮循任何日志文件,可以模拟演练日志轮循并显示其输出。

logrotate -d 配置文件

即使轮循条件没有满足,我们也可以通过使用-f选项来强制logrotate轮循日志文件,-v参数提供了详细的输出。

logrotate -vf 配置文件

三、logrotate运行机制

logrotate的运行依赖于Linux上的定时任务命令crontab:Linux crontab 命令

crontab命令会定时运行logrotate,一般是每天一次。crontab会每天定时执行/etc/cron.daily目录下的脚本,而这个目录下有个文件叫logrotate。

[root@ceph01 cron.daily]# cat logrotate 
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit $EXITVALUE

Linux系统默认安装logrotate,它的配置文件在:

/etc/logrotate.conf
/etc/logrotate.d/

日志轮转是系统自动完成的。实际运行时,logrotate会调用配置文件/etc/logrotate.conf。可以在/etc/logrotate.d/目录里放置自定义好的配置文件,用来覆盖logrotate的缺省值。

查看/etc/logrotate.conf文件

[root@ceph01 ceph]# cat /etc/logrotate.conf 
# see "man logrotate" for details
# rotate log files weekly
weekly # 默认每周执行一次rotate轮转任务

# keep 4 weeks worth of backlogs
rotate 4 # 保留多少日志文件,默认保留4个,0表示没有备份

# create new (empty) log files after rotating old ones
create # 自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志

# use date as a suffix of the rotated file
dateext # 切割后日志文件以当前日期为后缀结尾,如xxx.log-20230912,如果注释掉,切割出来是按数字递增,即xxx.log-1这种格式

# uncomment this if you want your log files compressed
#compress # 是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉

# RPM 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参数

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 %Y%m%d%H.%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

四、logrotate是怎么做到滚动日志时不影响程序正常的日志输出呢?

Linux文件操作机制

详细讲解,Linux内核——文件系统(建议收藏)-目录的存储

目录也是文件,目录文件里存着文件名和对应的inode编号。通过这个inode编号可以查到文件的元数据和文件内容。文件的元数据有引用计数、操作权限、拥有者ID、创建时间、最后修改时间等等。文件名并不在元数据里而是在目录文件中。因此文件改名、移动,都不会修改文件,而是修改目录文件。

进程打开文件的机制

进程每新打开一个文件,系统会分配一个新的文件描述符给这个文件。文件描述符对应着一个文件表。表里面存着文件的状态信息(O_APPEND/O_CREAT/O_DIRECT…)、当前文件位置和文件的inode信息。系统会为每个进程创建独立的文件描述符和文件表,不同进程是不会共用同一个文件表。正因为如此,不同进程可以同时用不同的状态操作同一个文件的不同位置。文件表中存的是inode信息而不是文件路径,所以文件路径发生改变不会影响文件操作。

方案一

这个方案的思路是重命名原日志文件,创建新的日志文件。详细步骤如下:

  1. 重命名程序当前正在输出日志的程序。因为重命名只会修改目录文件的内容,而进程操作文件靠的是inode编号,所以并不影响程序继续输出日志。
  2. 创建新的日志文件,文件名和原来日志文件一样。虽然新的日志文件和原来日志文件的名字一样,但是inode编号不一样,所以程序输出的日志还是往原日志文件输出。
  3. 通过某些方式通知程序,重新打开日志文件。程序重新打开日志文件,靠的是文件路径而不是inode编号,所以打开的是新的日志文件。

什么方式通知程序我重新打开日志呢,简单粗暴的方法是杀死进程重新打开。很多场景这种作法会影响在线的服务,于是有些程序提供了重新打开日志的接口,比如可以通过信号通知nginx。各种IPC方式都可以,前提是程序自身要支持这个功能。

有个地方值得一提,一个程序可能输出了多个需要滚动的日志文件。每滚动一个就通知程序重新打开所有日志文件不太划得来。有个sharedscripts的参数,让程序把所有日志都重命名了以后,只通知一次。

方案二

如果程序不支持重新打开日志的功能,又不能粗暴地重启程序,怎么滚动日志呢?copytruncate的方案出场了。

这个方案的思路是把正在输出的日志拷(copy)一份出来,再清空(trucate)原来的日志。详细步骤如下:

  1. 拷贝程序当前正在输出的日志文件,保存文件名为滚动结果文件名。这期间程序照常输出日志到原来的文件中,原来的文件名也没有变。
  2. 清空程序正在输出的日志文件。清空后程序输出的日志还是输出到这个日志文件中,因为清空文件只是把文件的内容删除了,文件的inode编号并没有发生变化,变化的是元信息中文件内容的信息。
    结果上看,旧的日志内容存在滚动的文件里,新的日志输出到空的文件里。实现了日志的滚动。

这个方案有两个有趣的地方:

  1. 文件清空并不影响到输出日志的程序的文件表里的文件位置信息,因为各进程的文件表是独立的。那么文件清空后,程序输出的日志应该接着之前日志的偏移位置输出,这个位置之前会被\0填充才对。但实际上logrotate清空日志文件后,程序输出的日志都是从文件开始处开始写的。这是怎么做到的?这个问题让我纠结了很久,直到某天灵光一闪,这不是logrotate做的,而是成熟的写日志的方式,都是用O_APPEND的方式写的。如果程序没有用O_APPEND方式打开日志文件,变会出现copytruncate后日志文件前面会被一堆\0填充的情况。
  2. 日志在拷贝完到清空文件这段时间内,程序输出的日志没有备份就清空了,这些日志不是丢了吗?是的,copytruncate有丢失部分日志内容的风险。所以能用create的方案就别用copytruncate。所以很多程序提供了通知我更新打开日志文件的功能来支持create方案,或者自己做了日志滚动,不依赖logrotate。

五、logrotate实战–Ceph日志转储

以Ceph的日志文件 /var/log/ceph/*.log为例:

Ceph的日志滚动也是基于logrotate实现的,日志配置文件位于/etc/logrotate.d/ceph,默认情况下的日志配置文件如下:

[root@ceph01 logrotate.d]# cat ceph
/var/log/ceph/*.log {
    rotate 7
    daily
    compress
    sharedscripts
    postrotate
        killall -q -1 ceph-mon ceph-mgr ceph-mds ceph-osd ceph-fuse radosgw rbd-mirror || pkill -1 -x "ceph-mon|ceph-mgr|ceph-mds|ceph-osd|ceph-fuse|radosgw|rbd-mirror" || true
    endscript
    missingok
    notifempty
    su root ceph
}

默认情况下,每天备份一次,要做到每天备份,依赖于crontab定时任务。在/etc/cron.daily/目录下,有logrotate脚本,每天定时执行,也可以把脚本移动到/etc/cron.hourly/目录下做到每小时执行日志转储。

如果想要按照日志文件大小进行转储该如何做?

  1. 删除/etc/cron.daily/目录下的logrotate脚本(删除前做好备份)

  2. 修改/etc/logrotate.d/ceph文件,里面的参数根据实际需求设置,我这里设置日志删除前转储7次,日志文件大小超过1M,时间格式重命名压缩转储。

    [root@ceph01 etc]# cat /etc/logrotate.d/ceph
    /var/log/ceph/*.log {
        rotate 7
        size 1M
        dateext
        dateformat %Y%m%d%H.%s
        compress
        sharedscripts
        postrotate
            killall -q -1 ceph-mon ceph-mgr ceph-mds ceph-osd ceph-fuse radosgw rbd-mirror || pkill -1 -x "ceph-mon|ceph-mgr|ceph-mds|ceph-osd|ceph-fuse|radosgw|rbd-mirror" || true
        endscript
        missingok
        notifempty
        su root ceph
    }
    
  3. 在/etc/crontab中添加自定义的定时任务(具体参数含义看上面的链接)。这里设置的是每分钟检查日志文件大小是否超过1M,超过就执行logrotate命令进行日志转储。

    [root@ceph01 etc]# cat /etc/crontab
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    
    # For details see man 4 crontabs
    
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    * * * * * root /usr/sbin/logrotate /etc/logrotate.conf > /dev/null 2>&1
    

一些可能让你迷惑的地方参考:logrotate详情和坑点

参考

  • https://www.cnblogs.com/txlsz/p/13126723.html
  • https://zhuanlan.zhihu.com/p/90507023
  • https://www.cnblogs.com/sailrancho/p/4784763.html
  • https://blog.csdn.net/sinat_36358653/article/details/107390349
  • https://blog.csdn.net/ht9999i/article/details/119001732
  • https://blog.csdn.net/sinat_36358653/article/details/107390349

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

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

相关文章

Java 华为真题-选修课

需求&#xff1a; 现有两门选修课&#xff0c;每门选修课都有一部分学生选修&#xff0c;每个学生都有选修课的成绩&#xff0c;需要你找出同时选修了两门选修课的学生&#xff0c;先按照班级进行划分&#xff0c;班级编号小的先输出&#xff0c;每个班级按照两门选修课成绩和的…

下载CentOS ISO镜像 (一)

总目录 https://preparedata.blog.csdn.net/article/details/132877836 文章目录 总目录一、下载CentOS 镜像 一、下载CentOS 镜像 官网下载&#xff1a;https://www.centos.org/download/ Centos Linux 和 CentOS Stream 的区别&#xff1a;https://www.centos.org/cl-vs-cs…

设计模式(2) - 创建型模式

创建型模式指的是 创建对象 或是 获取实例 的方式。 1、工厂模式 平时写一些简单的代码可能会直接用 new 创建出一个对象&#xff0c;但是实际在阅读一些功能比较多、规模比较庞大的工程时&#xff0c;可能会发现有多个类继承于同一个基类的情况&#xff0c;它们拥有同样的接口…

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac)

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac) Mac mini操作系统&#xff0c;安装完 Google Chrome 浏览器以后&#xff0c;单击 启动台 桌面左下角的“显示应用程序”&#xff0c;我们发现捆绑安装了 Goo…

ArcGis10.8安装教程!

1、找到arcgis10.8中文安装包和Crack破解文件夹 2、运行"ArcGIS.exe"程序&#xff0c;进入安装向导&#xff1b;默认路径点下一步 3、注意&#xff0c;需要Python 2.7、Numpy、Matplotlib的支持 4、建议取消此处的勾选&#xff0c;开始进行安装 5、安装完成 6、…

【npm】npm私有库的使用-绑定

注册npm账户 输入基本信息 验证 收一次性验证码 登录 本地绑定 全局绑定了其他的私有库 若要在专门发包的项目中&#xff0c;发包到自己的私有库&#xff0c;需要在项目文件夹中创建一个.npmrc文件 创建文件 可以直接在项目目录下输入touch .npmrc创建文件 文件内容 regi…

C++之保存编译全部中间文件(二百一十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

JavaScript学习笔记03

JavaScript笔记03 流程控制 if 判断 和 Java 中if语句的使用方法相同。例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script>"use strict"…

OPCAE扫盲

目录 1 基本概念 1.1 服务器/客户端 1.2 区域 1.3 报警/条件 1.4 事件 2 条件概念 2.1 子条件 2.2 OPCConditions属性 2.3 Condition质量 2.4 OPCSubConditions属性 2.5 Condition定义 2.6 严重性 2.7 Condition启用/禁用 2.8 Area启用/禁用 2.9 Condition状态集…

域控操作一:更换域用户桌面背景

1,创建背景图片文件夹并设置共享文件夹&#xff1a; 创建文件夹&#xff0c;将图片放进去&#xff0c;设置共享&#xff0c;权限改为Everyone 2&#xff0c;打开域控服务器设置组策略 在需要的组织单位OU内创建GPO设置名字为统一桌面背景 用户配置–管理模板–桌面–桌面 Act…

期权怎样的加仓才是合理的加仓?

期权加仓的手法是期权投资中常见的一种操作的手段,一般是在行情有大涨趋势的时候,投资者通过追加仓位来扩大收益和缩小持仓成本的策略&#xff0c;下文为大家介绍期权怎样的加仓才是合理的加仓&#xff1f;本文来自&#xff1a;期权酱 一、期权交易怎么加仓最合适&#xff1f;期…

[H5动画制作系列 ] Text及Button 的基础原理Demo

准备工作: 舞台上方是个动态文本框,名称为:myText,舞台下方是一个按钮元件(myButton)的实例,名称是:myButton1,当点击按钮时,能够在文本框上和控制台(console)输出:当前帧号以及全局i的变量值。建立两个图层,一个图层布局按钮和文本框,另一个图层专门部署代码。 操作步骤: 步…

WebGL 正确处理对象前后的关系——隐藏面消除(深度测试)/ 深度冲突

目录 前言 验证WebGL处理对象前后关系的规则——后绘制的图形覆盖先绘制的图形 隐藏面消除&#xff08;深度测试&#xff09; 开启隐藏面消除功能&#xff0c;需要遵循以下两步&#xff1a; 1.开启隐藏面消除功能。 gl.enable&#xff08;&#xff09;函数规范 2.在绘制…

计算机毕业设计 基于SSM的电影推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

zabbix 钉钉微信企微告警(动作操作消息内容模板)

一、环境配置 1、配置zabbix服务端 2、配置监控主机&监控项&监控模板 zabbix配置安装_this page is used to test the proper operation of _疯飙的蜗牛的博客-CSDN博客 二、触发器 触发器的本质就是一个条件判断&#xff0c;对于不同的监控数据来说&#xff0c;我…

小剧场短剧影视小程序源码分享,搭建自己的短剧小程序

拥有一个属于自己的短剧小程序&#xff0c;是现代人追求创作梦想和与观众互动的新方式。近年来&#xff0c;小剧场短剧影视小程序的兴起为广大创作者提供了展示才华和与观众互动的平台。如果你也渴望搭建一个自己的短剧小程序&#xff0c;那么你来对地方了&#xff01;在本文中…

一个Python终端增强开源库

迷途小书童 读完需要 4分钟 速读仅需 2 分钟 1 简介 rich 是由 Will McGugan 开发的一个开源库&#xff0c;旨在提供更好的终端文本渲染和样式处理能力。它提供了丰富的文本格式化选项&#xff0c;包括颜色、粗体、斜体、下划线、对齐等。rich 不仅适用于命令行界面的美化&…

MYSQL 窗体汇总函数

如果我们想要汇总当天数据&#xff0c;当月数据&#xff0c;当年数据的。如果不懂窗体函数&#xff0c;可能会比较费劲&#xff0c;那小编就说了&#xff0c;我用java处理同样可以达到效果啊。可问题是。明明有现成的函数&#xff0c;为啥要用java处理&#xff0c;当然同时&…

【zlm】 webrtc源码讲解

目录 前端WEB 服务器收到请求 服务端的处理 播放 拉流 参考文章 前端WEB 服务器收到请求 POST /index/api/webrtc?applive&streamtest&typeplay HTTP/1.1 HttpSession::onRecvHeaderHttpSession::Handle_Req_POSTHttpSession::Handle_Req_POSTif (totalConte…

iPhone苹果15手机怎么看是国行还是美版或港版的苹果iPhone15手机?

iPhone苹果手机15机型区域版本识别代码 CH代码为国行 LL代码为美版 ZP代码为港版 iPhone苹果15手机怎么看是国行还是美版或港版的苹果iPhone15手机&#xff1f; 1、打开苹果iPhone15手机桌面上的「设置」&#xff1b; 2、在iPhone苹果15手机设置内找到「通用」并点击打开&…