溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux的logrotate是什么

發(fā)布時間:2021-12-01 09:28:43 來源:億速云 閱讀:144 作者:iii 欄目:系統(tǒng)運維

這篇文章主要講解了“Linux的logrotate是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Linux的logrotate是什么”吧!

登錄到web服務(wù)上,上來 df -h 一把,果然,掛的一個共享又被撐爆。

root@websrv001 ~ # df -h  Filesystem            Size  Used Avail Use% Mounted on  /dev/mapper/rootvg-rootvol                         12G  5.6G  5.6G  50% /  tmpfs                  14G     0   14G   0% /dev/shm  /dev/sda1             477M   84M  368M  19% /boot  /dev/mapper/rootvg-homevol                        2.0G  4.0M  1.9G   1% /local/home  /dev/mapper/rootvg-tmpvol                        1.1G  252M  793M  25% /tmp  /dev/mapper/rootvg-varvol                        5.8G  1.1G  4.5G  20% /var  /dev/mapper/fsvol                        298G  298G     0 100% /net/fsvol  tmpfs                  14G     0   14G   0% /var/tmp

上次是因為liferay的log太大,這次再看看liferay的log

root@websrv001 ~ # ll -h /data/tomcat/storage/BU001/liferay/logs/  total 199M  drwxr-xr-x 2 tomcat tomcat 4.0K Apr 20 13:14 .  drwxr-xr-x 5 tomcat tomcat 4.0K Mar 14  2016 ..  -rw-r--r-- 1 tomcat tomcat 1.5M Apr 13 23:59 liferay.2020-04-13.log.gzipped_on_2020-04-17.gz  -rw-r--r-- 1 tomcat tomcat 2.5M Apr 14 23:59 liferay.2020-04-14.log.gzipped_on_2020-04-18.gz  -rw-r--r-- 1 tomcat tomcat 7.8M Apr 15 23:59 liferay.2020-04-15.log.gzipped_on_2020-04-19.gz  -rw-r--r-- 1 tomcat tomcat  31M Apr 17 23:58 liferay.2020-04-17.log  -rw-r--r-- 1 tomcat tomcat 7.0M Apr 18 23:59 liferay.2020-04-18.log  -rw-r--r-- 1 tomcat tomcat  90G Apr 20 17:54 liferay.2020-04-20.log

我列個去,尼瑪,一個liferay log文件,能增長到90G,這也太扯了 吧。果斷刪掉,不知道為什么,每當(dāng)我要敲rm -rf的時候,心里就莫名的緊張。。。

root@websrv001 ~ # rm -rf /data/tomcat/storage/BU001/liferay/logs/liferay.2020-04-20.log

重啟一下服務(wù)

root@websrv001 ~ # service tomcat restart

隨后通知了一下開發(fā)組那哥們兒,服務(wù)器磁盤已經(jīng)清理,服務(wù)已經(jīng)重啟,那邊也確認(rèn)了web服務(wù)又活了,可以用了。隨后,又檢查了一下其它文件夾,結(jié)果發(fā)現(xiàn)catalina.out這個日志文件,又是超級無敵大:89G,我也是醉了。

root@websrv001 ~ # ll -h /data/tomcat/server/BU001/logs/  total 104G  drwxrwxr-x  2 root   tomcat  12K Apr 20 04:45 .  drwxr-xr-x 13 root   root   4.0K Apr 16 17:26 ..  -rw-r--r--  1 tomcat tomcat 5.1K Apr 13 10:28 catalina.2020-04-13.log.gz  -rw-r--r--  1 tomcat tomcat  13K Apr 14 20:46 catalina.2020-04-14.log.gz  -rw-r--r--  1 tomcat tomcat 7.1K Apr 16 17:51 catalina.2020-04-16.log.gz  -rw-r--r--  1 tomcat tomcat  89G Apr 20 10:39 catalina.out -rw-r--r--  1 tomcat tomcat    0 Feb 10 23:57 catalina.out-20200210  -rw-r--r--  1 tomcat tomcat 352M Apr 13 03:38 catalina.out-20200413

問題雖然解決了,但是這個問題本來就不應(yīng)該發(fā)生?。‰y道之前做運維的同事都沒有做腳本來監(jiān)控和限制日志大小嘛?這可是生產(chǎn)系統(tǒng)啊!這樣可不行,既然沒人搞,我就來搞搞。于是網(wǎng)上搜了一把,原來Linux系統(tǒng)就自帶了一個日志切割神器——>logrotate

man了一下logrotate,看到了以下描述:logrotate is designed to ease administration of systems that generate large numbers of log files. It allows automatic rotation, compression, removal, and mailing of log files. Each log file may be handled daily, weekly, monthly, or when it grows too large.

Normally, logrotate is run as a daily cron job. It will not modify a log more than once in one day unless the criterion for that log is based on the log's size and logrotate is being run more than once each day, or unless the -f or --force option is used.

原來這個神器是為了方便管理系統(tǒng)大量日志文件而設(shè)計的,對日志文件可實現(xiàn)自動rotation(字面意思是旋轉(zhuǎn),覺得理解成日志循環(huán)更好一些),壓縮,刪除和通過email發(fā)送log文件。顆粒度控制很好,可以針對每一個log文件進(jìn)行每天,每周,每個月或者當(dāng)log文件過大時進(jìn)行rotate。

