不再担心日志文件过大:通用日志滚动脚本

log_rotater.zip #!/bin/sh # https://github.com/eyjian/mooon/blob/master/mooon/shell/log_rotater.sh # Writed by yijian on 2012/7/22 # # Linux自带的工具logrotate使用稍复杂,但功能强大 # # 本脚本功能: # 1) 实现一个通用的按大小的日志滚动 # 2) 要求日志文件扩展名为“.log”,否则请稍修改代码 # 3) 支持处理多个目录下的日志文件,如果需要使用这个功能, #    必须启用dirs_list参数 # # 为何要写一个这样的东东? # 答:因为在日常中,经常发现程序输出重定向, #     或脚本的输出,如果不处理的话,就可能导致 #     单个文件过大,甚至爆满整个磁盘;而每套脚本 #     都重复写一个日志滚动逻辑,显然是件无聊的事, #     甚至一些人懒得做处理,日子一久,就会发现一个超大的 #     日志文件,本脚本希望可以帮助解决这个问题,让大家无 #     后顾之忧。 # # 使用方法: # 1) 把脚本复制到日志文件所在目录, #    然后以nohup ./log_rotater.sh > /dev/null & 等方式启动脚本即可 # 2) 除了上面的方法,也可以将log_rotater.sh任何目录下, #    但这个时候,应当将backup_dir的值修改为日志文件所在目录 # # sudo dpkg-reconfigure dash # 新版本Ubuntu默认使用dash作为shell, # 这个shell功能较弱,不支持数组等,但速度快, # 可采取如下办法检测是何种shell: # ls -l `which sh` # 可根据需要修改以下参数 backup_count=10 # 日志滚动的个数 backup_size=$((1024 * 1024 * 200)) # 单个日志文件大小 backup_interval=60 # 检测的间隔时间,单位为秒 # 如果dirs_list指定的文件存在,则从dirs_list中读取目录, # 否则仅处理backup_dir指定的单个目录 # 往dirs_list指定文件增减目录时,不需要重启log_rotater.sh backup_dir=. # 日志文件所在目录 dirs_list=./dirs.list # 存储目录列表的文件,要求一行一个目录 # 处理单个目录下的日志滚动 scan_single_dir() { dir=$1 cd $dir if test $? -ne 0; then return fi # 用到了awk给外部变量赋值的特性 eval $(ls -l --time-style=long-iso *.log 2>/dev/null|awk '{ printf("filesize=%s\nfiledate=%s\nfilename=%s\n", $5,$6,$8); }') if test $? -ne 0; then return fi if test -z $filename; then return fi if test $filesize -gt $backup_size; then file_index=$(($backup_count - 1)) while test $file_index -gt 1; do new_filename="${filename}.$file_index" old_filename="${filename}.$(($file_index - 1))" if test -f "$old_filename"; then mv "$old_filename" "$new_filename" fi file_index=$(($file_index - 1)) done # 这里需要使用truncate,而不能使用mv,         # 因为需要保持文件的inode不变 cp "$filename" "${filename}.1" truncate -s 1024 "$filename" fi cd - sleep 1 } # 循环检测 while true; do if test ! -f $dirs_list; then scan_single_dir $backup_dir else while read dirpath do scan_single_dir $dirpath done < $dirs_list fi sleep $backup_interval done

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴伟祥

系统服务管理工具 systemd 原

在RHEL 7.x/CentOS 7.x版本中,一个重要的改变就是 使用systemd 管理机制,

12930
来自专栏java一日一条

使用 Nginx 自己实现一个 Web 调试代理服务器

在Hecker News中我提到过,我记录了一种我使用NGINX(一个久经考验的产品,可以迅速地反向代理)作为一个本地测试代理服务器的方法。

23910
来自专栏猿人谷

CentOS7安装GitLab、汉化、邮箱配置及使用

GitLab是利用Ruby On Rails开发的一个开源版本管理系统,实现了一个自托管的Git项目仓库,是集代码托管,测试,部署于一体的开源git仓库管理...

42300
来自专栏七夜安全博客

后门编程(1)之双管道主动连接型

15340
来自专栏FreeBuf

OpenVAS开源风险评估系统部署方案

OpenVAS,即开放式漏洞评估系统,是一个用于评估目标漏洞的杰出框架。功能十分强大,最重要的是,它是“开源”的——就是免费的意思啦~ 它与著名的Nessus“...

60070
来自专栏用户2442861的专栏

解决stackoverflow打开慢不能注册登录

问题原因:并不是stackoverflow被墙,而是因为stackoverflow用了google的api,而Google在天朝是用不了的,所以才导致像stac...

47210
来自专栏hadoop学习

DKhadoop安装配置详细教程与常见问题解决方法

上周分别就DKHadoop的安装准备工作以及服务器操作系统配置写了两篇分享的文章,这是个人第一次尝试写一个系统性的分享文章,必然会有很多疏漏的地方,还望见谅吧。...

5200
来自专栏用户2442861的专栏

Cookie 和 Session 的使用简记

http://mertensming.github.io/2016/10/19/cookie-session/

10320
来自专栏从流域到海域

数据库连接池

数据库连接池相关资料: 关于数据库连接池的使用,首先我们要明白我们为什么要用它,对应普通的数据库连接操作,通常会涉及到以下一些操作是比较耗时的: 网络通讯...

27470
来自专栏耕耘实录

浅谈MySQL数据库的备份与还原

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

12410

扫码关注云+社区

领取腾讯云代金券