首页 > 系统相关 >【Linux日志】Linux日志管理经验总结(crontab+logrotate)

【Linux日志】Linux日志管理经验总结(crontab+logrotate)

时间:2025-01-23 23:43:40浏览次数:1  
标签:文件 log 转储 nginx logrotate crontab Linux 日志

一、日志管理目标

日志的管理,一般包括两大部分

1、日志内容,合理的日志内容(日志锚点,内容格式,等)可以为应用服务的执行记录、问题排查提供最有力的帮助

2、日志存档规则,包括日志分割方式(按日期、按文件大小,等),日志存档数量,如只保存最近一个月,等

对于自行开发的应用服务,日志的管理可以由开发人员通过日志组件定制化,如logback,log4j等,但对于安装部署的第三方组件如MySQL、nginx、redis等,以及开发引用的第三方组件如nacos,sentinel等,除非组件开放了丰富的日志配置参数,否则将无法按照开发人员的要求管理日志文件。

二、特殊日志场景

一些特殊应用服务或组件,如果没有进行特定的配置操作,默认情况下将使日志文件不受控制,为后期清理造成麻烦,常见的有:

nohup方式启动应用服务,如果未配置日志重定向,或者重定向到了单文件,则系统将日志持续输出在nohup.out文件或重定向的单文件

mysql数据库支持配置日志文件路径,但无法自动清理日志内容

nginx支持配置日志内容模板以及日志文件路径(默认access.log、error.log),但无法自动清理日志内容

以上类似情况下,日志将始终在单文件中持续输出,过了一定时间后,日志文件将占用无限大的磁盘存储,对整个系统造成运行故障。

三、特殊工具 - 定时清理

可以使用Linux自带定时工具 crontab + 清理日志脚本的方式,实现定时清理,示例如下

crontab -e
# 定时清理日志,保留最近7天
1 0 * * * find /logs.dir/ -mtime +7 | xargs rm -rf

特别关注

Linux系统下,有些应用服务组件如nginx与MySQL,运行过程中,对日志存储文件将使用文件句柄跟踪,如此会有以下问题:
1、将日志文件重命名,同时新建一个同名的文件,组件依然会向原来的文件中输出日志。

2、将日志文件删除(rm -f),也需要同时将应用服务组件进程重启才行,否则删除的文件也会由于被占用而无法释放磁盘资源。

3、删除但被占用的文件将无法通过 ls -l 命令查看,也无法通过 du -sh 命令统计磁盘占用,但 df -h 命令会显示真实磁盘占用,只能通过 lsof 命令,查看打开的文件描述符,对运维造成很大麻烦。

针对这种情况

1、如果只是单次清理文件,可以使用清空文件的方式,如 echo > log.log,或其他清空的方式,但切记不能直接 rm -f 删除

2、如果已经执行 rm -f 删除,则可以使用 lsof | grep -i deleted 命令查看被删除但无法回收的文件,然后将相应的进程重启即可回收

3、如果要保留日志内容,又要控制存储容量,则需要使用logrotate的 拷贝+清空 方式,即只是将日志文件内容拷贝一份存档,然后清空当前日志文件(而非删除)

四、特殊工具 - logrotate

对于不方便进行自定义日志管理的应用服务组件,可以自定义脚本维护,可以自行开发应用软件维护,但强联推荐使用Linux系统集成的日志管理工具logrotate,该工具由Linux系统crontab定时调度,支持为相关日志文件(或其他文件)自定义存储规则,但日志内容只能按照应用服务组件的实现输出。

logrotate提供的功能参数很多,比较常用的如下

  • 日志分割周期

  • 日志文件扩展名

  • 日志文件分割方式,包括新建+删除,拷贝+清空,等,适用不同应用服务场景

  • 日志内容压缩

  • 日志文件存档数量

logrotate 命令格式:

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