一般情況下呢,logrotate是基于每天的cron job來執(zhí)行的,所以對某個log文件的rotae每天執(zhí)行一次,除非rotate的執(zhí)行標(biāo)準(zhǔn)是基于log文件大小,并且你logrotate這個命令每天被執(zhí)行了多次,也就是你自定義了定時任務(wù),讓logrotate每x分鐘或者每x小時執(zhí)行一次,再或者你手動執(zhí)行這個命令添加了-f/--force這個選項。

另外,我發(fā)現(xiàn)這個神器是系統(tǒng)自帶的,可想而知這個工具是多么的重要,否則Linux也不會默認(rèn)就安裝了這個工具。

那接下來,我們來看看logrotate的相關(guān)配置以及如何執(zhí)行l(wèi)ogrotate。

logrotate的conf文件在 /etc/下:

[root@labhost ~]# ll /etc/logrotate.  logrotate.conf  logrotate.d/  [root@labhost ~]# cat /etc/logrotate.conf

那我們來看看logrotate.conf文件里面的內(nèi)容:

[root@labhost ~]# cat /etc/logrotate.conf  # see "man logrotate" for details  # rotate log files weekly:每周rotate log文件一次  weekly  # keep 4 weeks worth of backlogs:保存最近4周的log日志,因為上面是每周rotate一次  rotate 4  # create new (empty) log files after rotating old ones:rotate老日志文件之后,創(chuàng)建一個新的空日志文件  create  # use date as a suffix of the rotated file:rotate的文件以日期格式為后綴,比如:access_log-20200422,如果不加這個選項,rotate的格式為:access_log.1,access_log.2等等。  dateext  # uncomment this if you want your log files compressed:如果想壓縮rotate后的文件,把下面compress前面的#號去掉就可以了。  #compress  # RPM packages drop log rotation information into this directory:RPM包的日志rotation配置信息,建議放到/etc/logrotate.d這個文件夾下,實現(xiàn)自定義控制log文件rotate  include /etc/logrotate.d  # no packages own wtmp and btmp -- we'll rotate them here:wtmp和btmp這兩個不屬于任何package,我們就把rotate的規(guī)則寫到這里  /var/log/wtmp {       monthly #每個月執(zhí)行一次rotate      create 0664 root utmp  #創(chuàng)建空文件,權(quán)限是664, 所屬用戶名 所屬用戶組          minsize 1M   #日志文件大小超過1M才執(zhí)行rotate,否則跳過      rotate 1         #rotate時,只保留一份rotate文件  }  /var/log/btmp {      missingok      monthly      create 0600 root utmp      rotate 1  }  # system-specific logs may be also be configured here.#其它系統(tǒng)日志也可以在這里配置rotate規(guī)則

關(guān)于rotate規(guī)則的配置,從上面的logrotate.conf文件里可以看到,有兩個地方可以配置:

  • 一種是直接在logrotate.conf里配置,不過一般適用于非RPM包的系統(tǒng)日志文件。

  • 另外一種是如果你要做rotate的日志文件是由第三方RPM包軟件產(chǎn)生的,需要在/etc/logrotate.d這個文件夾下新建一個配置文件,配置相關(guān)rotate規(guī)則。(UnleBen發(fā)現(xiàn),其實如果你安裝了第三方的軟件包之后,在/etc/logrotate.d這個文件夾下就會自動創(chuàng)建了對應(yīng)軟件的rotate配置文件。)

Linux的logrotate是什么

UncleBen這里準(zhǔn)備了一臺干凈的CentOS7,在安裝httpd這個服務(wù)之前,我們來看一下/etc/logrotate.d這個文件夾下面都有哪些配置文件

[root@labhost ~]# ll /etc/logrotate.d/  total 20  -rw-r--r--. 1 root root  91 Apr 11  2018 bootlog  -rw-r--r--. 1 root root 224 Oct 30  2018 syslog  -rw-r--r--. 1 root root 100 Oct 31  2018 wpa_supplicant  -rw-r--r--. 1 root root 103 Nov  5  2018 yum  [root@labhost ~]#

我們現(xiàn)在安裝一下httpd服務(wù):

[root@labhost ~]# yum install httpd -y  Resolving Dependencies  --> Running transaction check  ---> Package httpd.x86_64 0:2.4.6-90.el7.centos will be installed  --> Finished Dependency Resolution  ......  Install  1 Package  Total download size: 2.7 M  Installed size: 9.4 M  Downloading packages:  httpd-2.4.6-90.el7.centos.x86_64.rpm                  | 2.7 MB  00:00:04  Running transaction check  Running transaction test  Transaction test succeeded  Running transaction    Installing : httpd-2.4.6-90.el7.centos.x86_64       1/1    Verifying  : httpd-2.4.6-90.el7.centos.x86_64       1/1  Installed:    httpd.x86_64 0:2.4.6-90.el7.centos  Complete!  [root@labhost ~]#

再去/etc/logrotate.d這個文件夾下看一下:

[root@labhost ~]# ll /etc/logrotate.d/  total 24  -rw-r--r--. 1 root root  91 Apr 11  2018 bootlog  -rw-r--r--. 1 root root 194 Aug  6  2019 httpd  -rw-r--r--. 1 root root 224 Oct 30  2018 syslog  -rw-r--r--. 1 root root 100 Oct 31  2018 wpa_supplicant  -rw-r--r--. 1 root root 103 Nov  5  2018 yum  [root@labhost ~]#

可以看到,安裝httpd之后,自動創(chuàng)建好了針對httpd服務(wù)的log rotate配置文件,打開看看:

[root@labhost ~]# cat /etc/logrotate.d/httpd  /var/log/httpd/*log {       missingok       notifempty      sharedscripts      delaycompress      postrotate          /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true      endscript  }  [root@labhost ~]#

這就是一個標(biāo)準(zhǔn)的,針對第三方軟件的一個logrotate配置文件,簡單說明一下:

格式:

  • log文件的路徑(支持通配符*),再加上一對花括號{}

  • 花括號里面的內(nèi)容就是logrotate的規(guī)則參數(shù),需要單獨成行。

參數(shù)解讀:

missingok: 如果日志不存在,不產(chǎn)生錯誤信息

notifempty:如果日志文件為空,不做rotate,這個跟你ifempty互斥

sharedscripts:配合prerotate and postrotate 使用,sharedscripts 開啟的話,如果使用了對需要做rotate的log文件使用了

通配符,那么*

prerotate** and postrotate 的腳本只會執(zhí)行一次。沒有sharedscripts 的話,每個需要log文件做rotate的時候都會執(zhí)行一遍prerotate and postrotate 的腳本

delaycompress:延遲壓縮舊的日志文件,先rotate,不進(jìn)行壓縮,等到下次rotate時,才會壓縮上次rotate的文件。這個需要跟compress一起使用,單獨使用不生效。

postrotate/endscript:rotate之后想要執(zhí)行的腳本,需要放在postrotate 與 endscript中間,這兩個選項要單獨成行。

除了上面的參數(shù)外,還有以下常見參數(shù):

daily            指定rotate周期為每天,還有weekly, monthly。  rotate count    指定rotate日志文件保留的數(shù)量,如果沒有配置這個參數(shù),就不保留備份,設(shè)置1的話,就是保                    留1個rotate備份,10就是保留10個rotate備份。  size size        當(dāng)日志文件到達(dá)指定的大小時才轉(zhuǎn)儲,默認(rèn)的大小單位是bytes,可以以k,M,G。比如size 10k,                  10M, 10G。  compress        通過gzip壓縮然后備份日志。  nocompress      默認(rèn)值,不做gzip壓縮處理。  delaycompress   和compress配合使用,rotate的日志文件到下一次執(zhí)行l(wèi)ogrotate時才進(jìn)行壓縮處理。  copytruncate    把當(dāng)前日志備份并截斷,先拷貝原日志文件再清空,由于拷貝和清空之間有一個時間差,可能會丟失部                 分日志數(shù)據(jù)。  create mode owner group        rotate之后,創(chuàng)建新文件的日志文件并指定新文件的屬性,比如:                              create 644 tomcat tomcat  mail address     把rotate的日志文件發(fā)送到指定的E-mail。  dateext          使用當(dāng)期日期作為命名格式,如果指定的rotate大于1,默認(rèn)rotate之后的文件名是:xx.log.1,                     xx.log.2, xx.log3,如果配置dateext規(guī)則,那么rotate之后的文件名就會以日期結(jié)                     尾:xx.log.2020-04-20,xx.log.2020-04-21, xx.log.2020-04-22 dateformat -%Y%m%d%H.%s   定義文件rotate后的文件名的日期格式,必須配合dateext使用,查了一下資料,目前只支持: %Y %m %d %H %s 這幾個個參數(shù)(年,月,日,時,秒)

rotate的規(guī)則是配置好了,但是怎么來執(zhí)行呢?我們來help一下。

[root@labhost ~]# logrotate --help  Usage: logrotate [OPTION...] <configfile>    -d, --debug               Don't do anything, just test (implies -v)    -f, --force               Force file rotation    -m, --mail=command        Command to send mail (instead of `/bin/mail')    -s, --state=statefile     Path of state file    -v, --verbose             Display messages during rotation    -l, --log=STRING          Log file    --version                 Display version information  Help options:    -?, --help                Show this help message    --usage                   Display brief usage message  [root@labhost ~]#

這里著重說一下-d和-f兩個選項:

-d:debug模式,就是先演練一遍,不是真干。

-f:強(qiáng)制模式,實打?qū)嵉膱?zhí)行。

從上面我們man logrotate的信息可以了解到:一般情況下呢,logrotate是基于每天的cron job來執(zhí)行的,所以對某個log文件的rotae每天執(zhí)行一次,除非rotate的執(zhí)行標(biāo)準(zhǔn)是基于log文件大小,并且你logrotate這個命令每天被執(zhí)行了多次,也就是你自定義了定時任務(wù),讓logrotate每x分鐘或者每x小時執(zhí)行一次,再或者你手動執(zhí)行這個命令添加了-f/--force這個選項。

