如标题所示,这篇要谈的是两个关于日志的工具。

最近自己的记录逐渐趋向于最佳实践,只能适配特定的情况,例如这次就是给几台网关做配置。网关使用了树莓派,系统为debian 8.0,存储空间4GB,可用空间约2.5GB,内存1GB,资源有限。在没有配置好日志收集和切割的情况下,占满所有存储空间只是时间的问题。而为了提升设备寿命,厂家默认将日志路径/var/log挂载到了内存中,限制大小为100MB,在信号繁忙的情况下,大概只要两天时间就可以撑爆/var/log目录,至于这种情况下,网关是会重启还是崩溃,都不得而知,如果是重启,保存在内存中的日志会被清空,启动后继续工作,而如果是崩溃死机,那问题就更严重了。

1.原始的配置文件内容。

rsyslog的配置/etc/rsyslog.conf(这里将所有内容合并到了该文件中,其他的配置文件存放在/etc/rsyslog.d目录下)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/etc/rsyslog.conf   Configuration file for rsyslog.
#
#           For more information see
#           /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html


#################
#### MODULES ####
#################

$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog   # provides kernel logging support
#$ModLoad immark  # provides --MARK-- message capability

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

#
# Set the default permissions for all log files.
#
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022

#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf


###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*         /var/log/auth.log
*.*;auth,authpriv.none      -/var/log/syslog
#cron.*             /var/log/cron.log
daemon.*            -/var/log/daemon.log
kern.*              -/var/log/kern.log
lpr.*               -/var/log/lpr.log
mail.*              -/var/log/mail.log
user.*              -/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info           -/var/log/mail.info
mail.warn           -/var/log/mail.warn
mail.err            /var/log/mail.err

#
# Logging for INN news system.
#
news.crit           /var/log/news/news.crit
news.err            /var/log/news/news.err
news.notice         -/var/log/news/news.notice

#
# Some "catch-all" log files.
#
*.=debug;\
    auth,authpriv.none;\
    news.none;mail.none -/var/log/debug
*.=info;*.=notice;*.=warn;\
    auth,authpriv.none;\
    cron,daemon.none;\
    mail,news.none      -/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg             :omusrmsg:*

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#   news.=crit;news.=err;news.=notice;\
#   *.=debug;*.=info;\
#   *.=notice;*.=warn   /dev/tty8

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
# 
#    $ xconsole -file /dev/xconsole [...]1.原始的配置文件内容。
#
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
#      busy site..
#
daemon.*;mail.*;\
    news.err;\
    *.=debug;*.=info;\
    *.=notice;*.=warn   |/dev/xconsole

按照该配置(RULE部分中的内容),守护进程产生的日志会同时输出到/var/log/daemon.log以及/var/log/syslog.log文件中,导致日志体积翻倍,因为rsyslog只排除了auth,authpriv.none两种类型的日志,而网关上的程序以守护进程运行,会产生大量日志。

logrotate中默认的rsyslog日志配置路径/etc/logrotate.d/rsyslog

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/var/log/syslog
{
    rotate 7
    daily
    missingok
    notifempty
    delaycompress
    compress
    postrotate
        invoke-rc.d rsyslog rotate > /dev/null
    endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        invoke-rc.d rsyslog rotate > /dev/null
    endscript
}

按照该配置,logrotate会对/var/log/syslog.log文件,每日执行一次切割,并延迟压缩,最多保存7个副本,也就是说会同时存在syslog.log以及syslog.log.1两个未压缩文件,而对于其他由rsyslog产生的日志每周执行一次切割,延迟压缩,最多保存4个副本。实际测试,日志压缩前后的体积相差接近10倍。

2.修改配置

按照默认配置,100MB的存储空间远远不够,需要做一些小修改。

修改/etc/rsyslog.conf中的RULES部分,也就是一些标准日志输出的位置,可以注释掉daemon或者在输出到syslog的日志中排除掉daemon日志。

1
2
3
4
5
6
// 在syslog中排除daemon日志,确保不要注释掉daemon日志输出的配置,注意,这种情况下使用journalctl命令无法查看守护进程产生的日志
*.*;daemon,auth,authpriv.none       -/var/log/syslog
daemon.*            -/var/log/daemon.log
// 注释掉daemon日志输出,将daemon日志一起收集到syslog,这种情况下可以使用journalctl命令查看守护进程产生的日志
*.*;auth,authpriv.none      -/var/log/syslog
#daemon.*           -/var/log/daemon.log

同时可以注释掉文件末尾4行的日志输出,网关设备繁忙的状态下会报/dev/xconsole相关的错误,产生一些无用的日志。

修改/etc/logrotate.d/rsyslog,在切割日志后立刻压缩,并对daemon.log与syslog.log执行相同的切割动作,注意,对于已压缩的日志,使用journalctl命令是无法获取守护进程在当时产生的日志。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/var/log/syslog
/var/log/daemon.log
{
    rotate 7
    daily
    missingok
    notifempty
    compress
    nodelaycompress
    sharedscripts
    postrotate
        invoke-rc.d rsyslog rotate > /dev/null
    endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    nodelaycompress
    sharedscripts
    postrotate
        invoke-rc.d rsyslog rotate > /dev/null
    endscript
}

3.拓展阅读

原来的计划是更详细写下日志是如何输出,如何指定文件,以及各种相关内容,最后觉得超纲了,这只是一篇博客而不是百科全书,这里放下相关内容。

  1. rsyslog配置简介
  2. Linux日志文件总管——logrotate
  3. stdin、stdout、stderr 标准流本质上到底是什么?
  4. How To View and Configure Linux Logs on Ubuntu and Centos
  5. LinuxLogFiles
  6. Understand logging in Linux