日志管理

一、日志简介

1. 日志相关服务

  在CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务。rsyslogd具有一些新的特点

  基于TCP网络协议传输日志信息;

  更安全的网络传输方式;

  有日志消息的及时分析框架;

  后台数据库;

  配置文件中可以写简单的逻辑判断;

  与syslog配置文件兼容。

2. 系统中常见的日志文件

日志文件 说明
/var/log/cron 记录了系统定时任务相关的日志
/var/log/cups 记录打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息。也可以使用dmesg命令直接查看内核自检信息
/var/log/btmp

记录错误登录的日志。这个文件是二进制文件,不能直接查看,需使用lastb命令查看

/var/log/lastlog 记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,不能直接查看,需使用lastlog命令查看
/var/log/mailog 记录邮件信息
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的大部分重要信息,如果系统出现问题,首先需检查的就应是这个日志文件
/var/log/secure 记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录。比如说系统的登录,ssh的登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接查看,需使用last命令来查看
/var/run/utmp 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样这个文件不能直接查看,需使用w,who,users等命令来查询

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  除了系统默认的日志外,采用rpm方式安装的系统服务也会默认把日志记录在/var/log/目录中(源码包安装的服务日志在源码包指定目录)。

不过这些日志不是由rsyslogd服务来记录和管理的,而是各个服务使用自己的日志管理文档来记录自身日志。

日志文件 说明
/var/log/httpd/ rpm包安装的Apache服务的默认日志目录
/var/log/mail/ rpm包安装的邮件服务的额外日志目录
/var/log/samba/ rpm包安装的Samba服务的日志目录
/var/log/sssd/ 守护进程安全服务目录

 

 

 

 

 

 

 

二、日志服务rsyslogd

1. 日志文件格式

  只要是由日志服务rsyslogd记录的日志文件,他们的格式都是一样的。基本格式包含以下四列:

  事件产生的时间;

  发生事件的服务器的主机名;

  产生事件的服务名或程序名;

  事件的具体信息。

2. rsyslogd服务的配置文件

2.1 /etc/rsyslog.conf配置文件的格式

authpriv.*                                              /var/log/secure
#服务名称[连接符号]日志等级                    日志存储位置
#认证相关服务.所有日志等级               记录在/var/log/secure日志中

服务名称

服务名 说明
auth(LOG_AUTH) 安全和认证相关消息(不推荐使用authpriv代替)
authpriv(LOG_AUTHPRIV) 安全和认证相关信息(私有的)
cron(LOG_CRON) 系统定时任务cront和at产生的日志
daemon(LOG_DAEMON) 和各个守护进程相关的日志
ftp(LOG_FTP) ftp守护进程产生的日志
kern(LOG_KERN) 内核产生的日志(不是用户进程产生的)
local0-local7(LOG_LOCAL0-7) 为本地使用预留的服务
lpr(LOG_LPR) 打印产生的日志
mail(LOG_MAIL) 邮件收发信息
news(LOG_NEWS) 与新闻服务器相关的日志
syslog(LOG_SYSLOG) 有syslogd服务产生的日志信息(虽然服务名称已经改为rsyslogd,但是很多配置都还是沿用了syslogd的,这里并没有修改服务名)
user(LOG_USER) 用户等级类别的日志信息
uucp(LOG_UUCP) uucp子系统的日志信息,uucp是早期linux系统进行数据传递的协议,后来也常用在新闻组服务中

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

连接符号

日志服务连接日志等级的格式:

日志服务[连接符号]日志等级                        日志记录位置

在这里的连接符号可以为:

  "."代表只要比后面的等级高的(包含该等级)日志都记录下来。比如:“cron.info”代表cron服务产生的日志,只要日志等级大于等于info级别,就记录

  ".="代表只记录所需等级的日志,其他等级的都不记录。比如:“*.=emerg”代表任何日志服务产生的日志,只要等级是emerg等级就记录。这种用法及少见,了解就好

  ".!"代表不等于,也就是除了该等级的日志外,其他等级的日志都记录。