為什么是每天執(zhí)行一次呢?我們?nèi)?etc/cron.daily/,/etc/cron.weekly/,/etc/cron.monthly/,/etc/cron.hourly/可以看到,在/etc/cron.daily/這個文件夾下有一個logrotate可執(zhí)行腳本,那每天就會跑一次啦!

[root@labhost ~]# ll /etc/cron.daily/  total 8  -rwx------. 1 root root 219 Oct 31  2018 logrotate  -rwxr-xr-x. 1 root root 618 Oct 30  2018 man-db.cron  [root@labhost ~]# ll /etc/cron.weekly/  total 0  [root@labhost ~]# ll /etc/cron.monthly/  total 0  [root@labhost ~]# ll /etc/cron.hourly/  total 4  -rwxr-xr-x. 1 root root 392 Apr 11  2018 0anacron  [root@labhost ~]#

那我們來看看logrotate腳本里寫的什么內(nèi)容:

[root@labhost ~]# cat /etc/cron.daily/logrotate  #!/bin/sh  /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf  EXITVALUE=$?  if [ $EXITVALUE != 0 ]; then      /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"  fi  exit 0  [root@labhost ~]#

簡單理解就是執(zhí)行l(wèi)ogrotate命令,并且指定執(zhí)行l(wèi)ogrotate時狀態(tài)文件和執(zhí)行的conf文件:/etc/logrotate.conf。大家還記不記得在這個文件里,有一行:include /etc/logrotate.d,也就是說在執(zhí)行l(wèi)ogrotate.conf這個文件時,一并執(zhí)行/etc/logrotate.d文件夾下的配置文件。下面幾行就是執(zhí)行出錯時,logger一下。

所以,我們執(zhí)行l(wèi)ogrotate時,可以直接運行:logrotate + confi文件名

[root@labhost ~]# logrotate /etc/logrotate.d/httpd

如果一切順利,那么logrotate命令會執(zhí)行成功,httpd的日志文件會被按照你配置的規(guī)則進(jìn)行rotate。但是如果沒有達(dá)到你的期望結(jié)果,你就需要來debug了。其實推薦大家在放到生產(chǎn)環(huán)境之前,最好好是用-d選項來測試一下你寫的配置文件是否可以達(dá)到你的預(yù)期。我們來看一下加上-d選項的運行結(jié)果:

[root@labhost ~]# logrotate -d /etc/logrotate.d/httpd  reading config file /etc/logrotate.d/httpd  Allocating hash table for state file, size 15360 B  Handling 1 logs  rotating pattern: /var/log/httpd/*log  1048576 bytes (no old logs will be kept)  empty log files are not rotated, old logs are removed  considering log /var/log/httpd/access_log    log does not need rotating (log size is below the 'size' threshold)  considering log /var/log/httpd/error_log    log does not need rotating (log size is below the 'size' threshold)  not running postrotate script, since no logs were rotated  [root@labhost ~]#

現(xiàn)在我們把httpd這個logrotate的流程梳理一下:

  • httpd這個logrotate的配置文件會每天被執(zhí)行一次,因為logrotate腳本默認(rèn)放置在/etc/cron.daily/下,腳本會根據(jù)/etc/logrotate.conf配置文件來執(zhí)行l(wèi)ogrotate命令,而針對httpd服務(wù)的logrotate配置文件在/etc/logrotate.d/下,此文件夾被包含在了/etc/logrotate.conf配置文件里。

  • 如果/var/log/httpd/下沒有以log結(jié)尾的文件也不會記錄錯誤信息。

  • 如果/var/log/httpd/下的log文件是空文件,那么不會執(zhí)行rotate操作。

  • 在執(zhí)行l(wèi)ogrotate之后,httpd服務(wù)會被重新加載

對于大多數(shù)情況下,每天把日志備份一下已經(jīng)足夠了。但是像UncleBen周一遇到的這種case:一天之內(nèi),log日志把磁盤給撐爆了。那這種case,用logrotate該如何解決呢?

首先我們來捋一下需求:

  • 要解決log文件一天之內(nèi)增長過快,撐爆磁盤的問題。所以關(guān)鍵詞就是:一天之內(nèi)->時間,撐爆磁盤->文件大小

執(zhí)行周期

logrotate默認(rèn)是每天,我們的需求是一天之內(nèi),所以可以讓logrotate每半天(每12小時)、每8個小時、每4個小時、每2個小時,甚至是每小時執(zhí)行一次,都可以。這個看各位心情。

文件大小

超過多大才執(zhí)行l(wèi)ogrotate,這個也是根據(jù)實際環(huán)境來確定。UncleBen遇到這個case,日志竟然暴漲到89G,我這里就設(shè)置成超過1G大小就進(jìn)行rotate。

為了能讓各位客官老爺們看到真是的效果,我這里做了一點小小的改動,話不多說了,上demo:

httpd logrotate的配置文件更改如下:

version1:在原來基礎(chǔ)上增加了一行:rotate 3

[root@labhost ~]# cat /etc/logrotate.d/httpd  /var/log/httpd/*log {      rotate 3      missingok      notifempty      sharedscripts      delaycompress      postrotate          /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true      endscript  }  [root@labhost ~]#

