0%

Linux运维学习笔记:日志管理

写在前面

这则笔记主要整理linux日志管理的相关知识,主要包括:

  • 系统日志介绍

  • 日志服务:rsyslogd

  • 日志查看:dmesg、last、lastb

  • 日志管理:journalctl

linux系统日志简介

系统日志是了解linux系统运行状况的重要途径,centos系统日志保存在/var/log/目录下。

从centOS6.x开始,已经用syslogd取代了原先的syslogd服务。syslogd特点如下:

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

  2. 更安全的网络传输方式;

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

  4. 后台数据库;

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

  6. 与syslog配置文件相兼容;

查看系统日志是否启动

1
2
3
4
5
//查看服务是否启动
ps aux | grep rsyslogd

//查看服务是否自启动
chkconfig --list | grep rsyslog

常见日志类型

文件名 内容说明
message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
secure 与安全相关的日志信息
maillog 与邮件相关的日志信息
cron 与定时任务相关的日志信息
spooler 与UUCP和news设备相关的日志信息
boot.log 守护进程启动和停止相关的日志消息
access-log    纪录HTTP/web的传输
btmp       纪录失败的纪录
lastlog     纪录最近几次成功登录的事件和最后一次不成功的登录
sudolog     纪录使用sudo发出的命令
sulog      纪录使用su命令的使用
syslog      从syslog中记录信息(通常链接到messages文件)
utmp       纪录当前登录的每个用户
wtmp       一个用户每次登录进入和退出时间的永久纪录
xferlog     纪录FTP会话

日志服务:rsyslogd

日志文件格式(四列):

  • 时间产生的时间

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

  • 产生事件的服务名或进程名

  • 事件的具体信息

配置文件

rsyslogd 配置文件为 /etc/rsyslog.conf

配置文件格式为:

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

服务名称 说明
auth 安全和认证相关消息(不推荐使用authpriv替代)
authpriv 安全和认证相关消息(私有的)
cron 系统定时任务cront和at产生的日志
daemon 和各个守护进程相关的日志
ftp ftp守护进程产生的日志
kern 内核产生的日志(不是用户进程产生的)
local0-local7 为本地使用预留的服务
lpr 打印产生的日志
mail 邮件收发信息
news 与新闻服务器相关的日志
syslog 由syslogd服务产生的日志信息
user 用户等级类别的日志信息
uucp uucp子系统的日志信息,uucp是早期linux系统进行数据传递的协议,后来也常用在新闻组服务中

连接符号

*代表所有日志等级,比如:”authpriv”代表authpriv认证服务产生的日志,所有的日志等级都记录

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

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

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

日志等级

  • debug :一般的调试信息说明

  • info:基本的通知信息

  • notice :普通信息,但是有一定的重要性

  • warning :警告信息,但是还不会影响到服务或系统的运行

  • err :错误信息,一般达到err等级的信息就影响到服务或系统的运行了

  • crit:临界状况信息,比err等级还要严重

  • alert:警告状态信息,比crit还要严重,必须立即采取行动

  • emerg :疼痛等级信息,系统已经无法使用了;

日志保存位置

  • 日志文件的绝对路径,如 “/var/log/secure”;

  • 系统设备文件,如 “/dev/lp0”;

  • 转发给远程主机,如 “@192.168.0.210:514”;

  • 发给在线的用户,如 “root”,”*”;

  • 忽略或丢弃日志,如 “~”;

说明:* 星号代表任何内容。

  • 如果是在服务名称处,代表任何服务;

  • 如果是在日志等级处,代表任何日志等级;

  • 如果是在保存位置处,代表发给所有的在线用户。

日志论替切割 :logrotate 命令

logrotate程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用,从而节省磁盘空间。

