关于c++:Linux系统学习系列Linux系统日志管-理下

43次阅读

共计 10676 个字符,预计需要花费 27 分钟才能阅读完成。

日志是重要的系统文件,记录和保留了零碎中所有的重要事件。然而日志文件也须要进行定期的保护,因为日志文件是一直增长的,如果齐全不进行日志保护,而任由其随便递增,那么用不了多久,咱们的硬盘就会被写满。

日志保护的最次要的工作就是把旧的日志文件删除,从而腾出空间保留新的日志文件。这项工作如果靠管理员手工来实现,那其实是十分繁缛的,而且也容易遗记。那么 Linux 零碎是否能够主动实现日志的轮替工作呢?

logrotate 就是用来进行日志轮替(也叫日志转储)的,也就是把旧的日志文件挪动并改名,同时创立一个新的空日志文件用来记录新日志,当旧日志文件超出保留的范畴时就删除。

须要 Linux 材料以及 Linux 入门材料 +qun832218493 获取

日志文件的命名规定

日志轮替最次要的作用就是把旧的日志文件挪动并改名,同时建设新的空日志文件,当旧日志文件超出保留的范畴时就删除。那么,旧的日志文件改名之后,如何命名呢?次要依附 /etc/logrotate.conf 配置文件中的“dateext”参数。

如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,如“secure-20130605”。这样日志文件名不会重叠,也就不须要对日志文件进行改名,只须要保留指定的日志个数,删除多余的日志文件即可。

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

logrotate 配置文件

咱们来查看一下 logrotate 的配置文件 /etc/logrotate.conf 的默认内容。

[root@localhost ~]# vi /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’11 rotate them here

以下两个轮替曰志有本人的独立参数,如果和默认的参数抵触,则独立参数失效

/var/log/wtmp {

以下参数仅对此目录无效

monthly

每月对日志文件进行一次轮替

create 0664 root utmp

建设的新日志文件, 权限是 0664, 所有者是 root, 所属组是 utmp 组

minsize 1M

日志文件最小轮替大小是 1MB。也就是日志肯定要超过 1MB 才会轮替,否则就算工夫达到一个月,也不进行曰志轮替

rotate 1

仅保留一个曰志备份。也就是只保留 wtmp 和 wtmp.1 曰志 )

/var/log/btmp {

以下参数只对 /var/log/btmp 失效

missingok

如果日志不存在, 则疏忽该日志的正告信患

monthly
create 0600 root utmp
rotate 1
}

system-specific logs may be also be configured here.

  • 在这个配置文件中,次要分为三局部:第一局部是默认设置,如果须要转储的日志文件没有非凡配置,则遵循默认设置的参数;
  • 第二局部是读取 /etc/logrotate.d/ 目录中的日志轮替的子配置文件,也就是说,在 /etc/logrotate.d/ 目录中的所有合乎语法规定的子配置文件也会进行日志轮替;
  • 第三局部是对 wtmp 和 btmp 日志文件的轮替进行设定,如果此设定和默认参数抵触,则以后设定失效(如 wtmp 的以后参数设定的轮替工夫是每月,而默认参数的轮替工夫是每周,则对 wtmp 这个日志文件来说,轮替工夫是每月,以后的设定参数失效)。

logrotate 配置文件的主要参数如表 1 所示。

这些参数中较为难了解的应该是 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 时才进行日志轮替, 不再依照工夫轮替
    sharedscripts
    #以下脚本只执行一次
    postrotate
    #在日志轮替完结之后, 执行以下脚本
    /usr/bin/killall -HUP httpd
    #重启 apache 服务
endscript

脚本完结

}

prerotate 和 postrotate 次要用于在日志轮替的同时执行指定的脚本,个别用于日志轮替之后重启服务。这里强调一下,如果你的日志是写入 rsyslog 服务的配置文件的,那么把新日志退出 logrotate 后,肯定要重启 rsyslog 服务,否则你会发现,尽管新日志建设了,但数据还是写入了旧的日志当中。那是因为尽管 logrotate 晓得日志轮替了,然而 rsyslog 服务并不知道。

同理,如果采纳源码包装置了 apache、Nginx 等服务,则须要重启 apache 或 Nginx 服务,同时还要重启 rsyslog 服务,否则日志也不能失常轮替。

不过,这里有一个典型利用就是给予特定的日志退出 chattr 的 a 属性。如果系统文件退出了 a 属性,那么这个文件就只能减少数据,而不能删除和批改已有的数据,root 用户也不例外。

因而,咱们会给重要的日志文件退出 a 属性,这样就能够爱护日志文件不被歹意批改。不过,一旦退出了 a 属性,那么在进行日志轮替时,这个日志文件是不能被改名的,当然也就不能进行日志轮替了。咱们能够利用 prerotate 和 postrotate 参数来批改日志文件的 chattr 的 a 属性。