然后我來創(chuàng)建一個cron job,每分鐘執(zhí)行一次:

*/1 * * * * /usr/sbin/logrotate /etc/logrotate.d/httpd

然后創(chuàng)建一個監(jiān)控httpd文件夾下log文件的腳本:

[root@labhost ~]# cat monitorlog.sh  #!/bin/bash  while :  do      sleep 2      ls -hl /var/log/httpd/  done

我們來執(zhí)行一下monitorlog.sh,來觀察一下httpd的日志文件。注意:我這里是訪問了Apache默認(rèn)的站點,然后手動刷新Apache站點,來產(chǎn)生點access log,然后停止刷新頁面。

[root@labhost ~]# ./monitorlog.sh  total 140K  -rw-r--r--. 1 root root 79K Apr 24 14:09 access_log  -rw-r--r--. 1 root root 12K Apr 24 14:09 error_log  total 140K  -rw-r--r--. 1 root root 79K Apr 24 14:09 access_log  -rw-r--r--. 1 root root 12K Apr 24 14:09 error_log  total 96K  -rw-r--r--. 1 root root   0 Apr 24 14:10 access_log  -rw-r--r--. 1 root root 79K Apr 24 14:09 access_log.1  -rw-r--r--. 1 root root 370 Apr 24 14:10 error_log  -rw-r--r--. 1 root root 12K Apr 24 14:10 error_log.1  total 96K  -rw-r--r--. 1 root root   0 Apr 24 14:10 access_log  -rw-r--r--. 1 root root 79K Apr 24 14:09 access_log.1  -rw-r--r--. 1 root root 370 Apr 24 14:10 error_log  -rw-r--r--. 1 root root 12K Apr 24 14:10 error_log.1  ...

我們可以看到:

  • 由于我設(shè)定的是每分鐘執(zhí)行一次logrotate,并且指定了httpd這個logrotate配置文件,所以我們配置的規(guī)則會每分鐘被執(zhí)行一次。

  • /var/log/httpd/這個文件夾下:

    • 只有access_log和error_log這兩個文件。

    • Apr 24 14:09時,access_log文件大小是79K, error_log文件大小是12K。

  • 停止刷新頁面,等待一分鐘之后

  • /var/log/httpd/這個文件夾下:

    • 增加了兩個文件:access_log.1和error_log.1

    • Apr 24 14:10時,access_log文件被清空,大小為0;而error_log不是空的,證明一直有error信息產(chǎn)生。

  • 為了驗證notifempty這個參數(shù)是否生效,我們不刷新頁面,再多等兩分鐘,然后從monitorlog.sh執(zhí)行的結(jié)果來看:

  • access_log沒有被rotate,因為在第一次access log文件被rotate之后,沒有訪問日志產(chǎn)生,它的大小為0,我們在配置文件里加了notifempty這個參數(shù),意思就是如果為空,不做rotate。

Apr 24 14:13 /var/log/httpd/文件夾下信息:

total 96K  -rw-r--r--. 1 root root   0 Apr 24 14:10 access_log  -rw-r--r--. 1 root root 79K Apr 24 14:09 access_log.1  -rw-r--r--. 1 root root 370 Apr 24 14:13 error_log  -rw-r--r--. 1 root root 663 Apr 24 14:13 error_log.1  -rw-r--r--. 1 root root 663 Apr 24 14:12 error_log.2  -rw-r--r--. 1 root root 663 Apr 24 14:11 error_log.3

rotate 3這個參數(shù):

  • 始終保留3份rotate的文件,那我們多等幾分鐘,再看看/var/log/httpd/這個文件夾下有哪些文件,即可驗證。

  • rotate后的文件名:是以.數(shù)字結(jié)尾。

Apr 24 14:14 /var/log/httpd/文件夾下信息:

total 96K  -rw-r--r--. 1 root root   0 Apr 24 14:10 access_log  -rw-r--r--. 1 root root 79K Apr 24 14:09 access_log.1  -rw-r--r--. 1 root root 370 Apr 24 14:14 error_log  -rw-r--r--. 1 root root 663 Apr 24 14:14 error_log.1  -rw-r--r--. 1 root root 663 Apr 24 14:13 error_log.2  -rw-r--r--. 1 root root 663 Apr 24 14:12 error_log.3

Apr 24 14:15 /var/log/httpd/文件夾下信息:

total 96K  -rw-r--r--. 1 root root   0 Apr 24 14:10 access_log  -rw-r--r--. 1 root root 79K Apr 24 14:09 access_log.1  -rw-r--r--. 1 root root 370 Apr 24 14:15 error_log  -rw-r--r--. 1 root root 663 Apr 24 14:15 error_log.1  -rw-r--r--. 1 root root 663 Apr 24 14:14 error_log.2  -rw-r--r--. 1 root root 663 Apr 24 14:13 error_log.3

delaycompress這個參數(shù):

  • 是必須要和compress一起使用的,單獨使用無效,可以看到?jīng)]有任何log文件被壓縮處理,rotate前和rotate后的文件大小保持一致。

postrotate/endscript這個參數(shù)里的腳本:/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true endscript

