使用 logrotate对centos中各服务程序的日志文件进行转储

1.mosquitto的日志输出方式简介

mosquitto是一个纯C的代码,它的日志输出支持若干中日志输出方式,通过修改配置项:log_dest即可完成对各种日志输出类型的切换,常见的日志输出类型有有下几种:

(1)控制台输出stdout、stderrr

log_dest stderr

(2)输出到日志文档

log_dest file /home/logs/mosquitto/mosquitto.log

【注意】

[1] log_dest后面还有个参数file,然后才是实际的日志文件全名;

[2] 所使用的日志文件/home/logs/mosquitto/mosquitto.log要先建立好,并且让mosquitto有权限访问;

(3)发送到日志系统syslog

log_dest syslog

如果要配置了该项目,要同时配置参数log_facility,在centos7下,日志被输出到了:/var/log/messages中,但是messages中有系统的各种使用了syslog的应用的日志,凡是mosquitto的日志输出都有mosquitto字段,如下所示:

May 23 12:05:32 localhostmosquitto[18506]: Socket error on client 1000024,disconnecting.

May 23 12:05:32 localhostmosquitto[18506]: Socket error on client 1000025,disconnecting.

除了上述方式之外,mosquitto还可以把所有的日志都pub到自己的某个主题上,不过这种方式不太常用。

下面将重点介绍将日志输出文件的方式:

在生产环境中,我们一般都是将日志输出到指定的文件,然后再通过日志收集系统对日志进行统一的收集和处理,但是mosquitto的日志输出比较简单,在以文件方式输出日志时,无法对日志文件进行转储,即它会一直向配置文件里面指定的那个日志文件输出日志,随着线上运营时间的增加,该日志文件会慢慢变得非常大,如果不定期清理,超过10几G都很正常,我们保留日志文件就是为了后续分析问题,如果直接清空日志文件就达不到这个目标,如果不清空,终归会把硬盘撑爆,另外,太大的日志文件也不利于分析问题;

针对mosquitto的文件方式输出日志内容存在的这些问题,可以通过linux系统自带的logrotate来对mosquitto生成的日志文件按照日期、大小等进行转储,让logrotate定期把日志文件转储一下,并且保留指定数量的日志转储文件,以满足线上运营的需求。

2. logrotate的简单介绍:

logrotate是linux系统自带的日志文件管理工具,它可以帮助我们来完成对某个日志文件的转储,当然它还有其他的功能,例如:将日志发送到指定的email等等;它实际的工作机制非常简单:在linux系统下,Crontab每天都会执行logrotate,而logrotate每执行一次,就把我们的日志转储一次;

logrotate通过与定时任务Crontab结合来工作,就能满足定期,例如每天对日志文件进行转储的功能,其原理是:

我们知道Crontab在Centos下的/etc目录中有几个定时执行的脚本目录,例如:/etc/cron.daily,在该文件夹下保存了Crontab每天都会定时执行的脚本,当然目录/etc/cron.weekly下记录Crontab每周都会定时执行的脚本....;我们可以看下在目录/etc/cron.daily中有个脚本文件:logrotate,这个脚本的内容为:

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf

EXITVALUE=$?

if [ $EXITVALUE != 0 ]; then

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

fi

exit 0

从脚本的内容就可以看出,它主要用于执行程序logrotate,并且启动logrotate的时候使用了配置文件:/etc/logrotate.conf。下面就是对这个配置文件内容进行简单的介绍:

# see "man logrotate" fordetails

# rotate log files weekly

weekly

# keep 4 weeks worth of backlogs

rotate 4

# create new (empty) log files afterrotating old ones

create

# use date as a suffix of the rotated file

dateext

# uncomment this if you want your logfiles compressed

#compress

# RPM packages drop log rotationinformation into this directory

include /etc/logrotate.d

# no packages own wtmp and btmp -- we'llrotate 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 beconfigured here.

前面都是认配置项,这些配置项可以被后续的配置所覆盖,这里需要关注的是配置项:include /etc/logrotate.d,它表示logrotate在启动的时候还要把目录/etc/logrotate.d中的配置文件都执行一遍;为了便于使用,每个应用程序都可以编写自己的logrotate配置文件,然后把编写好的配置文件放在目录/etc/logrotate.d下,这样每个程序自己的配置项就会把上面的认配置项给覆盖掉;我们接下来看一下应该如何编写每个应用程序自己的logrotate配置文件,以mosquitto的为例:

配置文件内容为:

/home/logs/mosquitto/mosquitto.log {

daily

dateext

copytruncate

nocompress

rotate 15

}

上述过程梳理如下:

(1)logrotate的启动脚本被放在了Crontab每天执行的脚本目录中/etc/cron.daily,这样Crontab每天都会执行一次logrotate;

(2)logrotate启动的时候,使用了配置文件/etc/logrotate.conf;

(3) 配置/etc/logrotate.conf中又引入了目录:/etc/logrotate.d;

(4)我们在/etc/logrotate.d目录下建立自己的logrotate配置文件

(5)这样,当logrotate启动的时候就会执行一次转储,从而按照我们的配置来转储我们指定的日志文件

3. Mosquitto日志转储配置步骤如下:

(1)在目录/etc/logrotate.d/下创建一个日志转储的配置文件(名字可以自己定义,只要在该目录下就会被执行):mosquitto