日志等级

等级名称 说明
debug(LOG_DEBUG) 一般的调试信息
info(LOG_INFO) 基本的通知信息
notice(LOG_NOTICE) 普通信息,但是有一定的重要性
warning(LOG_WARNING) 警告信息,但是还不会影响到服务或系统的运行
err(LOG_ERR) 错误信息,一般达到err等级的信息已经可以影响到服务或系统的运行了
crit(LOG_CRIT) 临界状况信息,比err等级还要严重
alert(LOG_ALERT) 警告状况信息,比crit还要严重。必须立即采取行动
emerg(LOG_EMERG) 疼痛等级信息,系统已无法使用
* 代表所有日志等级,比如:“authpriv.*”代表authpriv认证信息服务产生的日志,所有的日志等级都记录

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  日志等级这里还可以是"none",如果日志等级是none,就说明忽略这个日志服务,该服务的所有日志都不记录。

日志记录位置

  日志记录位置就是当前日志输出到哪个日志文件中保存,当然也可以把日志输出到打印机打印,或者输出到远程日志服务器上(当然日志服务器要允许接收才行)。日志的记录位置也是固定的,

  日志文件的绝对路径。这是最常见的日志保存方法,如“/var/log/secure”就是保存系统验证和授权信息日志的

  系统设备文件。如“/dev/lp0”代表第一台打印机,如果日志保存位置是打印机设备的话,当有日志时就会在打印机打印(不太符合可持续发展战略哦-_-!)

  转发给远程主机。因为可以选择使用TCP协议和UDP协议传输日志信息,所以有两种发送格式。如使用“@192.168.0.210:514”,就会把日志内容使用UDP协议发送到192.168.0.210的UDP 514端口上;如果使用“@@192.168.0.210:514”就会把日志内容使用TCP协议发送到192.168.0.210的TCP 514端口上,其中514是日志服务默认端口。当然只要192.168.0.210同意接收此日志,就可以把日志内容保存在日志服务器上。

  用户名。如“root”,就会把日志发送给root用户,当然root要在在线,否则就收不到日志信息了。发送日志给用户时,可以使用“*”代表发送给所有在线用户,如“mail.* *”就会把mail服务产生的所有级别的日志发送给所有在线用户。如果需要把日志发送给多个在线用户,用户名之间用“,”分隔

忽略或丢弃日志。如果接受日志的对象是“~”,代表这个日志不会记录,而被直接丢弃。如“local3.* ~”代表忽略local3服务类型所有的日志都不记录

2.2 /etc/rsyslog.conf配置文件的内容

[root@centos2 ~]# vim /etc/rsyslog.conf 
#查看配置文件内容
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####
#加载模块
# The imjournal module bellow is now used as a message source instead of imuxsock. $ModLoad imuxsock # provides support
for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal #$ModLoad imklog # reads kernel messages (the same are read from journald) #$ModLoad immark # provides
--MARK-- message capability # Provides UDP syslog reception #$ModLoad imudp #$UDPServerRun 514 #加载UPD模块,允许使用UDP的514端口接收采用UDP协议转发的日志

# Provides TCP syslog reception #$ModLoad imtcp #$InputTCPServerRun
514 #加载TCP模块,允许使用TCP的514端口接收采用TCP协议转发的日志

#### GLOBAL DIRECTIVES #### #定义全局设置

# Where to place auxiliary files $WorkDirectory
/var/lib/rsyslog # Use default timestamp format $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat #定义日志的时间使用默认的时间戳格式
# File syncing capability is disabled by default. This feature is usually not required, # not useful and an extreme performance hit #$ActionFileEnableSync on #文件同步功能。默认没有开启,是注释的。
# Include all config files
in /etc/rsyslog.d/ $IncludeConfig /etc/rsyslog.d/*.conf #包含/etc/rsyslog.d/目录中所有的“*.conf”子配置文件。
# Turn off message reception via local log socket; # local messages are retrieved through imjournal now. $OmitLocalLogging on # File to store the position in the journal $IMJournalStateFile imjournal.state #### RULES #### #日志保存规则
# Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.*
#kern服务.所有日志级别        保存在/dev/console /dev/console #这个日志默认没有开启,如果需要,则取消注释
# Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages #所有服务.info以上级别的日志保存在/var/log/messages日志中。
#mail,authpriv,cron的日志不记录在/var/log/messages日志文件中,因为他们都有自己的日志文件
#所以/var/log/messages日志是最重要的系统日志文件,需经常查看!

# The authpriv file has restricted access. authpriv.* /var/log/secure #用户认证服务所有级别的日志保存在/var/log/secure日志中
# Log all the mail messages in one place. mail.* -/var/log/maillog #mail服务的所有级别的日志保存在/var/log/maillog日志中。
#"-"号的含义是日志先在内存之中保存,当日志够多之后,再向文件中保存 # Log cron stuff cron.* /var/log/cron #计划任务的所有日志保存在/var/log/cron日志中
# Everybody gets emergency messages *.emerg :omusrmsg:* #所有日志服务的疼痛等级日志对所有在线用户广播
# Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler #uucp和news日志服务的crit以上的日志保存在/var/log/spooler日志文件中
# Save boot messages also to boot.log local7.* /var/log/boot.log #local7日志服务的所有日志写入/var/log/boot.log日志中
#会把开机时间的检测信息在显示到屏幕的同时,写入/var/log/boot.log日志中 # ### begin forwarding rule ###
#定义转发规则 # The statement between the begin ... end define a SINGLE forwarding # rule. They belong together, do NOT split them. If you create multiple # forwarding rules, duplicate the whole block! # Remote Logging (we use TCP for reliable delivery) # # An on-disk queue is created for this action. If the remote host is # down, messages are spooled to disk and sent when it is up again. #$ActionQueueFileName fwdRule1 # unique name prefix for spool files #$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible) #$ActionQueueSaveOnShutdown on # save messages to disk on shutdown #$ActionQueueType LinkedList # run asynchronously #$ActionResumeRetryCount -1 # infinite retries if host is down # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional #*.* @@remote-host:514 # ### end of the forwarding rule ###

三、日志轮替

1. 日志文件的命名规则

  日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日至文件超出保存的范围之后,就会进行删除。就得日志文件改名之后,主要依靠/etc/logrotate.con配置文件中的"dateext"参数命名

    如果配置文件中拥有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如“secure-20180605”。这样的话日志文件名不会重叠,所以也就不需要日志文件的改名,只需要保存指定的日志个数,删除多余的日志文件即可

    如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志,用来保存新的日志。当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”,当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来保存新的日志,以此类推

2. logrotate配置文件

[root@centos2 ~]# vim /etc/logrotate.conf 

# see "man logrotate" for details
# rotate log files weekly
weekly
#每周对日志进行一次轮替

# keep 4 weeks worth of backlogs
rotate 4
#保存4个日志文件,如果进行了5次轮替,第一个备份日志就会被删除

# 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
#包含/etc/logrotate.d/目录下的所有子配置文件。

# no packages own wtmp and btmp -- we'll rotate them here
#以下两个轮替日志都有自己的独立参数,如果和默认参数冲突,则独立参数生效
/var/log/wtmp {
#以下参数仅对此目录有效
    monthly
    #每月对日志文件进行一次轮替
    create 0664 root utmp
    #创建新的日志文件,权限0664,所有者root,所属组utmp
        minsize 1M
        #日志文件最小轮替大小1MB,也就是说日志一定要超过1MB才会轮替,否则就算时间达到1个月,也不进行日志轮替
    rotate 1
    #仅保留一个备份日志。也就是只有wtmp和wtmp.1日志保留
}

/var/log/btmp {
    missingok
    #如果日志不存在,则忽略该日志的警告信息
    monthly
    create 0600 root utmp
    rotate 1
}

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

  logrotate配置文件的主要参数

参数 参数说明
daily 日志轮替周期是每天
weekly 日志轮替周期是每周
monthly 日志轮替周期是每月
rotate 数字 保留的日志文件的个数。0指没有备份
compress 日志轮替时,就得日志进行压缩
create mode owner group 建立新的日志,同时指定新日志的权限与所有者,所属组。
mail address 当日志轮替时,输出内容通过邮件发送到指定的邮件地址
missingok 如果日志不存在,则忽略该日志的警告信息
notifempty 如果日志为空文件,则不进行日志轮替
minsize 大小 日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替
size 大小 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。如size 100k
dateext 使用日期作为日志轮替文件的后缀。如secure-20180605
sharedscripts 在此关键字之后的脚本只执行一次
prerotate/endscript 在日志轮替之前执行脚本命令。endscript标示prerotate脚本结束
postrotate/endscript 在日志轮替之后执行脚本命令。endscript标示postrotate脚本结束

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  这些参数中较为不好理解的应该就是prerotate/endscript和postrotate/endscript参数了,我们利用“man logrotate”中的列子来解释下这两个参数。

"/var/log/httpd/access.log" /var/log/httpd/error.log {
#日志轮替的是/var/log/httpd/中RPM包安装的apache正确访问日志和错误日志
    rotate 5
    #轮替5次
    mail www@my.org
    #信息发送到指定邮箱
    size 100k
    #日志大于100kb时才进行日志轮替,不再按照时间轮替
    sharedscript
    #以下的脚本只执行一次
    postrotate
    #在日志轮替结束之后,执行以下脚本
        /usr/bin/killall -HUP httpd
        #重启apache服务
    endscript
    #脚本结束
}

   prerotate和postrotate主要用于在日志轮替的同时,执行指定的脚本,一般用于日志轮替之后重启服务。这里强调,如果你的日志是写入rsyslog服务的配置文件的,那么把新日志加入logrotate后,一定要重启rsyslog服务,否则你会发现虽然新日志建立了,但是数据还是写入了旧的日志当中。那是因为虽然logrotate知道日志轮替了,但是rsyslog服务却并不知道。同理,如果你的日志不是被rsyslog管理,如源码包安装的Apache、Nginx等服务,则需要重启Apache或Nginx服务,否则日志也不能正常轮替。

3. 把自己的日志加入日志轮替

  这里有两个方法:第一种方法是直接在/etc/logrotate.conf配置文件中写入该日志的轮替策略,从而把日志加入轮替;第二种方法是在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略。推荐使用第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写入/etc/logrotate.conf配置文件中,那么这个文件的可管理性就会非常差,不利于此文件的维护。

  例,把nginx服务的日志加入日志轮替,则也需要重启nginx服务。

/date/logs/nginx/access/access.log /date/logs/nginx/access/default.log {
#假设Nginx的日志放在/date目录下
    daily
    rotate 15
    sharedscripts
    postrotate
        /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid) &> /dev/null
        #重启rsyslog服务
        /bin/kill -HUP $(/bin/cat /usr/local/nginx/logs/nginx.pid) &> /dev/null
    endscript
}

4. logrotate命令

  志轮替之所以可以在指定的时间备份日志,其实也要依赖系统定时任务。

[root@centos2 ~]# logrotate [选项] 配置文件名
选项:
    如果此命令没有选项,则会按照配置文件中的条件进行日志轮替
    -v:显示日志轮替过程。加了-v选项,会显示日志的轮替的过程
    -f:强制进行日志轮替。不管日志轮替的条件是否已经符合,强制配置文件中所有的日志进行轮替
[root@centos2 ~]# logrotate -v /etc/logrotate.conf
#查看日志轮替的过程


[root@centos2 ~]# logrotate -vf /etc/logrotate.conf
#强制进行日志轮替,不管是否符合轮替条件

  logrotate命令使用“-f”选项之后,就不管日志是否已经符合了日志轮替条件,而强制把所有的日志都进行了轮替。

 

 

 

 

 

posted @ 2019-11-14 17:13  一窗明月半帘风  阅读(459)  评论(0编辑  收藏  举报