就是在log日志被rotate之后,需要重新reload httpd service,如果沒有這個腳本會怎么樣呢?我們來到/etc/logrotate.d/httpd里,把這3行注釋掉。再到monitorlog.sh執(zhí)行的結(jié)果來看看:

total 92K  -rw-r--r--. 1 root root   0 Apr 24 14:10 access_log  -rw-r--r--. 1 root root 79K Apr 24 14:09 access_log.1  -rw-r--r--. 1 root root 370 Apr 24 14:47 error_log.1  -rw-r--r--. 1 root root 663 Apr 24 14:47 error_log.2  -rw-r--r--. 1 root root 663 Apr 24 14:46 error_log.3

注釋掉postrotate/endscript腳本后,我們發(fā)現(xiàn):

  • error_log文件在執(zhí)行rotate之后,新的error_log并沒有被創(chuàng)建出來。

  • 我們來刷新一下頁面,嘗試產(chǎn)生新的access log,發(fā)現(xiàn)可以正常寫入,大小有變化。 

total 136K  -rw-r--r--. 1 root root  38K Apr 24 14:52 access_log  -rw-r--r--. 1 root root  79K Apr 24 14:09 access_log.1  -rw-r--r--. 1 root root 5.4K Apr 24 14:52 error_log.1  -rw-r--r--. 1 root root  663 Apr 24 14:47 error_log.2  -rw-r--r--. 1 root root  663 Apr 24 14:46 error_log.3
  • 但是我們等待文件被rotate之后,再來觀察一下,我們發(fā)現(xiàn),access_log在被rotate之后,新的access_log文件同樣沒有被創(chuàng)建出來。 