(2)配置文件mosquitto的内容如下:

/home/logs/mosquitto/mosquitto.log {

daily

dateext

copytruncate

nocompress

rotate 15

}

下面是对上述内容的解释:

第一行的左大括号之前的/home/logs/mosquitto/mosquitto.log 指出了要转储的日志文件的具体位置和文件名;

daily:按天去转储;

dateext:表示转储后的日志文件会附加上日期信息

copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;

nocompress 不要对转储的日志压缩

rotate 15 保留多少个转储之后的日志文件

(3)确保mosquitto的权限为:-rw-r--r--

如下所示:

[root@localhost jason]# ll/etc/logrotate.d/

total 32

-rw-r--r-- 1 root root 88 May31 10:23 mosquitto


【特别注意】

权限不能错,只能为:

如果你修改为其他的,例如:-rwxrwxrwx,虽然你放开了权限,但是logrotate不认,它会出现:

[root@localhost jason]#/usr/sbin/logrotate -vf /etc/logrotate.d/

Ignoring mosquitto because of bad filemode.

进而造成logrotate读取你的配置文件失败!!!!


文件权限修改方法,请参考:

http://blog.csdn.net/houjixin/article/details/72910419

或者:

http://houjixin.blog.163.com/blog/static/3562841020175895623683/#


(4)测试一下,配置是否有误,可执行logrotate,如下:

  1. /usr/sbin/logrotate -vf /etc/logrotate.conf

可以看到新生成的转储文件与原日志文件在同一个目录下,如下所示:

-rwxrwxrwx. 1 root root 482 5月 23 15:36 mosquitto.log

-rwxrwxrwx. 1 root root 650 5月 23 15:25mosquitto.log-20170523

4.其他logrotate配置参数的含义,logrotate的功能比较强大,下面这些参数是从网上搜索到的,不全面,到时可以根据自己的需要来选择和配置:

参数功能
compress
通过gzip 压缩转储以后的日志
nocompress
不需要压缩时,用这个参数
copytruncate
用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate
备份日志文件但是不截断
create mode owner group
转储文件,使用指定的文件模式创建新的日志文件
nocreate
不建立新的日志文件
delaycompress
和 compress一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress
覆盖delaycompress 选项,转储同时压缩。
errors address
专储时的错误信息发送到指定的Email 地址
ifempty
即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty
如果是空文件的话,不转储
mail address
把转储的日志文件发送到指定的E-mail 地址
nomail
转储时不发送日志文件
olddir directory
转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir
转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript
在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript
在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily
指定转储周期为每天
weekly
指定转储周期为每周
monthly
指定转储周期为每月
rotate count
指定日志文件删除之前转储的次数,0 指没有备份,5指保留5个备份
tabootext [+] list
让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig,.rpmsave,v,和 ~
size size
当日志文件到达指定的大小时才转储,Size 可以指定bytes (缺省)以及KB (sizek)或者MB(sizem).



5.简单总结一下,通过上述步骤可以看出,你能用logrotate转储任何文件,当然,最常见的场景还是转储日志;

下面再以Nginx为例,说明如何通过编写一个简单的配置文件就能转储Nginx的日志:

(1)建立Nginx日志转储功能配置文件

vim /etc/logrotate.d/Nginx

(2)配置文件内容如下:

/home/logs/Nginx/access.log/home/logs/Nginx/Nginx_error.log {
notifempty
daily

rotate 5
sharedscripts
postrotate
/bin/kill -HUP `/bin/cat /usr/local/Nginx/logs/Nginx.pid`
endscript
}


(3)执行一下logrotate,看会不会出异常:

/usr/sbin/logrotate -vf /etc/logrotate.conf

如果正常生成了转储文件,就ok了。

5.简单总结一下,通过上述步骤可以看出,你能用logrotate转储任何文件,当然,最常见的场景还是转储日志;

下面再以Nginx为例,说明如何通过编写一个简单的配置文件就能转储Nginx的日志:

(1)建立Nginx日志转储功能配置文件

vim /etc/logrotate.d/Nginx

(2)配置文件内容如下:

}


(3)确保该配置文件的权限为:-rw-r--r--

(4)执行一下logrotate,看会不会出异常:

/usr/sbin/logrotate -vf /etc/logrotate.conf

如果正常生成了转储文件,就ok了。


【再次提醒】logrotate不能正常工作的排查方法

(1)执行命令/usr/sbin/logrotate -vf /etc/logrotate.conf,查看提示日志,根据日志内容,具体排查错误

(2)一个大家容易忽视的点:自己编写的logrotate配置文件的权限必须为:-rw-r--r--,否则logrotate就无法正常工作,在你执行命令/usr/sbin/logrotate -vf /etc/logrotate.conf的时候,还会提示Ignoring mosquitto because of bad filemode.

(3)文件权限修改方法,请参考:

http://blog.csdn.net/houjixin/article/details/72910419

或者:

http://houjixin.blog.163.com/blog/static/3562841020175895623683/#

相关文章

Centos下搭建性能监控Spotlight
CentOS 6.3下Strongswan搭建IPSec VPN
在CentOS6.5上安装Skype与QQ
阿里云基于centos6.5主机VPN配置
CentOS 6.3下配置multipah
CentOS安装、配置APR和tomcat-native