/usr/share/nginx/log/*.log{
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 644 root root
    sharedscripts
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}


#调用方法
logrotate -d /etc/logrotate.d/nginx
#结合crontab定时执行 
echo "0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx > /dev/null 2>&1" >> /var/spool/cron/root


参数说明 详情
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 .%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简易配置

MySQL
/data/mysql/log/mysqld.log
{
    daily
    dateext
    dateyesterday
    copytruncate
    notifempty
    missingok
    olddir backup
    rotate 60
        compress
}

nginx
/usr/local/nginx/logs/access.log
/usr/local/nginx/logs/error.log
{
    daily
    dateext
    dateyesterday
    copytruncate
    notifempty
    missingok
    olddir backup
    rotate 30
        compress
}

附录:关于常用组件运行时日志管理

nginx不支持自动清理,默认单文件持续写入,且不会自动滚动

mysql不支持自动清理,默认单文件持续写入,且不会自动滚动

zookeeper默认支持自动清理(限制文件大小和个数),log4j配置文件维护

redis不支持自动清理,只记录少量核心日志,单文件持续写入,但默认只记录少量核心日志,可以不处理

kafka的数据记录日志(topic、offset等),支持自动清理,配置文件维护

kafka操作日志,默认在安装目录logs目录,支持自动滚动,但不会自动清理,log4j配置文件维护

链接:https://www.cnblogs.com/xiaoyaozhe/p/17671275.html

(版权归原作者所有,侵删)

原创 Raymond运维

标签:文件,log,转储,nginx,logrotate,crontab,Linux,日志
From: https://www.cnblogs.com/o-O-oO/p/18688778

相关文章

  • jvm 内存变化监控测试,观察Eden 内存增长到最大,触发GC、堆内存越来越高,触发FullGC,直到
    1测试准备1)写一个程序,创建一个二维的直接数组,长度为10000,用于存放生成的数据;2)写一个while循环,每秒向二维数组中放入1个1M的字节数组;packagecom.spqin.jvm;/***@authorSpqin*@version1.0*@Date2022-09-1119:52*/publicclassJvmTest{publicstat......
  • Linux
    root1234ipaddr 目录操作命令cd/  //切换到根目录cd~ls//查看当前目录同时按住ctrl加L清屏ls-l可以简写llpwd//看当前文件夹在什么位置rmdir//只能删除空文件夹>//创建文件//举例:>1.log//创建1.log文件//Tab键自动补......
  • Linux基本操作(二)
                       Linux基本指令十四.查找指令1.find指令Linux下find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来......
  • Python · GitHub · Linux | 使用本机作为代·理服务器
    致谢同学教我这种方法;对于强制不允许访问googlegithub的服务器,貌似非常好用目录01配置HTTP代理02配置ssh代理03用服务器A做访问服务器B的跳~板~机~01配置HTTP代理假设本机的c·lash的端口是7890,则在vscode的sshconfig里,修改:Hostserver_alias......
  • Linux中的几个基本指令(二)
    文章目录1、cp指令例一:例二:例三:例四:例五:2、mv指令例一:例二:3、cat指令例一:4、tac指令5、which指令6、date指令时间戳:7、zip指令今天我们继续学习Linux下的几个基本指令,本篇是在Xshell环境下执行的。1、cp指令功能:cp指令用于复制文件或目录CSDN@大帅哥语法:c......
  • ssh私匙登录Linux电脑
    使用密匙登陆比密码更安全。下面是生成密匙对并用其登陆Linux电脑的方法1.生成密匙先用密码连接设备,并在命令行输入ssh-keygen-ted25519ED25519密钥具有较安全和长度较短的特点。查看密匙:cd~/.sshls输出:id_ed25519id_ed25519.pubid_ed25519是私匙,id_ed255......
  • Linux基础08-指令篇之vim常用指令【入门级】
    vim编辑器常用指令光标移动行间移动gg键:移动光标到第一行(命令模式下)G键:移动光标到最后一行(命令模式下):n:移动到第n行,写法举例::6移动到第六行(末行模式)列间移动$:移动光标到当前行的行尾(最后一列)。一般可以使用shift+$(命令模式下)0:移动光标到当前行的行首(第一列)(命令模......
  • Linux OOM killer
    -[LinuxOOMkiller-Search](https://cn.bing.com/search?q=Linux+OOM+killer&qs=n&FORM=BESBTB&sp=-1&lq=0&pq=linux+oom+killer&sc=12-16&sk=&cvid=B7C53594BC214CF2BFB926DAE23842E4&ghsh=0&ghacc=0&ghpl=&ensearch=1)......
  • jumpserve Linux 单机部署
    参考文档:https://docs.jumpserver.org/zh/v3/installation/setup_linux_standalone/offline_upgrade/1、环境要求1.1、操作系统1.2、数据库2、离线安装从飞致云社区下载最新的linux/amd64离线包,并上传到部署服务器的/opt目录https://community.fit2cloud.com......
  • 【Linux】文件操作、系统IO相关操作、inode和输入输出重定向
    ⭐️个人主页:@小羊⭐️所属专栏:Linux很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~目录1、理解文件1.1狭义理解1.2广义理解1.3文件操作1.4系统角度2、系统文件IO2.1文件相关操作2.2文件描述符2.3重定向1、理解文件1.1狭义理解文件在磁盘......