转: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 /f
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERTexited abnormally with [$EXITVALUE]"
fi
exit 0
从脚本的内容就可以看出,它主要⽤于执⾏程序logrotate,并且启动logrotate的时候使⽤了配置⽂件:/f。下⾯就是对这个配置⽂件的内容进⾏简单的介绍:
# 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启动的时候,使⽤了配置⽂件/f;
(3)配置/f中⼜引⼊了⽬录:/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读取你的配置⽂件失败
⽂件权限修改的⽅法,请参考:
或者:
4)测试⼀下,配置是否有误,可执⾏logrotate,如下:
/usr/sbin/logrotate -vf /f
可以看到新⽣成的转储⽂件与原⽇志⽂件在同⼀个⽬录下,如下所⽰:
-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 备份⽇志⽂件但是不截断
怎么改wifi密码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)确保该配置⽂件的权限为:-rw-r--r--
(4)执⾏⼀下logrotate,看会不会出异常:
/usr/sbin/logrotate -vf /f
如果正常⽣成了转储⽂件,就ok了。
【再次提醒】logrotate不能正常⼯作的排查⽅法:
(1)执⾏命令/usr/sbin/logrotate -vf /f,查看提⽰⽇志,根据⽇志内容,具体排查错误;
(2)⼀个⼤家容易忽视的点:⾃⼰编写的logrotate配置⽂件的权限必须为:-rw-r--r--,否则logrotate就⽆法正常⼯作,在你执⾏命
令/usr/sbin/logrotate -vf /f的时候,还会提⽰:Ignoring mosquitto because of bad filemode.
(3)⽂件权限修改的⽅法,请参考:
或者:
下⾯是f⽂件中有关⽇志部分的设置内容:
1. # =================================================================
2. # Logging
3. # ⽇志信息
4. # =================================================================
5.
6. # Places to log to. Use multiple log_dest lines for multiple
7. # logging destinations.
8. # 记录⽇志,使⽤多个log_dest⾏对应多个⽇志信息的描述
9. #
10. # Possible desnations are: stdout stderr syslog topic file
11. # log_dest可能的选项有: stdout stderr syslog topic file
12. #
13. # stdout and stderr log to the console on the named output.
14. # stdout和stderr的⽇志输出在控制台
15. #
16. # syslog uses the userspace syslog facility which usually ends up
17. # in /var/log/messages or similar.
18. # syslog使⽤⽤户空间记录⽇志的级别通常保存在/var/log/messages或者邮件中
19. #
20. # topic logs to the broker topic '$SYS/broker/log/<severity>',
21. # 主题⽇志保存在代理服务器的主题⽇志路径下⾯ '$SYS/broker/log/<severity>'
22. #
23. # where severity is one of D, E, W, N, I, M which are debug, error,
24. # warning, notice, information and message. Message type severity is used by
25. # the subscribe/unsubscribe log_types and publishes log messages to
26. # $SYS/broker/log/M/susbcribe or $SYS/broker/log/M/unsubscribe.
27. # 当安全级别为D, E, W, N, I, M分别对应为调试, 错误, 警告, 注意, 信息, 消息.
失败也美丽28. # 消息安全类型⽤于订阅/取消订阅的消息类型时,发送的⽇志信息保存在
29. # $SYS/broker/log/M/susbcribe or $SYS/broker/log/M/unsubscribe
30. #
31. # The file destination requires an additional parameter which is the file to be
32. # logged to, e.g. "log_dest file /var/log/mosquitto.log". The file will be
33. # closed and reopened when the broker receives a HUP signal. Only a single file
34. # destination may be configured.
35. #
36. # Note that if the broker is running as a Windows service it will default to
37. # "log_dest none" and neither stdout nor stderr logging is available.
38. # Use "log_dest none" if you wish to disable logging.
39. log_dest file /var/log/mosquitto.log
40.
41. # If using syslog logging (not on Windows), messages will be logged to the
42. # "daemon" facility by default. Use the log_facility option to choose which of
43. # local0 to local7 to log to instead. The option value should be an integer
44. # value, e.g. "log_facility 5" to use local5.
45. #log_facility 5
46.
47. # Types of messages to log. Use multiple log_type lines for logging
东方神起 解约
48. # multiple types of messages.
49. # Possible types are: debug, error, warning, notice, information,
50. # none, subscribe, unsubscribe, websockets, all.
51. # Note that debug type messages are for decoding the incoming/outgoing
52. # network packets. They are not logged in "topics".
53. #log_type error
54. #log_type warning
55. #log_type notice
56. log_type all
57.
发布评论