- 常见的日志文件
(1)var/log/boot.log: 开机的时候系统核心会去侦测与启动硬件,接下来开始各种核心支持的功能启动等
(2)/var/log/cron:例行性工作调度
(3)/var/log/dmesg: 记录系统在开机的时候核心侦测过程所产生的各项信息
(4)/var/log/lastlog: 可以记录系统上面所有的帐号最近一次登陆系统时的相关信息
(5)/var/log/maillog 或 /var/log/mail/*: 记录邮件的往来信息,其实主要是记录 postfix(SMTP 协定提供者) 与 dovecot (POP3 协定提供者) 所产生的讯息啦
(6)/var/log/messages: 这个文件相当的重要,几乎系统发生的错误讯息 (或者是重要的信
息) 都会记录在这个文件中
(7)基本上,只要牵涉到“需要输入帐号密码”的软件,那么当登陆时 (不管登陆正确或错误) 都会被记录在此文件中。 包括系统的 login 程序、图形接口登陆所使用的 gdm 程序、 su, sudo 等程序、还有网络连线的 ssh, telnet 等程序, 登陆信息都会被记载在这里;
(8)/var/log/wtmp, /var/log/faillog: 这两个文件可以记录正确登陆系统者的帐号信息(wtmp) 与错误登陆时所使用的帐号信息 (faillog)
(9)/var/log/httpd/, /var/log/samba/: 不同的网络服务会使用它们自己的登录文件来记载它们自己产生的各项讯息! - 针对日志文件系统需要的服务和程序:
systemd:主要登录系统与网络等服务的信息
klogd:主要登录内核产生的各项信息
logrotate:主要在进行日志文件的轮替功能。 syslogd:记录日志文件的服务
# 查看是否有启动rsyslog服务: [root@CentOS ~]# chkconfig --list rsyslog rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@CentOS ~]# ps aux | grep rsyslog root 1655 0.0 0.1 36164 1544 ? Sl 07:30 0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 root 4029 0.0 0.0 4360 732 pts/2 S+ 08:03 0:00 grep rsyslog [root@CentOS ~]# chkconfig --list rsyslog rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
(1)日志文件内容的格式
1 . 事件发生的日期和时间
2 . 发生此事件的主机名
3 . 启动此事件的服务名称或函数名称
4 . 该信息的实际数据内容# 查看/var/log/secure内容 [root@CentOS ~]# cat -n /var/log/secure 1 Mar 13 10:53:30 CentOS userhelper[4459]: running '/sbin/reboot ' with root privileges on behalf of 'root' 2 Mar 13 10:53:31 CentOS su: pam_unix(su:session): session closed for user root 3 Mar 13 10:53:31 CentOS polkitd(authority=local): Unregistered Authentication Agent for session /org/freedesktop/ConsoleKit/Session2 (system bus name :1.50, object path /org/gnome/PolicyKit1/AuthenticationAgent, locale zh_CN.UTF-8) (disconnected from bus) 4 Mar 13 10:53:33 CentOS sshd[2060]: Received signal 15; terminating. 5 Mar 13 10:54:41 CentOS sshd[2023]: Server listening on 0.0.0.0 port 22. 6 Mar 13 10:54:41 CentOS sshd[2023]: Server listening on :: port 22.
(2)syslog的配置文件:/etc/syslog.conf
1 . syslog针对各种服务与信息记录在某些文件的配置文件就是/etc/syslog.conf,这个文件规定了什么服务的什么等级以及需要记录在哪里(设备或文件)这三个。
/etc/syslog.conf功能:将各种类型的服务日志文件记录在不同的文件里面。服务名称[.=!]信息等级 信息记录的文件名或设备或主机
syslog设置的服务(可以使用man 3 syslog查询):
2 . 信息等级
除了 0 到 6 之外还有两个比较特殊的等级, 那就是 debug(错误侦测等
级) 与 none (不需登录等级) 两个,当我们想要作一些错误侦测,或者是忽略掉某些服务的信息时, 就用这两个。
特别留意一下在讯息等级之前还有 [.=!] 的链接符号喔!他代表的意思是这样的:
. :代表“比后面还要严重的等级 (含该等级) 都被记录下来”的意思,例如: mail.info代表只要是 mail 的信息,而且该信息等级严重于 info (含 info 本身)时,就会被记录下来的意思。
.=:代表所需要的等级就是后面接的等级而已, 其他的不要!
.!:代表不等于, 亦即是除了该等级外的其他等级都记录。
3 . 讯息记录的文件名或设备或主机
下面就是一些常见的放置处:
(1)文件的绝对路径:通常就是放在 /var/log 里头的文件啦!
(2)打印机或其他:例如 /dev/lp0 这个打印机设备
(3)使用者名称:显示给使用者啰!
(4)远端主机:例如 @study.vbird.tsai 当然啦,要对方主机也能支持才行!
(5)*:代表“目前在线上的所有人”,类似 wall 这个指令的意义!
(6)服务、daemon 与函数名称
# 如果我要将我的 mail 相关的数据给他写入 /var/log/maillog 当中,那么在/etc/rsyslog.conf 的语法如何设计?答:基本的写法是这样的: [root@CentOS ~]# vim /etc/rsyslog.conf mail.info /var/log/maillog # 我要将新闻群组数据 (news) 及例行性工作调度 (cron) 的讯息都写入到一个称为/var/log/cronnews 的文件中,但是这两个程序的警告讯息则额外的记录在/var/log/cronnews.warn 中, 那该如何设置我的 rsyslog.conf 呢 news.;cron. /var/log/cronnews news.=warn;cron.=warn /var/log/cronnews.warn # 上面那个“.=”就是在指定等级的意思啦!由于指定了等级,因此,只有这个等级的讯息才会被记录在这个文件里面呢! 此外你也必须要注意,news 与 cron 的警告讯息也会写入/var/log/cronnews 内 # 我的 messages 这个文件需要记录所有的信息,但是就是不想要记录 cron, mail 及news 的信息,那么应该怎么写才好?答:可以有两种写法,分别是: .;news,cron,mail.none /var/log/messages .;news.none;cron.none;mail.none /var/log/messages
4 . CentOS 7.x 默认的 rsyslog.conf 内容
# 来自 CentOS 7.x 的相关数据 [root@study ~]# vim /etc/rsyslog.conf 1 #kern.* /dev/console 2 *.info;mail.none;authpriv.none;cron.none /var/log/messages 3 authpriv.* /var/log/secure 4 mail.* -/var/log/maillog 5 cron.* /var/log/cron 6 *.emerg :omusrmsg:* 7 uucp,news.crit /var/log/spooler 8 local7.* /var/log/boot.log
上面总共仅有 8 行设置值,每一行的意义是这样的:
1 . #kern.*:只要是核心产生的讯息,全部都送到 console(终端机) 去。
2 . *.info;mail.none;authpriv.none;cron.none:由于 mail, authpriv, cron 等类别产生的讯息较多, 且已经写入下面的数个文件中,因此在 /var/log/messages 里面不记录这些项目。
3 . authpriv.*:认证方面的讯息均写入 /var/log/secure 文件;
4 . mail.*:邮件方面的讯息则均写入 /var/log/maillog 文件;
5 . cron.*:例行性工作调度均写入 /var/log/cron 文件;
6 . *.emerg:当产生最严重的错误等级时,将该等级的讯息以 wall 的方式广播给所有在系统登陆的帐号得知, 要这么做的原因是希望在线的使用者能够赶紧通知系统管理员来处理这么可怕的错误问题。
7 . uucp,news.crit:uucp 是早期 Unix-like 系统进行数据传递的通讯协定,后来常用在新闻群组的用途中。 news 则是新闻群组。当新闻群组方面的信息有严重错误时就写入/var/log/spooler 文件中;
8 . local7.*:将本机开机时应该显示到屏幕的讯息写入到 /var/log/boot.log 文件中;
….在记录的文件 /var/log/maillog 前面还有个减号“ - ”是干嘛用的?由于邮件所产生的讯息比较多,因此我们希望邮件产生的讯息先储存在速度较快的内存中 (buffer) ,等到数据量够大了才一次性的将所有数据都填入磁盘内,这样将有助于登录文件的存取性能。
5 . 如果你想要让“所有的信息”都额外写入到/var/log/admin.log 这个文件时# 1\. 先设置好所要创建的文件设置! [root@study ~]# vim /etc/rsyslog.conf # Add by VBird 2015/08/19 <==再次强调,自己修改的时候加入一些说明 *.info /var/log/admin.log <==有用的是这行啦! # 2\. 重新启动 rsyslogd 呢! [root@study ~]# systemctl restart rsyslog.service [root@study ~]# ll /var/log/admin.log -rw-r--r--. 1 root root 325 Aug 20 00:54 /var/log/admin.log # 瞧吧!创建了这个登录文件出现啰! # 如此一来,所有的信息都会写入 /var/log/admin.log 里面了!
日志文件的安全性设置
如果将一个文件以 chattr 设置 i 这个属性时,那么该文件连 root 都不能杀掉!而且也不能新增数据,嗯!真安全!但是,如此一来登录文件的功能岂不是也就消失了? 因为没有办法写入呀!所以啰,我们要使用的是 a 这个属性!你的登录文件如果设置了这个属性的话,那么 他将只能被增加,而不能被删除:[root@study ~]# chattr +a /var/log/admin.log [root@study ~]# lsattr /var/log/admin.log -----a---------- /var/log/admin.log
日志文件一旦被编辑过就无法继续记录,要让该日志文件可以继续写入,你只要重新启动 rsyslogd.service 即可。
不过,也因为这个 +a 的属性让该文件无法被删除与修改,所以啰,当我们进行登录文件轮替时 (logrotate) ,将会无法移动该登录文件的文件名呢!所以会造成很大的困扰。这个困扰虽然可以使用 logrotate 的配置文件来解决,但是,还是先将登录文件的 +a 旗标拿掉吧![root@study ~]# chattr -a /var/log/admin.log
日志文件服务器的设置
日志文件服务器默认的端口就是 UDP 或 TCP 的 port 514# 设置日志文件服务器和客户端 # 1. Server 端:修改 rsyslogd 的启动配置文件,在 /etc/rsyslog.conf 内! [root@study ~]# vim /etc/rsyslog.conf # 找到下面这几行: # Provides UDP syslog reception #$ModLoad imudp #$UDPServerRun 514 # Provides TCP syslog reception #$ModLoad imtcp #$InputTCPServerRun 514 # 上面的是 UDP 端口,下面的是 TCP 端口!如果你的网络状态很稳定,就用 UDP 即可。 # 不过,如果你想要让数据比较稳定传输,那么建议使用 TCP 啰!所以修改下面两行即可! $ModLoad imtcp $InputTCPServerRun 514 # 2. 重新启动与观察 rsyslogd 喔! [root@study ~]# systemctl restart rsyslog.service [root@study ~]# netstat -ltnp | grep syslog Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 2145/rsyslogd tcp6 0 0 :::514 :::* LISTEN 2145/rsyslogd # 嘿嘿!你的登录文件主机已经设置妥当啰!很简单吧!
至于 client 端的设置就简单多了!只要指定某个信息传送到这部主机即可! 举例来说,我们
的登录文件服务器 IP 为 192.168.1.100 ,而 client 端希望所有的数据都送给主机, 所以,可
以在 /etc/rsyslog.conf 里面新增这样的一行:[root@study ~]# vim /etc/rsyslog.conf *.* @@192.168.1.100 #*.* @192.168.1.100 # 若用 UDP 传输,设置要变这样! [root@study ~]# systemctl restart rsyslog.service
logrotate:日志文件的轮替
syslog利用的是deamon的方式来启动的,当有需求的时候立刻就会被执行,但是logrotate确实在规定时间到了之后才来进行日志文件的轮替,所以这个logrotate程序就是挂在cron下面进行的(/etc/cron/daily)(/etc/cron/daily/logrotate)
logrotate 这个程序的参数配置文件在哪里呢?那就是:/etc/logrotate.conf
/etc/logrotate.d/那个 logrotate.conf 才是主要的参数文件,至于 logrotate.d 是一个目录, 该目录里面的所有文件都会被主动的读入 /etc/logrotate.conf 当中来进行!另外,在 /etc/logrotate.d/ 里面的文件中,如果没有规定到的一些细部设置,则以 /etc/logrotate.conf 这个文件的规定来指定为默认值!
# 那么多久进行一次这样的 logrotate 工作呢?这些都记录在logrotate.conf 里面,我们来看一下默认的 logrotate 的内容吧! [root@study ~]# vim /etc/logrotate.conf # 下面的设置是 "logrotate 的默认设置值" ,如果个别的文件设置了其他的参数, # 则将以个别的文件设置为主,若该文件没有设置到的参数则以这个文件的内容为默认值! weekly <==默认每个礼拜对登录文件进行一次 rotate 的工作 rotate 4 <==保留几个登录文件呢?默认是保留四个! create <==由于登录文件被更名,因此创建一个新的来继续储存之意! dateext <==就是这个设置值!可以让被轮替的文件名称加上日期作为文件名喔! #compress <==被更动的登录文件是否需要压缩?如果登录文件太大则可考虑此参数启动 include /etc/logrotate.d # 将 /etc/logrotate.d/ 这个目录中的所有文件都读进来执行 rotate 的工作! /var/log/wtmp { <==仅针对 /var/log/wtmp 所设置的参数 monthly <==每个月一次,取代每周! create 0664 root utmp <==指定新建文件的权限与所属帐号/群组 minsize 1M <==文件大小一定要超过 1M 后才进行 rotate (略过时间参数) rotate 1 <==仅保留一个,亦即仅有 wtmp.1 保留而已。 }# 这个 wtmp 可记录登陆者与系统重新开机时的时间与来源主机及登陆期间的时间。 # 由于具有 minsize 的参数,因此不见得每个月一定会进行一次喔!要看文件大小。 # 由于仅保留一个登录文件而已,不满意的话可以将他改成 rotate 5 吧!
# 上面我们大致介绍了 /var/log/wtmp 这个文件的设置,现在你知道了logrotate.conf 的设置语法是: 登录文件的绝对路径文件名 ... { 个别的参数设置值,如 monthly, compress 等等 } # 下面我们再以 /etc/logrotate.d/syslog 这个轮替 rsyslog.service 服务的文件,来看看该如何设置他的 rotate [root@study ~]# vim /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null|| true endscript }
1 . 在上面的语法当中,我们知道正确的 logrotate 的写法为:
(1)文件名:被处理的登录文件绝对路径文件名写在前面,可以使用空白字符分隔多个登录文件;
(2)参数:上述文件名进行轮替的参数使用 { } 包括起来;
(3)执行脚本:可调用外部指令来进行额外的命令下达,这个设置需与 sharedscripts ….endscript 设置合用才行。
2 . 那么 /etc/logrotate.d/syslog 内设置的 5 个文件的轮替功能就变成了:
(1)该设置只对 /var/log/ 内的 cron, maillog, messages, secure, spooler 有效;
(2)登录文件轮替每周一次、保留四个、且轮替下来的登录文件不进行压缩(未更改默认值);
(3)轮替完毕后 (postrotate) 取得 syslog 的 PID 后,以 kill -HUP 重新启动 syslogd# 由于加上这个 +a 的参数啊,所以更改日志轮替名字是不可能成功的! 那怎么办呢?呵呵!就利用prerotate 与 postrotate 来进行登录文件轮替前、后所需要作的动作 [root@study ~]# vim /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts prerotate /usr/bin/chattr -a /var/log/messages endscript sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true /usr/bin/chattr +a /var/log/messages endscript } # 就是先给他去掉 a 这个属性,让登录文件 /var/log/messages 可以进行轮替的动作,然后执行了轮替之后,再给他加入这个属性!请特别留意的是,那个 /bin/kill -HUP ... 的意义,这一行的目的在于将系统的 rsyslogd 重新以其参数文件 (rsyslog.conf) 的数据读入一次!
实际测试 logrotate 的动作
[root@study ~]# logrotate [-vf] logfile 选项与参数: -v :启动显示模式,会显示 logrotate 运行的过程喔! -f :不论是否符合配置文件的数据,强制每个登录文件都进行 rotate 的动作! 范例一:执行一次 logrotate 看看整个流程为何? [root@study ~]# logrotate -v /etc/logrotate.conf reading config file /etc/logrotate.conf #读取主要配置文件 including /etc/logrotate.d #调用外部的设置 reading config file chrony #就是外部设置啊! ....(中间省略).... Handling 18 logs #共有 18 个登录文件被记录 ....(中间省略).... rotating pattern: /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler weekly (52 rotations) empty log files are not rotated, old logs are removed considering log /var/log/cron log does not need rotating considering log /var/log/maillog log does not need rotating considering log /var/log/messages <==开始处理 messages log does not need rotating <==因为时间未到,不需要更动! ....(下面省略).... 范例二:强制进行 logrotate 的动作 [root@study ~]# logrotate -vf /etc/logrotate.conf ....(前面省略).... rotating log /var/log/messages, log->rotateCount is 52 dateext suffix '-20150820' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' compressing log with: /bin/gzip ....(下面省略).... # 看到否?整个 rotate 的动作就是这样一步一步进行的~ [root@study ~]# ll /var/log/messages*; lsattr /var/log/messages -rw-------. 1 root root 143 Aug 20 01:45 /var/log/messages -rw-------. 1 root root 167125 Aug 20 01:40 /var/log/messages-20150820 -----a---------- /var/log/messages # 主动加入 a 的隐藏属性啰!
由于 logrotate 的工作已经加入 crontab 里头了!所以现在每天系统都会自动的给他查看logrotate 啰!不用担心的啦!只是要注意一下那个 /var/log/messages 里头是否常常有类似下面的字眼:
Aug 20 01:45:34 study rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" xpid=" 2145" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
这说明的是 rsyslogd 重新启动的时间啦 (就是因为 /etc/logrotate.d/syslog 的设置之缘故!)
自定义日志文件的轮替功能
假设前提是这样的,前一小节当中,假设你已经创建了 /var/log/admin.log 这个文件, 现在,你想要将该文件加上 +a 这个隐藏标签,而且设置下面的相关信息:登录文件轮替一个月进行一次;
该登录文件若大于 10MB 时,则主动进行轮替,不需要考虑一个月的期限;
保存五个备份文件;
备份文件需要压缩# 1. 先创建 +a 这个属性啊! [root@study ~]# chattr +a /var/log/admin.log [root@study ~]# lsattr /var/log/admin.log -----a---------- /var/log/admin.log [root@study ~]# mv /var/log/admin.log /var/log/admin.log.1 mv: cannot move `/var/log/admin.log' to `/var/log/admin.log.1': Operation not permitted # 这里确定了加入 a 的隐藏属性!所以 root 无法移动此登录文件! # 2. 开始创建 logrotate 的配置文件,增加一个文件在 /etc/logrotate.d 内就对了! [root@study ~]# vim /etc/logrotate.d/admin # This configuration is from VBird 2015/08/19 /var/log/admin.log { monthly #每个月进行一次 size=10M #文件大小大于 10M 则开始处置 rotate 5 #保留五个! compress #进行压缩工作! sharedscripts prerotate /usr/bin/chattr -a /var/log/admin.log endscript sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || /usr/bin/chattr +a /var/log/admin.log endscript } # 3. 测试一下 logrotate 相关功能的信息显示: [root@study ~]# logrotate -v /etc/logrotate.conf ....(前面省略).... rotating pattern: /var/log/admin.log 10485760 Bytes (5 rotations) empty log files are rotated, old logs are removed considering log /var/log/admin.log log does not need rotating not running prerotate script, since no logs will be rotated not running postrotate script, since no logs were rotated ....(下面省略).... # 因为还不足一个月,文件也没有大于 10M,所以不需进行轮替! # 4. 测试一下强制 logrotate 与相关功能的信息显示: [root@study ~]# logrotate -vf /etc/logrotate.d/admin reading config file /etc/logrotate.d/admin reading config file /etc/logrotate.d/admin Handling 1 logs rotating pattern: /var/log/admin.log forced from command line (5 rotations) empty log files are rotated, old logs are removed considering log /var/log/admin.log log needs rotating rotating log /var/log/admin.log, log->rotateCount is 5 dateext suffix '-20150820' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' renaming /var/log/admin.log.5.gz to /var/log/admin.log.6.gz (rotatecount 5, logstart 1, i 5), old log /var/log/admin.log.5.gz does not exist renaming /var/log/admin.log.4.gz to /var/log/admin.log.5.gz (rotatecount 5, logstart 1, i 4), old log /var/log/admin.log.4.gz does not exist renaming /var/log/admin.log.3.gz to /var/log/admin.log.4.gz (rotatecount 5, logstart 1, i 3), old log /var/log/admin.log.3.gz does not exist renaming /var/log/admin.log.2.gz to /var/log/admin.log.3.gz (rotatecount 5, logstart 1, i 2), old log /var/log/admin.log.2.gz does not exist renaming /var/log/admin.log.1.gz to /var/log/admin.log.2.gz (rotatecount 5, logstart 1, i 1), old log /var/log/admin.log.1.gz does not exist renaming /var/log/admin.log.0.gz to /var/log/admin.log.1.gz (rotatecount 5, logstart 1, i 0), old log /var/log/admin.log.0.gz does not exist log /var/log/admin.log.6.gz doesn't exist -- won't try to dispose of it running prerotate script fscreate context set to system_u:object_r:var_log_t:s0 renaming /var/log/admin.log to /var/log/admin.log.1 running postrotate script compressing log with: /bin/gzip [root@study ~]# lsattr /var/log/admin.log* -----a---------- /var/log/admin.log ---------------- /var/log/admin.log.1.gz #有压缩过喔!
logwatch:分析日志文件
它会每天分析一次日志文件,并且将数据以email的格式寄给root。使用 journalctl 观察登录信息
鸟哥的linux私房菜学习笔记《三十八》认识与分析日志文件
最新推荐文章于 2023-02-09 16:27:07 发布