把本人的日志退出日志轮替

如果有些日志默认没有退出日志轮替(比方源码包装置的服务的日志,或者本人增加的日志),那么这些日志默认是不会进行日志轮替的,这样当然不合乎咱们对日志的治理要求。如果须要把这些日志也退出日志轮替,那该如何操作呢?

  • 这里有两种办法:第一种办法是间接在 /etc/logrotate.conf 配置文件中写入该日志的轮替策略,从而把日志退出轮替;
  • 第二种办法是在 /etc/logrotate.d/ 目录中新建设该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被蕴含到主配置文件中,所以也能够把日志退出轮替。

咱们举荐第二种办法,因为零碎中须要轮替的日志十分多,如果全副间接写入 /etc/logrotate.conf 配置文件,那么这个文件的可管理性就会十分差,不利于此文件的保护。

说起来很简单,咱们举个例子。还记得咱们本人生成的 /var/log/alert.log 日志吗?这个日志不是零碎默认日志,而是咱们通过 /etc/rsyslog.conf 配置文件本人生成的日志,所以默认这个日志是不会进行轮替的。如果咱们须要把这个日志退出日志轮替策略,那该怎么实现呢?咱们采纳第二种办法,也就是在 /etc/logrotate.d/ 目录中建设此日志的轮替文件。

具体步骤如下:

[root@localhost ~]# chattr +a /var/log/alert.log #先给日志文件赋予 chattr 的 a 属性,保障日志的平安
[root@localhost ~]# vi /etc/logrotate.d/alter

创立 alter 轮替文件, 把 /var/log/alert.log 退出轮替

/var/log/alert.log {
    weekly
    #每周轮替一次
    rotate 6
    #保留 6 个轮替曰志
    sharedscripts
    #以下命令只执行一次
    prerotate
    #在日志轮替之前执行
        /usr/bin/chattr -a /var/log/alert.log
        #在日志轮替之前勾销 a 属性, 以便让日志能够轮替
    endscript
    #脚本结朿
    sharedscripts
    postrotate
    #在日志轮替之后执行
        /usr/bin/chattr +a /var/log/alert.log
        #在日志轮替之后, 重新加入 a 属性
    endscript
    sharedscripts
    postrotate
    /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2>/dev/null) fi>/dev/null
    endscript
    #重启 rsyslog 服务,保障日志轮替失常进行
}

这样咱们本人生成的日志 /var/log/alert.log 也就能够进行日志轮替了,当然这些配置信息也是能够间接写入 /etc/logrotate.conf 这个配置文件的。

  1. Linux logrotate 命令用法详解:进行日志转储(轮替)

日志轮替之所以能够在指定的工夫备份日志,是因为其依赖零碎定时工作。如果大家还记得 /etc/cron.daily/ 目录,就会发现这个目录中是有 logrotate 文件的,查看一下这个文件,命令如下:

[root@localhost ~]# vi /etc/cron.daily/logrotate

!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1

最次要的就是执行了 logrotate 命令

EXITVALUE=$?
if [$EXITVALUE!= 0]; then
/usr/bin/logger -t logrotate “ALERT exited abnormally with [$EXITVALUE]”
fi
exit 0

也就是说,零碎每天都会执行 /etc/cron.daily/logrotate 文件,运行这个文件中的“/usr/sbin/logrotate/etc/logrotate.conf>/dev/null 2>&1”命令。logrotate 命令会根据 /etc/logrotate.conf 配置文件的配置,来判断配置文件中的日志是否合乎日志轮替的条件(比方,日志备份工夫曾经满一周),如果合乎,日志就会进行轮替。所以说,日志轮替还是由 crond 服务发动的。

logrotate 命令的格局是什么样的呢?咱们来学习一下。

[root@localhost ~]# logrotate [选项] 配置文件名

  • 选项:如果此命令没有选项,则会依照配置文件中的条件进行日志轮替
  • -v:显示日志轮替过程。退出了 - v 选项,会显示日志的轮替过程
  • -f:强制进行日志轮替。不论日志轮替的条件是否合乎,强制配置文件中所有的日志进行轮替

咱们执行 logrotate 命令,并查看一下执行过程。

[root@localhost ~]# logrotate -v /etc/logrotate.conf

查看日志轮替的流程

…省略局部输入…
rotating pattern:/var/log/alert.log weekly (6 rotations)

这就是咱们本人退出轮替的 alert.log 日志

empty log files are rotated,old logs are removed
considering log /var/log/alert.log
log does not need rotating

工夫不够一周,所以不进行日志轮替

…省略局部输入…

咱们发现,/var/log/alert.log 退出了日志轮替,曾经被 logrotate 辨认并调用了,只是工夫没有达到轮替的规范,所以没有进行轮替。那咱们强制进行一次日志轮替,看看会有什么后果。

[root@localhost ~]# logrotate -vf /etc/logrotate.conf

强制进行日志轮替,不论是否合乎轮替条件

…省略局部输入…
rotating pattern:/var/log/alert.log forced from command line (6 rotations)
empty log files are rotated,old logs are removed
considering log /var/log/alert.log
log needs rotating

日志须要轮替

rotating log /var/log/alert.log,log->rotateCount is 6
dateext suffix ‘-20130607’

提取日期参数

glob pattern ‘-0-90-90-90-9’
glob finding old rotated logs failed
running prerotate script
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/alert.log to /var/log/alert.log-20130607

旧的日志被重命名

creating new /var/log/alert.log mode = 0600 uid = 0 gid = 0

创立新日志文件,同时指定权限、所有者和属组

running postrotate script
…省略局部输入…

咱们发现,alert.log 日志曾经实现了日志轮替。查看一下新生成的日志和旧日志,如下:

[root@localhost ~]# ll /var/log/alert.log*
-rw——-.1 root root 0 6 月 7 10:07 /var/log/alert.log
-rw——-.1 root root 237 6 月 7 09:58 /var/log/alert.log-20130607

旧的日志文件曾经轮替

[root@localhost ~]# lsattr /var/log/alert.log
—–a——-e- /var/log/alert.log

新的日志文件被主动退出了 chattr 的 a 属性

logrotate 命令在应用“-f”选项之后,就会不论日志是否合乎轮替条件,而强制把所有的日志都进行轮替。

  1. Linux 日志剖析工具(logwatch)装置及应用

日志是十分重要的系统文件,管理员每天的重要工作就是剖析和查看服务器的日志,判断服务器的衰弱状态。然而日志治理又是一项十分干燥的工作,如果须要管理员手工查看服务器上所有的日志,那切实是一项十分苦楚的工作。有些管理员就会偷懒,省略日志的检测工作,然而这样做非常容易导致服务器呈现问题。

那么咱们有取代的计划吗?有,那就是日志剖析工具。这些日志剖析工具会具体地查看日志,同时剖析这些日志,并且把剖析的后果通过邮件的形式发送给 root 用户。这样,咱们每天只有查看日志剖析工具的邮件,就能够晓得服务器的根本状况,而不必挨个查看日志了。这样系统管理员就能够从沉重的日常工作中解脱进去,去解决更加重要的工作。

在 CentOS 中自带了一个日志剖析工具,就是 logwatch。不过这个工具默认没有装置(因为咱们抉择的是“Basic Server”),所以须要手工装置。装置命令如下:

[root@localhost Packages]# yum -y install logwatch

装置实现之后,须要手工生成 logwatch 的配置文件。默认配置文件是 /etc/logwatch/conf/logwatch.conf,不过这个配置文件是空的,须要把模板配置文件复制过去。命令如下:

[root@localhost ~]# cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf

复制配置文件

这个配置文件的内容中绝大多数是正文,咱们把正文去掉,那么这个配置文件的内容如下所示:

[root@localhost ~]# vi /etc/logwatch/conf/logwatch.conf

查看配置文件

LogDir = /var/log

logwatch 会剖析和统计 /var/log/ 中的日志

TmpDir = /var/cache/logwatch

指定 logwatch 的长期目录

MailTo = root

日志的剖析后果,给 root 用户发送邮件

MailFrom = Logwatch

邮件的发送者是 Logwatch,在接管邮件时显示

Print =

是否打印。如果抉择“yes”,那么日志剖析会被打印到规范输入,而且不会发送邮件。咱们在这里不打印,# 而是给 root 用户发送邮件

Save = /tmp/logwatch

如果开启这一项,日志剖析就不会发送邮件,而是保留在 /tmp/logwatch 文件中

如果开启这一项,日志剖析就不会发送邮件,而是保留在 /tmp/logwatch 文件中

Range = yesterday

剖析哪天的日志。能够辨认“All”“Today”“Yesterday”,用来剖析“所有日志”“明天日志”“昨天日志”

Detail = Low

日志的具体水平。能够辨认“Low”“Med”“High”。也能够用数字示意,范畴为 0~10,“0”代表最不具体,“10”代表最具体

Service = All

剖析和监控所有日志

Service = “-zz-network”

然而不监控“-zz-network”服务的日志。“- 服务名”示意不剖析和监控此服务的日志

Service = “-zz-sys”
Service = “-eximstats”

这个配置文件根本不须要批改(我在试验时把 Range 项改为了 All,否则一会儿的试验能够剖析的日志过少),它就会默认每天执行。它为什么会每天执行呢?聪慧的读者曾经想到了,肯定是 crond 服务的作用。没错,logwatch 一旦装置,就会在 /etc/cron.daily/ 目录中建设“0logwatch”文件,用于在每天定时执行 logwatch 命令,剖析和监控相干日志。

如果想要让这个日志剖析马上执行,则只需执行 logrotate 命令即可。命令如下:

[root@localhost ~]# logwatch

马上执行 logwatch 日志剖析工具

[root01ocalhost ~]# mail

查看邮件

Heirloom Mail version 12.4 7/29/08. Type ? for help, “/var/spool/mail/root”: 5 messages 1 new 2 unread
1 logwatch@localhost.1 Fri Jun 7 11:17 42/1482 “Logwatch for localhost.localdomain (Linux)”
U 2 logwatch@localhost.1 Fri Jun 7 11:19 42/1481 “Logwatch for localhost.localdomain (Linux)”
3 logwatch@localhost.1 Fri Jun 7 11:23 1234/70928 “Logwatch for localhost.localdomain (Linux)”
4 logwatch@localhost.1 Fri Jun 7 11:24 190/5070 “Logwatch for localhost.localdomain (Linux)”
5 logwatch@localhost.1 Fri Jun 7 11:55 41/1471 “Logwatch for localhost.localdomain (Linux)”

N 6 logwatch@localhost.1 Fri Jun 7 11:57 189/5059 “Logwatch for localhost.localdomain (Linux)”

第 6 封邮件就是刚刚生成的曰志剖析邮件,”N” 代表没有查看

& 6
Message 6:
From root@localhost.localdomain Fri Jun 7 11:57:35 2013 Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
To: root@localhost.localdomain
From: logwatch@localhost.localdomain
Subject: Logwatch for localhost.localdomain (Linux)
Content-Type: text/plain; charset=”iso-8859-1″
Date: Fri, 7 Jun 2013 11:57:33 +0800 (CST)
Status: R

Logwatch 7.3.6 (05/19/07)

Processing Initiated: Fri Jun 7 11:57:33 2013
Date Range Processed: all
Detail Level of Output: 0
Type of Output: unformatted
Logfiles for Host: localhost.localdomain

下面是曰志剖析的工夫和日期

… 省略局部输入 …
——— Connections (secure-log) Begin———–

剖析 secure.log 日志的内容。统计新建设了哪些用户和组,以及谬误登录信息 New Users:

    bb (501)
    def (503)
    hjk (504)
    zhangsan (505)
    dovecot (97)
    dovenull (498)
    aa (500)

New Groups:
    bb (501)
    def (503)
    hjk (504)
    zhangsan (505)
    dovecot (97)
    dovenull (498)
    aa (500)

Failed logins:
    User root:
    (null): 3 Time(s)

Root logins on tty’s: 7 Time(s).

Unmatched Entries
groupadd: group added to /etc/group: name=dovecot, GID=97: 1 Time(s)
groupadd: group added to /etc/group: name=dovenul1, GID=498: 1 Time(s)
groupadd: group added to /etc/gshadow: name=dovecot: 1 Time(s)groupadd: group added to /etc/gshadow: name=dovenull: 1 Time(s)
——–Connections (secure-log)End——-
————-SSHD Begin——————-

剖析 SSHD 的日志。能够晓得哪些 IP 地址连贯过服务器

SSHD Killed: 7 Time(s)
SSHD Started: 24 Time(s)
Users logging in through sshd:
192.168.0.104: 10 times
192.168.0.108: 8 times
192.168.0.101: 6 times
192.168.0.126: 4 times
192.168.0.100: 3 times
192.168.0.105: 3 times
192.168.0.106: 2 times
192.168.0.102: 1 time
192.168.0.103: 1 time
SFTP subsystem requests: 3. Time(s)
Unmatched Entries
Exiting on signal 15 : 6 time(s)
—————-SSHD End———–

————— yum Begin ———

统计 yum 装置的软件。能够晓得咱们装置了哪些软件

Packages Installed:
    perl-YAML-Syck-1.07-4.el6.i686
    perl-Date-Manip-6.24-1.el6.noarch
    logwatch-7.3.6-49.el6.noarch
———–yum End————-

——–Disk Space Begin——-

统计磁盘空间状况

Filesystem Size Used Avail Use% Mounted on
/dev/sda3 20G 1.9G 17G 11% /
/dev/sda1 194M 26M 158M 15% /boot
/dev/sr0 3.5G 3.5G 0 100% /mnt/cdrom
———Disk Space End—————–

Logwatch End

有了这个日志剖析工具,日志管理工作就会轻松很多。当然,在 Linux 中能够反对很多日志剖析工具,咱们在这里只介绍了 CentOS 自带的 logwatch,大家能够依据本人的习惯抉择相应的日志剖析工具。

正文完
 0