系统的日志文件管理

拥有回忆 提交于 2020-11-27 01:43:10

《Linux一线运维实战》 清华大学出版社,即将出版

日志是记录操作系统及其上的应用被操作或运行过程中遗留下来的痕迹,通过日志的内容就可以发现系统中存在的问题。对于系统上的应用通常是每天产生一个日志文件,如果应用量比较大那么日志文件的数据也大,因此应该有维护日志的习惯。
24.2.1 系统日志功能配置管理
在系统中所做的动作都被相关的日志记录下来,所记录的信息要不就来自内核空间要不就来自用户空间。系统的日志由rsyslog进程管理,该服务的配置文件为/etc/rsyslog.conf,通过这个配置文件就可以对系统的日志功能进行配置。
1.日志系统rsyslog基本配置
rsyslog是syslog的升级版,它具有日志集中式管理的功能,并对系统所产生的信息进行收集和分析,然后根据配置文件中的设定按信息的类型和级别分别写入到不同的日志文件中。与syslog相比,rsyslog增加了一些典型的新功能:
    支持直接把日志写入到数据库;
    增加日志队列(内存队列和磁盘队列)功能;
    灵活的模板机制,使日志输出格式多样化;
    采用插件式结构,支持多样的输入、输出模块;
默认配置下日志信息都被写入到/var/log/目录下对应的日志文件中,这些路径是在rsyslog的配置文件/etc/rsyslog.conf下设置,该配置文件的配置信息如下(部分注释性的配置信息已被省略)。
……
#Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf

####RULES ####
#Log all kernel messages to the console.
#Logging much else clutters up the screen.
#kern.*                                                 /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
#The authpriv file has restricted access.
authpriv.*                                                  /var/log/secure
#Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
#Log cron stuff
cron.*                                                  /var/log/cron
#Everybody gets emergency messages
*.emerg                                                 *
#Save news errors of level crit and higher in a special file.
uucp,news.crit                                              /var/log/spooler
#Save boot messages also to boot.log
local7.*                                                    /var/log/boot.log
……
在/etc/rsyslog.conf配置文件中,它设定了来自不同消息源的信息的写入路径,它是以绝对路径的方式来设定不同类型的日志文件。对于这些消息,rsyslog采用的是一种向上匹配的功能来分类,也就是说rsyslog指定一个消息级别,并将高于该级别的所有消息全部存放于某个指定的位置。rsyslog常用的消息级别如下:
    debug:调试级消息;
    info:一般信息的日志;
    notice:具有重要性的普通条件信息;
    warning:警告级别信息;
    err:错误级别信息(阻止某个功能或模块而导致不能正常工作时产生的信息);
    crit:严重级别的信息(阻止系统或软件不能正常工作而产生的信息);
    alert:紧急信息,是需要立刻做修改的信息;
    emerg:系统内核崩溃等严重的信息;
    none:不做任何的记录;
rsyslog可以通过“kern. = alert  /dev/console”的方式来指定只匹配某个级别的消息,不过这会出现大量级别低的消息在短时间内占据大量的磁盘空间,而某些日志文件就需要一段时间才写入信息,这会导致一些重要的日志信息被覆盖在大量“无用”的日志中。另外,某些消息不定义级别时,rsyslog就用 * 或none这两个关键字来匹配消息。
在rsyslog的配置文件中指定日志写入的路径时,通常需要指定写入该日志的消息类型,常见的类型关键字如下:
    auth:定义pam产生消息的日志文件;
    authpriv:ssh、ftp等登录验证信息;
    cron:cron任务执行的相关信息;
    kern:定义内核信息;
    lpr:系统打印的相关信息;
    mail:邮件的日志文件;
    mark(syslog):rsyslog服务内部的信息,时间标识;
    user:用户程序产生的相关信息;
    local 1~7:自定义的日志设备;
2.轮换式日志管理程序
logrotate是一个日志管理程序,它的作用是把旧日志文件删除(或备份)并创建新日志文件(这个过程称为“转储”)。logrotate的运行由crond服务实现,而实际上是通过执行/etc/cron.daily/logrotate这个文件来启动,/etc/cron.daily/logrotate是一个脚本文件,它的配置内容如下。
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
logrotate程序由crond在指定的时间执行(具体执行时间在/etc/crontab文件中设定),在启动后首先执行/etc/cron.daily/logrotate文件然后再根据配置执行其他的文件。而决定logrotate所做的操作,则就是由/etc/logrotate.conf文件设置,该配置文件的内容如下。
#see "man logrotate" for details
#rotate log files weekly
weekly
#keep 4 weeks worth of backlogs
rotate 4

#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

#no packages own wtmp and btmp -- we'll rotate 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 be configured here.
对于该配置文件的配置多数都有相关的解释,因此理解起来并不难。以下介绍一些对日志文件进行相关定义的配置,如下。
1)定义/var/log/wtmp日志文件
/var/log/wtmp {
  monthly
  create 0664 root utmp
    minsize 1M
  rotate 1
}
    monthly:设置轮转的时间间隔,每月轮转一次。
    create 0664 root utmp:定义新建日志文件的权限,属主。
    minsize 1M:定义日志记录的数据量必须要大于1M才轮转。
    rotate 1:保留一周的日志文件。
2)定义/var/log/btmp日志文件
/var/log/btmp {
  missingok
  monthly
  create 0600 root utmp
  rotate 1
}
    missingok:在日志丢失时不报错。
如果要对日志进行特别管理时(如/var/log/messages日志文件保留的数量),可以通过定义一个类似于定义/var/log/btmp这样独立的配置来管理,使配置不会对其他的日志文件产生影响。
另外,默认配置下我们都会发现/var/log/目录下的日志文件有一种现象,不管系统运行了就是该目录下的每种日志文件最多只保留5份,不管系统运行了多长的时间同种日志文件的数量都不会增加。这原因是logrotate在一直在后台作怪导致的,因为默认的配置下它每种日志文件每周轮换一次(就是每周新建一个),并只允许保留四周的时间,因此看到的是5份日志文件,也就是保留四周内的日志文件。
24.2.2 日志文件管理的策略
日志是系统的重要组成部分之一,通过它们就能够获知系统及相关服务的运行状态,因此对日志的管理也显得非常的重要。本节就从日志常用的管理工具和查找日志内容的方法,通过这两方面来就能够精确查询所需的信息,以及时能掌握系统的动态。
1. 系统日志功能基本类型
Linux系统使用的文件系统,从EXT系列到现在的XFS,它们历来以强大、丰富和完整的日志系统著称,通过日志系统的记录的信息,能够了解系统的运行状况,并通过这些状况来可以对系统的性能调优、发现入侵痕迹及其他的问题。
Linux系统的日志存储在/var/log/目录下,在该目录有系统提供各类日志文件,日志内容以明文形式存储,因此用户不需要特殊的工具就可以搜索和阅读它们,更重要的是可以编写特定功能脚本,并对日照文件进行扫描出需要的内容。
默认下系统会维护几类日志文件,但其他服务和程序也可能会把它们的日志文件放在这里,或把内容写入系统维护的日志文件里。大多数日志只有root权限才可以查阅,这是出于系统安全考虑,而对于系统中的日志文件,它维护的日志类型主要有以下这几类。
连接时间日志:由多个程序执行,把信息写入到/var/log/wtmp和/var/run/utmp这两个日志文件,而这两个日志文件主要由login等程序更新,通过这两个文件系统管理员能够跟踪到是谁在何时登录到系统,何时重启系统等。
进程统计日志:由系统内核执行,该日志文件是为系统中的基本服务提供命令使用统计。比如,当一个进程终止时,就把该进程及相关的信息向该日志文件(pacct或acct)中写响应的记录。
错误日志:由syslogd守护程序执行,各种系统守护进程、用户程序和内核通过该守护程序向文件/var/log/messages报告需要注意的事件。另外,如HTTP和FTP等这些提供网络服务的服务器也把详细的日志写入该日志文件。
实用程序日志:许多程序通过维护日志来反映系统的安全状态,因此它们就由属于自己的日志文件。如Apache等服务就有access_log(客户端访问日志)和error_log(服务出错日志)这两个属于自己的日志文件,当然还有如FTP的xferlog及sendmail的maillog等。
2. 系统日志文件查找方式
通常,日志文件中所记录的信息都比较多,因此要查找所需的信息如果逐行查找那工作量还是挺大的。为了能够有效解决查看日志信息的问题,目前有不少的工具都能够满足日常的工作要求,但在搜索这些日志文件的内容时应该采取相应的策略,这样能够更好的完成工作。
(1)查找日志文件简单方法
系统日志文件几乎保存在/var/log/目录下,也就是说需要的多数日志文件在该目录下都能够找到,但有些应用系统或服务的日志文件是存在于自己的目录下,或其他的地方,这在对日志文件的统一管理上存在不便的地方。当然,如果要把所有的日志文件都集中存放在/var/log/目录下,这需要对相关应用系统或服务的配置文件进行更改。
其实,把众多的日志文件都集中起来管理,这是个不错的想法或做法。但是,在实施的过程中需要注意存放日志文件的目录和日志文件的权限问题,解决这些问题后管理日志文件的工作就简单多了。
当然,如果没有把日志文件集中管理,而有些日志文件在没有管理的情况下可能会出现无限增大,这会对系统的正常运行造成影响。那么,如何快速找到这些文件是一个问题,其实find命令可以很好地解决这个问题。使用该命令时应该指定被查找文件所在大致位置,否则仅查询当前所在位置的目录。如要查找根目录下最近5分钟内被修改过的全部文件,可以执行以下的命令。
[root@system ~]# find / . -type f -mtime -5 –print | grep -v proc | grep -v lock
……
/var/cache/man/es/index.db
/var/cache/man/local/index.db
/var/spool/anacron/cron.daily
/var/spool/anacron/cron.weekly
/var/spool/postfix/pid/master.pid
./.bash_history
或更简单的命令行,查找根目录下以.log为后缀的文件。
[root@system ~]# find / -name *.log
……
/var/log/anaconda/ks-script-Orno_z.log
/var/log/anaconda/ks-script-rRgYKB.log
/var/log/anaconda/journal.log
/var/log/boot.log
/var/log/vmware-vmsvc.log
/usr/lib/rpm/rpm.log
(2)日志文件异常记录管理
日志文件的分析工作比较繁琐且有一定的难度,其中的一个问题是把异常活动的记录从正常活动的记录的信息中识别出来。要完成这项工作,首先要了解的是系统和服务等正常活动时日志文件的记录方式,并通过对比后才找到需要的信息。
当然,拥有这方面的知识积累经验也是非常重要的,这可以能够在短期间内将需要的信息找到。要熟悉相关记录信息的格式还是需要一个过程的,并在熟悉后找到异常的记录,设置报警的条件,但这并不是一成不变而是还需要后期的规则维护。
(3)以手动方式搜索日志文件
grep是Unix系统上功能最强大的命令之一,通过该命令就能在(日志)文件里搜索各种需要的信息,当然前提是要查找的信息要存在,另外还需要注意的是该命令在查找信息时要使用绝对路径,如在/var/log/messages文件中查找带有failed关键字的记录行,可使用以下的命令行。
[root@system ~]# grep failed /var/log/messages
该命令会把/var/log/messages日志文件中含有关键字“failed”的行全部筛选出来,在默认情况下grep命令区分大小写,如果需要忽略大小写时可使用“-i”选项来对大小写不敏感的搜索。搜索日志文件首要是要先明确自己想要找的是什么,再把需要找的通过关键字(或关键词)等方式找出来。
当然,如果知道更多的细节,在搜索时就能够得到更加针对性的信息,所获取到信息的精确度这主要是由所使用的关键字(或关键词)决定,因此一定要明确自己想要什么信息。
(4)使用logsurfer工具搜索日志文件
logsurfer是一个日志文件搜索工具,相对于其他的一些日志搜索工具,logsurfer能够搜索更详细的内容。同样,它会把日志文件里的每一行与一些规则表达式进行匹配,当匹配到符合条件的行时就会指向相应的某个“规则”。
logsurfer使用两组规则表达式来匹配文本行,其中日志文件中的文本行必须匹配第一组表达式,但不需要匹配可选的第二组。采用这种处理方式能够很容易把异常的情况排除。另外,该工具在搜索内容时可以结合上下文进行,而不是只检查单个的文本行,这种做的好处是能够更精确的、全面的搜索到所需的信息。
 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!