total 136K  -rw-r--r--. 1 root root  38K Apr 24 14:52 access_log.1  -rw-r--r--. 1 root root  79K Apr 24 14:09 access_log.2  -rw-r--r--. 1 root root 5.4K Apr 24 14:52 error_log.1  -rw-r--r--. 1 root root  663 Apr 24 14:47 error_log.2  -rw-r--r--. 1 root root  663 Apr 24 14:46 error_log.3
  • 如果我們繼續(xù)嘗試刷新頁面,發(fā)現(xiàn)access_log.1和error_log.1日志大小都會增長。這個就可以說明postrotate/endscript中間腳本的作用了,如果沒有這個腳本,也就是在執(zhí)行l(wèi)ogrotate之后,沒有reload httpd service,那么httpd服務(wù)會繼續(xù)往舊的log日志中寫信息,那么針對/var/log/httpd/*log后續(xù)的logrotate命令都不會被執(zhí)行。為什么?

  • 配置文件里的文件路徑寫了:/var/log/httpd/*log,你是針對以log結(jié)尾的文件名。

  • 現(xiàn)在被rotate之后的文件名全都是以 . 數(shù)字結(jié)尾的。 

total 148K  -rw-r--r--. 1 root root  49K Apr 24 15:30 access_log.1  -rw-r--r--. 1 root root  79K Apr 24 14:09 access_log.2  -rw-r--r--. 1 root root 6.9K Apr 24 15:30 error_log.1  -rw-r--r--. 1 root root  663 Apr 24 14:47 error_log.2  -rw-r--r--. 1 root root  663 Apr 24 14:46 error_log.3

記不記得我們還有一個參數(shù)叫copytruncate,我們來試試,在沒有postrotate/endscript腳本時,加上這個參數(shù)是什么效果。

version2:刪除postrotate/endscript腳本,增加copytruncate

[root@labhost ~]# cat /etc/logrotate.d/httpd  /var/log/httpd/*log {      rotate 3      missingok      notifempty      sharedscripts      delaycompress      copytruncate  }

我們先stop httpd service,然后刪除所有的access_log和error_log, 最后start httpd service,可以看到,httpd的日志文件正常產(chǎn)生了。

[root@labhost ~]# systemctl stop httpd  [root@labhost ~]# rm -rf /var/log/httpd/*  [root@labhost ~]# ll /var/log/httpd/  total 0  [root@labhost ~]#  [root@labhost ~]# systemctl start httpd  [root@labhost ~]# ll /var/log/httpd/  total 4  -rw-r--r--. 1 root root   0 Apr 24 15:47 access_log  -rw-r--r--. 1 root root 812 Apr 24 15:47 error_log  [root@labhost ~]#

接下來我們再刷新一下頁面,產(chǎn)生一些access log和error log,等待幾分鐘,執(zhí)行mornitorlog.sh來看一下:

  • access_log和error_log都可以正常rotate。

  • 新的access_log和error_log文件都可以被創(chuàng)建出來,并且可以正常寫入log日志。 

total 60K  -rw-r--r--. 1 root root  17K Apr 24 15:51 access_log  -rw-r--r--. 1 root root  27K Apr 24 15:51 access_log.1  -rw-r--r--. 1 root root 2.3K Apr 24 15:51 error_log  -rw-r--r--. 1 root root 3.6K Apr 24 15:51 error_log.1  -rw-r--r--. 1 root root  812 Apr 24 15:48 error_log.2

所以,比起放在postrotate/endscript中間的reload httpd service腳本,我更喜歡用copytruncate這個參數(shù)。

version3:在version2的基礎(chǔ)上,增加dateext參數(shù)

[root@labhost ~]# cat /etc/logrotate.d/httpd  /var/log/httpd/*log {      rotate 3      missingok      notifempty      sharedscripts      delaycompress      copytruncate      dateext  }

我們嘗試訪問頁面,刷新,產(chǎn)生一些access log和error log。等待幾分鐘,我們執(zhí)行monitorlog.sh來看一下,可以發(fā)現(xiàn):

  • 最近一次被rotate log文件時以日期格式結(jié)尾的。

  • 我們的cron job規(guī)定每分鐘執(zhí)行一次logrotate,但是在添加dateext參數(shù)之后失效了。所以:

    • 如果你想要logrotate每天執(zhí)行多次(大于一次),就不要添加dateext參數(shù)。

    • 如果你既想要logrotate每天執(zhí)行多次(大于一次),還想rotate之后的文件以日期格式結(jié)尾,有一種方法就是添加dateformat .%s參數(shù)。 

total 144K  -rw-r--r--. 1 root root  30K Apr 24 16:55 access_log  -rw-r--r--. 1 root root 9.3K Apr 24 15:56 access_log.1  -rw-r--r--. 1 root root  17K Apr 24 15:52 access_log.2  -rw-r--r--. 1 root root  26K Apr 24 16:07 access_log-20200424  -rw-r--r--. 1 root root  27K Apr 24 15:51 access_log.3  -rw-r--r--. 1 root root 4.1K Apr 24 16:55 error_log  -rw-r--r--. 1 root root 1.3K Apr 24 15:56 error_log.1  -rw-r--r--. 1 root root 2.3K Apr 24 15:52 error_log.2  -rw-r--r--. 1 root root 3.6K Apr 24 16:07 error_log-20200424  -rw-r--r--. 1 root root 3.6K Apr 24 15:51 error_log.3

version4:在version3的基礎(chǔ)上,增加dateformat -%Y%m%d%H.%s參數(shù)

[root@labhost ~]# cat /etc/logrotate.d/httpd  /var/log/httpd/*log {      rotate 3      missingok      notifempty      sharedscripts      delaycompress      copytruncate      dateext      dateformat -%Y%m%d%H.%s  }

我們再次嘗試訪問頁面,刷新,產(chǎn)生一些access log和error log。等待幾分鐘,我們執(zhí)行monitorlog.sh來看一下,可以發(fā)現(xiàn):

  • 我們的cron job現(xiàn)在執(zhí)行正常了,當(dāng)log文件非空并且有更新時,可以被執(zhí)行多次。

  • 被rotate之后的文件是以日期格式結(jié)尾的:

    • -橫杠開頭,接著時年月日時,然后句點. 最后是秒,但是最后的.s%是從1970年1月1日00:00:00到目前經(jīng)歷的秒數(shù)。 

total 172K  -rw-r--r--. 1 root root 7.5K Apr 24 17:41 access_log  -rw-r--r--. 1 root root  26K Apr 24 16:07 access_log-20200424  -rw-r--r--. 1 root root  25K Apr 24 17:32 access_log-2020042417.1587720721  -rw-r--r--. 1 root root  14K Apr 24 17:39 access_log-2020042417.1587721141  -rw-r--r--. 1 root root 3.8K Apr 24 17:40 access_log-2020042417.1587721201  -rw-r--r--. 1 root root 1.1K Apr 24 17:41 error_log  -rw-r--r--. 1 root root 3.6K Apr 24 16:07 error_log-20200424 -rw-r--r--. 1 root root 3.3K Apr 24 17:32 error_log-2020042417.1587720721  -rw-r--r--. 1 root root 1.8K Apr 24 17:39 error_log-2020042417.1587721141  -rw-r--r--. 1 root root  514 Apr 24 17:40 error_log-2020042417.1587721201

給大家留個問題:如果dateformat定義的格式是:-%Y%m%d%H,那么在日志文件非空并且持續(xù)更新的情況下,access_log和error_log會多久被rotate一次?

version5:在version4的基礎(chǔ)上,增加size 50K參數(shù)

[root@labhost ~]# cat /etc/logrotate.d/httpd  /var/log/httpd/*log {      size 50K      rotate 3      missingok      notifempty      sharedscripts      delaycompress      copytruncate      dateext      dateformat -%Y%m%d%H.%s  }

這一次,我們先執(zhí)行monitorlog.sh來看一下access_log和error_log的大小,再嘗試訪問頁面,刷新,產(chǎn)生一些access log和error log,注意一下,因為我配置的size大小是50K,所以讓access_log文件大小<50K,然后等待幾分鐘,觀察monitorlog.sh輸出,可以發(fā)現(xiàn):

  • access_log和error_log文件都沒有被rotate,因為他們的大小都沒有超過50K,從下面的結(jié)果可以看出:

  • access_log大小是49K

  • error_log大小是6.6K 

total 132K  -rw-r--r--. 1 root root  49K Apr 24 18:04 access_log  -rw-r--r--. 1 root root  26K Apr 24 16:07 access_log-20200424  -rw-r--r--. 1 root root 1.9K Apr 24 17:56 access_log-2020042417.1587722161  -rw-r--r--. 1 root root 3.8K Apr 24 17:58 access_log-2020042417.1587722281  -rw-r--r--. 1 root root 7.5K Apr 24 17:59 access_log-2020042417.1587722341  -rw-r--r--. 1 root root 6.6K Apr 24 18:04 error_log  -rw-r--r--. 1 root root 3.6K Apr 24 16:07 error_log-20200424  -rw-r--r--. 1 root root  257 Apr 24 17:56 error_log-2020042417.1587722161  -rw-r--r--. 1 root root  514 Apr 24 17:58 error_log-2020042417.1587722281  -rw-r--r--. 1 root root 1.1K Apr 24 17:59 error_log-2020042417.1587722341
  • 現(xiàn)在我們繼續(xù)刷新頁面,讓access_log大小>50K,觀察monitorlog.sh輸出,可以發(fā)現(xiàn):

  • Apr 24 18:12時

    • logrotate被執(zhí)行了一次,由于access_log文件大小>50K,所以就被rotate了。并保存為:access_log-2020042418.1587723121

    • 由于error_log文件大小<50K,所以此次logrotate忽略了這個文件。 

total 132K  -rw-r--r--. 1 root root  52K Apr 24 18:11 access_log  -rw-r--r--. 1 root root  26K Apr 24 16:07 access_log-20200424  -rw-r--r--. 1 root root 1.9K Apr 24 17:56 access_log-2020042417.1587722161  -rw-r--r--. 1 root root 3.8K Apr 24 17:58 access_log-2020042417.1587722281  -rw-r--r--. 1 root root 7.5K Apr 24 17:59 access_log-2020042417.1587722341  -rw-r--r--. 1 root root 7.1K Apr 24 18:11 error_log -rw-r--r--. 1 root root 3.6K Apr 24 16:07 error_log-20200424  -rw-r--r--. 1 root root  257 Apr 24 17:56 error_log-2020042417.1587722161  -rw-r--r--. 1 root root  514 Apr 24 17:58 error_log-2020042417.1587722281  -rw-r--r--. 1 root root 1.1K Apr 24 17:59 error_log-2020042417.1587722341  total 128K  -rw-r--r--. 1 root root    0 Apr 24 18:12 access_log  -rw-r--r--. 1 root root  26K Apr 24 16:07 access_log-20200424  -rw-r--r--. 1 root root 3.8K Apr 24 17:58 access_log-2020042417.1587722281  -rw-r--r--. 1 root root 7.5K Apr 24 17:59 access_log-2020042417.1587722341  -rw-r--r--. 1 root root  52K Apr 24 18:12 access_log-2020042418.1587723121  -rw-r--r--. 1 root root 7.1K Apr 24 18:11 error_log  -rw-r--r--. 1 root root 3.6K Apr 24 16:07 error_log-20200424  -rw-r--r--. 1 root root  257 Apr 24 17:56 error_log-2020042417.1587722161  -rw-r--r--. 1 root root  514 Apr 24 17:58 error_log-2020042417.1587722281  -rw-r--r--. 1 root root 1.1K Apr 24 17:59 error_log-2020042417.1587722341

version6:在version5的基礎(chǔ)上,增加compress參數(shù)

[root@labhost ~]# cat /etc/logrotate.d/httpd  /var/log/httpd/*log {      compress      size 50K      rotate 3      missingok      notifempty      sharedscripts      delaycompress      copytruncate      dateext      dateformat -%Y%m%d%H.%s  }

我們繼續(xù)刷新頁面,讓access_log大小>50K,觀察monitorlog.sh輸出,可以發(fā)現(xiàn):

  • Apr 24 17:59時

    • logrotate被執(zhí)行了一次,由于access_log文件大小>50K,所以就被rotate了,并且被做了壓縮處理,保存為:access_log-2020042417.1587722341.gz

    • 被壓縮之前大小是7.5K,被壓縮后是398,不到1k,所以強(qiáng)烈推薦添加這個參數(shù),節(jié)省空間啊?。?!

    • 由于error_log文件大小<50K,所以此次logrotate忽略了這個文件。 

total 168K  -rw-r--r--. 1 root root    0 Apr 24 18:20 access_log  -rw-r--r--. 1 root root  26K Apr 24 16:07 access_log-20200424  -rw-r--r--. 1 root root  398 Apr 24 17:59 access_log-2020042417.1587722341.gz  -rw-r--r--. 1 root root 1.3K Apr 24 18:12 access_log-2020042418.1587723121.gz  -rw-r--r--. 1 root root  84K Apr 24 18:20 access_log-2020042418.1587723601  -rw-r--r--. 1 root root  19K Apr 24 18:19 error_log  -rw-r--r--. 1 root root 3.6K Apr 24 16:07 error_log-20200424  -rw-r--r--. 1 root root  257 Apr 24 17:56 error_log-2020042417.1587722161  -rw-r--r--. 1 root root  514 Apr 24 17:58 error_log-2020042417.1587722281  -rw-r--r--. 1 root root 1.1K Apr 24 17:59 error_log-2020042417.1587722341

感謝各位的閱讀,以上就是“Linux的logrotate是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Linux的logrotate是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI