前言

日志就像程序的生命记录仪,详细记录下了程序运行的点点滴滴。

慎重的选择记录哪些日志:在茫茫日志海中寻找真正记录问题的日志,你是不想经历的;

精心的定时压缩转移日志:故障发生了,日志却丢了,此时的任何辩解都是苍白无力的。

记录哪些日志需要你在编写应用程序慎重决定,本文讲述如何使用Linux自带的logrotate程序来精心组织我们可爱的日志文件。

简介

日志,实际就是本文文件,且是个内容不断在增长的文件。处理通常就是按天或者按大小来备份、压缩或转储,非常简单。

/var/log/messages是大家熟悉的系统日志存放位置。如果该文件内容增长特别快,几天可能就撑满了整个硬盘,那么对该文件的备份、压缩或转储就显得尤为重要。

手动怎么处理呢?可能是:

编写日志处理脚本,脚本检测如果日志文件大小超过10M就拷贝一份日志并压缩转储,中间还需要清空原日志;

Crontab中把这个脚本作为定时任务,每天执行下。

Logrotate实际就是起着上述脚本作用的小工具,他通过让用户来配置规则的方式,检测和处理日志文件。配合Cron可让处理定时化;

Logrotate预制了大量判断条件和处理方式,可大大降低手写脚本的负担和出错的可能;

Logrorate检测日志文件属性,比对用户配置好的检测条件,对满足条件的再根据用户配置的要求来处理,整个可以通过Cron来定时调度,这其实是非常经典的Linux解决问题的思路,可以好好静下心来品味下,简单,好用。

组成

以下是logrotate运行的关键点:

/usr/bin/logrotate 程序所在位置;

/etc/cron.daily/logrotate 默认让Cron每天执行logrotate一次;

/etc/logrotate.conf 全局配置文件;

/etc/logrotate.d 应用自个的配置文件存放目录,覆盖全局配置;

全局配置文件/etc/logrotate.conf

# cat /etc/logrotate.conf

# see "man logrotate" for details

# rotate log files weekly

weekly

# keep 4 weeks worth of backlogs

rotate 4

# create new (empty) log files after rotating old ones

create

# use date as a suffix of the rotated file

# dateext

# uncomment this if you want your log files compressed

#compress

# RPM packages drop log rotation information into this directory

include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here

/var/log/wtmp {

monthly

create 0664 root utmp

minsize 1M

rotate 1

}

/var/log/btmp {

missingok

monthly

create 0600 root utmp

rotate 1

}

# system-specific logs may be also be configured here.

查看全局配置文件cat /etc/logrotate.conf,可以发现#是行注释,配置项都是以关键字形式出现(那么想知道每个关键字的作用,最简单的就是直接man查看了)。

仔细看下每个关键字的注释,不难发现,比如:

weekly:表示每周处理下日志;

rotate4:最多保持4个轮转备份,关于轮转本身后文会详述,很有意思;

create:处理完该日志文件后,新生成一个日志文件,当然尽可能是同名同权限等;

dateext:默认未加时间戳;

compress:默认不压缩;

对wtmp和btmp日志做了单独处理,于是你意识到了单独的配置可以放在/etc/logrotate.d目录,或者直接放在全局配置里面。

于是当logrotate程序被执行时,按照字面意思logrotate默认是想每周处理下日志,对日志最多轮转保留4份,处理方式是不压缩也不加时间戳,处理完后再生成个同名文件。当然这些是默认设置,还对wtmp和btmp日志处理做了单独要求并且include /etc/logrotate.d目录下还有一大堆处理要求。该目录下配置文件,在logrotate被执行后,都会不一个个读取来执行。

自定义配置文件存放目录/etc/logrotate.d/

# ls /etc/logrotate.d/

cups debug dracut httpd iptraf mysqld ppp psacct sssd subscription-manager syslog tomcat6 up2date vsftpd wpa_supplicant yum

例如查看下sssd配置文件的内容:

# cat /etc/logrotate.d/sssd

/var/log/sssd/*.log {

weekly

missingok

notifempty

sharedscripts

rotate 2

compress

postrotate

/bin/kill -HUP `cat /var/run/sssd.pid 2>/dev/null` 2> /dev/null || true

endscript

}

可以发现基本格式与全局配置文件/etc/logrotate.conf一致,不难想象单独为某个日志配置的要求优先级肯定更高,如果与全局配置中出现相同项目的配置,单独的肯定覆盖全局的。

Cron执行 /etc/cron.daily/logrotate

配置文件都指定完毕,logrotate可单独执行了,当然也可以通过cron来定时执行;

# cat /etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1

EXITVALUE=$?

if [ $EXITVALUE != 0 ]; then

/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"

fi

exit 0

默认的logrotate已经放在/etc/cron.daily/logrotate目录,很明显是让cron每天执行一次logrotate程序;

当然你也可以将该脚本放到其他时间,比如每分钟执行,甚至可以单独写crontab表达式来让logrotate指定配置文件和指定时间执行;

小结

至此,我们看过了logrotate的全局配置文件,单独配置文件,已经如何配合cront来定时执行。

为了加深记忆,我们先小结下:

logrotate是个程序,专门用来处理日志文件;

处理需要用户配置规则,比如指定超出10M则做什么动作;

规则可配置到独立的配置文件中,当然全局还有个全局默认配置文件,要知道每个配置文件都放在哪哦;

logrotate一被执行,就会搜索所有的配置文件按要求处理日志;

可以配合cron让logrotate定时执行;

测试

man过logrotate的同学大概知道logrotate该怎么用了,常见的选项使用如下:

# 1. 调试 (d = debug)参数为配置文件,不指定则执行全局配置文件

logrotate -d /etc/logrotate.d/test.conf

# 2. 强制执行(-f = force),可以配合-v(-v =verbose)使用,注意调试信息默认携带-v;

logrotate -v -f /etc/logrotate.d/test.conf

本例通过自定义配置文件来压缩指定日志文件来测试logrotate的使用。

注意logrotate都是需要使用root来执行的,(但是可以通过配置项来指定生成的日志文件为普通用户的)。

# 1. 生成一个日志文件

man ps > test.log

ll -h test.log

-rw-r--r-- 1 root root 54K Sep 6 11:36 test.log

# 2. 编写对该日志文件如何处理的logrotate配置文件

cat /etc/logrotate.d/test.conf

/var/log/test.log {

compress

rotate 4

size 30k

create 0600 root root

}

# 3. 调试是否可以按照配置文件要求生成压缩文件

logrotate -d /etc/logrotate.d/test.conf

reading config file /etc/logrotate.d/test.conf

reading config info for /var/log/test.log

Handling 1 logs

rotating pattern: /var/log/test.log 30720 bytes (4 rotations)

empty log files are rotated, old logs are removed

considering log /var/log/test.log

log needs rotating

rotating log /var/log/test.log, log->rotateCount is 4

dateext suffix '-20150906'

glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

renaming /var/log/test.log.4.gz to /var/log/test.log.5.gz (rotatecount 4, logstart 1, i 4),

renaming /var/log/test.log.3.gz to /var/log/test.log.4.gz (rotatecount 4, logstart 1, i 3),

renaming /var/log/test.log.2.gz to /var/log/test.log.3.gz (rotatecount 4, logstart 1, i 2),

renaming /var/log/test.log.1.gz to /var/log/test.log.2.gz (rotatecount 4, logstart 1, i 1),

renaming /var/log/test.log.0.gz to /var/log/test.log.1.gz (rotatecount 4, logstart 1, i 0),

renaming /var/log/test.log to /var/log/test.log.1

creating new /var/log/test.log mode = 0600 uid = 0 gid = 0

compressing log with: /bin/gzip

removing old log /var/log/test.log.5.gz

error: error opening /var/log/test.log.5.gz: No such file or directory

# 4. 调试结果正常,实际测试下

logrotate -f /etc/logrotate.d/test.conf

ll -h test.log*

-rw------- 1 root root 0 Sep 6 11:44 test.log

-rw-r--r-- 1 root root 14K Sep 6 11:44 test.log.1.gz

测试正常;

以上logrotate -f /etc/logrotate.d/test.conf指令完全可以写入crontab中,按照要求时间来执行,此处暂时不拆开讲了。

轮转

我们从上述debug信息中,摘录轮转部分的日志来理解下,什么叫轮转。

rotating log /var/log/test.log, log->rotateCount is 4

renaming /var/log/test.log.4.gz to /var/log/test.log.5.gz (rotatecount 4, logstart 1, i 4),

renaming /var/log/test.log.3.gz to /var/log/test.log.4.gz (rotatecount 4, logstart 1, i 3),

renaming /var/log/test.log.2.gz to /var/log/test.log.3.gz (rotatecount 4, logstart 1, i 2),

renaming /var/log/test.log.1.gz to /var/log/test.log.2.gz (rotatecount 4, logstart 1, i 1),

renaming /var/log/test.log.0.gz to /var/log/test.log.1.gz (rotatecount 4, logstart 1, i 0),

renaming /var/log/test.log to /var/log/test.log.1

emoving old log /var/log/test.log.5.gz

error: error opening /var/log/test.log.5.gz: No such file or directory

根据配置文件要求,轮转4份;

以伪代码在简写上述日志为:

rotateCount=4

mv 4 5

mv 3 4

mv 2 3

mv 1 2

rm 5

这就很容易理解了,所谓轮转,就是类似二级制向右位移一样不断的重命名;

例子

在弄清楚logrotate的运作机制,又实地测试一番后,以下将通过多个例子方式来让大家快速配置。

清空但不删除日志文件

copytruncate的作用在于先复制一份当前日志文件用做处理,再清空源日志文件,让其继续接收日志。

当然在复制和清空的空隙可能会有若干

$ cat logrotate.conf

/tmp/output.log {

size 1k

copytruncate

create 700 bala bala

rotate 4

compress

}

摘自参考3;

日志处理完执行自定义脚本

postrotate和endscript中间可以编写自定义脚本,用来对日志或者其他其定义处理,扩展性非常强;

例如由于logrotate对压缩日志可指定的时间戳只能到天,于是可以再自定义脚本里面对文件做时分等细化命名;

$ cat logrotate.conf

/tmp/output.log {

size 1k

copytruncate

rotate 4

compress

postrotate

/home/bala/myscript.sh

endscript

}

摘自参考3;

更改压缩程序

默认压缩程序使用.gz,当然可以自定义,需要制定压缩程序和后缀名;

$ cat logrotate.conf

/tmp/output.log {

size 1k

copytruncate

create

compress

compresscmd /bin/bzip2

compressext .bz2

rotate 4

}

参考

logrotate测试_简单好用的日志管理工具 Logrotate相关推荐

  1. linux日志管理工具logrotate配置

    linux日志管理工具logrotate配置 logrotate介绍 logrotate配置讲解 主配置文件解释(/etc/logrotate.conf) logrotete 命令参数 添加配置 以添 ...

  2. logrotate测试_Linux下日志管理工具Logrotate

    背景: 项目上的Nginx和Tomcat已经跑了大半年了,Nginx的access.log和error.log将近1G大小:Tomcat下的catalina.out日志经常跑到打不出日志然后进行手动移 ...

  3. linux 日志按大小切割_日志切割工具logrotate,帮你管理你的日志文件

    最近线上系统跑的业务量有点上量,虽然系统性能是稳定的,但是却有另外一个问题,那就是日志文件越来越大,占用的磁盘空间就越来越大,这样经常会收到告警信息,不得不手动去清理这些日志文件,这样手动维护的服务是 ...

  4. 运维基础(13)日志切割工具 Logrotate

    Logrotate 程序是一个日志文件管理工具,用于分割日志文件,压缩转存.删除旧的日志文件,并创建新的日志文件,下面就对 logrotate 日志轮转的记录: Linux 系统默认安装 logrot ...

  5. Linux日志切割工具Logrotate配置详解

    Logrotate 程序是一个日志文件管理工具.用于分割日志文件,压缩转存.删除旧的日志文件,并创建新的日志文件,下面就对logrotate日志轮转的记录: 1.1 Logrotate配置文件介绍 L ...

  6. 网络日志管理工具_企业网络日志管理的优质工具有哪些?

    规范的日志管理对企业是否合规的评判具有重要帮助.中国互联网发展到今天,网络合规审计已经到了势在必行的阶段.虽然互联网给我们的生活带来了诸多便利,但各类威胁也潜伏其中.企业网络设备遭受外部攻击所引发的网 ...

  7. Linux日志记录服务,日志管理工具

    syslog 简介: syslog是一种广泛使用的日志记录服务,用于记录系统和应用程序的事件,详细记录包括时间戳.主机IP地址.应用程序名称.优先级.消息内容等信息.syslog有三个主要部分:客户端 ...

  8. logstash+elastic+kibana日志管理工具介绍及安装

    logstash+elastic+kibana日志管理工具介绍及安装 一. Logstash 安装 1.1 前置条件,安装了官方java 7或更新版本 查看 [ldx@1511-min ~]$ jav ...

  9. 6个您需要了解的日志管理工具(以及如何使用它们)

    如果没有正确的工具来汇总和解析日志数据,则几乎不可能找到并了解您正在寻找的信息. 日志有无穷无尽的用途,因为日志本身是无止境的. 应用程序日志,安全日志,BI日志, 林肯日志 (好吧,也许不是)- 暂 ...

最新文章

  1. Python告诉你这些旅游景点好玩、便宜、人又少!
  2. 【英语天天读】奥哈拉给女儿的信
  3. 擷取Registry內的螢幕EDID資訊(沒解決問題不過可以學下)
  4. java sessionid长度_php中session_id()函数详细介绍,会话id生成过程及session id长度
  5. python discover()没有加载测试用例_对python_discover方法遍历所有执行的用例详解
  6. 天平称重【递归解法】
  7. 时钟php,php+js液晶时钟
  8. ETDM:基于显式时间差分建模的视频超分辨率(CVPR 2022)
  9. STM8学习笔记---NTC热敏电阻的使用
  10. [码海拾贝 之Perl]获取日期以及日期的加减
  11. “base-64 字符数组的无效长度”错误解决方案
  12. TD8.0管理员工具
  13. CentOS6 x86_64最小化安装优化脚本
  14. go语言介绍及应用场景分析
  15. 2021年4月蓝桥杯软件类省赛:题目+解析(完整版)
  16. 传感器实验——光敏电阻传感器
  17. 数字图像处理编程入门笔记
  18. 【React源码】(十八)React 算法之调和算法
  19. Leetcode之机器人大冒险
  20. pyton 爬虫-图片

热门文章

  1. moto z android7.1,联想新款 Moto Z 曝光:骁龙 835+Android 7.1.1,下月发布?
  2. mininet基本操作
  3. Redis安装配置 -- 来自网络
  4. 试试Nitrate?快速启动的几个方法
  5. 交换机路由器作用以及工作原理详解
  6. 淘宝手淘首页大改动,猜你喜欢成了首页主要流量入口,如何获取手淘首页流量,猜你喜欢,猜你喜欢接口,手淘首页流量接口
  7. html中设置背景图像填充,CSS-定位背景图像,添加填充
  8. 简单了解事件冒泡和阻止事件冒泡
  9. linux 创建用户命令
  10. linux操作系统怎么创建文件,Linux操作系统创建文件命令的方法