日志轮转是系统自动完成的 为了方便管理将每个服务类型的日志轮替配置信息形成独立文件存储在/etc/logrotate.d/*

  • 如果配置文件中拥有 dateext 参数,那么日志会用日期来作为日志文件的后缀。例如 secure-20140609。这样,日志文件就不会重名,也就不需要更改日志的文件名,只需保存指定的日志个数,删除其他的日志文件即可。

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

logrotate 配置文件

Logrotate的配置信息保存在/etc/logrotate.conf文件中。

参数 说明
daily 日志的轮替周期是每天。
weekly 日志的轮替周期是每周。
monthly 日志的轮替周期是每月。
rotate 数字 保留的日志文件的个数。0指没有备份。
compress 日志轮替时,旧的日志进行压缩
create mode owner group 建立新日志,同时指定新日志的权限、所有者和所属组。 如 create 0600 root utmp。
mail address 当日志轮替时,输出内容通过邮件发送到指定的邮箱。
missingok 如果日志不存在,则忽略该日志的警告信息。
notifempty 如果日志为空文件,则不进行日志轮替。
minisize 大小 日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替。
size 大小 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。 如 size 100k。
dateext 使用日期作为日志轮替文件的后缀。 如 secure-20140609
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# cat /etc/logrotate.conf

=>下面为默认值。如不单独配置将才有下面的默认值
weekly <==默认每周进行一次 rotate 的工作
rotate 4 <==默认保留4个登录文件
create <==以新创建文件继续存储日志文件
#compress <==被更动的登录文件是否需要压缩?如果登录文件太大则可考虑此参数启动

include /etc/logrotate.d

/var/log/wtmp { <==仅针对 /var/log/wtmp 所配置的参数
monthly <==每个月一次,取代每周!
minsize 1M <==文件容量一定要超过 1M 后才进行
create 0664 root utmp <==指定新建文件的权限与所属帐号/群组
rotate 1 <==仅保留一个
}

logrotate 语法

命令格式:

1
logrotate [OPTION] [configfile]
常用参数 说明
-d, –debug debug模式,测试配置文件是否有错误;
-f, –force 强制转储文件;
-m, –mail=command 压缩日志后,发送日志到指定邮箱;
-s, –state=statefile 使用指定的状态文件;
-v, –verbose 显示转储过程;

常见用法:

1
2
3
//强制进行日志文件都进行轮替操作

logrotate -vf /etc/logrotate.conf

查看日志的常见命令

dmesg 命令

dmesg命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构、cpu、挂载的硬件,RAM等多个运行级别的大量的系统信息。

命令行格式:

1
dmesg [options]
参数 说明
-c   显示信息后,清除ring buffer中的内容
-s<缓冲区大小>   预设置为8196,刚好等于ring buffer的大小
-n   设置记录信息的层级

示例:

  • 列出加载到内核中的所有驱动
1
dmesg | less
  • 搜索包含特定字符串的被检测到的硬件,-i 表示忽略大小写
1
2
dmesg | grep -i usb
dmesg | grep -i tty
  • 实时监控dmesg日志输出
1
2
3
4
5
6

watch 'dmesg | tail -f'

或者

tail -f /var/log/dmesg
  • 只输出dmesg命令开头/结尾20行日志
1
2
3
dmesg | head -n 20   //开头20行

dmesg | tail -n 20 //结尾20行

last命令

last命令,用来显示/var/log/wtmp文件,这是一个二进位制文件,内容是所有登录、登出的用户。

命令行格式:

1
last [options]
选项 说明
-a   把从何处登入系统的主机名称或IP地址,显示在最后一行;
-d 将IP地址转换成主机名称。
-f <记录文件>   指定记录文件,默认是显示/var/log目录下的wtmp文件的记录,但/var/log目录下得btmp能显示的内容更丰富,可以显示远程登录,例如ssh登录 ,包括失败的登录请求。
-n <显示列数>或-<显示列数>   设置列出名单的显示列数。
-R   不显示登入系统的主机名称或IP地址。
-x   显示系统关机,重新开机,以及执行等级的改变等信息。
-i 显示特定ip登录的情况
-t 显示特定时刻之前的信息
-num 展示前 num 个
username 展示 username 的登入讯息
tty 限制登入讯息包含终端机代号

last 命令能查看哪些信息

字段 说明
第一列 用户名
第二列 终端位置
第三列 登录ip或者内核
第四列 开始时间
第五列 结束时间(still login in 还未退出 down 直到正常关机 crash 直到强制关机)
第六列 持续时间

示例:

  • 显示特定的用户名
1
last root     //root可替换为需要查询的username
  • 最后一列显示主机IP地址
1
last -n 5 -a -i

lastb查看失败登录

lastb命令记录失败的登录尝试。你必须拥有root权限才能运行lastb命令。

示例:

1
2
3
[root@stevey log]# lastb

btmp begins Mon May 14 09:58:37 2018

lastlog命令 查看每一个用户最近一次的登录信息

1
2
3
4
5
6
7
[root@local-linux00 ~]# lastlog
Username Port From Latest
root pts/0 172.16.155.1 Wed Jul 25 15:29:15 +0800 2018
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**

日志管理

Systemd统一管理所有Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有内核日志和应用日志,其配置文件/etc/systemd/journald.conf

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
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
// 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl

// 查看内核日志(不显示应用日志)
$ sudo journalctl -k

// 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0

// 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1

// 查看指定时间的日志
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"

// 显示尾部的最新10行日志
$ sudo journalctl -n

// 显示尾部指定行数的日志
$ sudo journalctl -n 20

// 实时滚动显示最新日志
$ sudo journalctl -f

// 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd

// 查看指定进程的日志
$ sudo journalctl _PID=1

// 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash

// 查看指定用户的日志
$ sudo journalctl _UID=33 --since today

// 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today

// 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f

// 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today

// 查看指定优先级(及其以上级别)的日志,共有8级
// 0: emerg
// 1: alert
// 2: crit
// 3: err
// 4: warning
// 5: notice
// 6: info
// 7: debug
$ sudo journalctl -p err -b

// 日志默认分页输出,--no-pager 改为正常的标准输出
$ sudo journalctl --no-pager

// 以 JSON 格式(单行)输出
$ sudo journalctl -b -u nginx.service -o json

// 以 JSON 格式(多行)输出,可读性更好
$ sudo journalctl -b -u nginx.serviceqq
-o json-pretty

// 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage

// 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G

// 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!