日志
重要性:
- 解决系统方面的错误,可以通过日志查询到错误的信息方便定位问题。
- 解决网络服务问题,如果出现网络无法使用等问题,可以通过日志查询具体的错误原因进行解决。
- 假设,你的web服务在某个时间定的访问量特别大,就可以通过相关日志查询到具体的ip访问的路径从中发现问题并且解决。
常见的日志文件:
文件名称 作用 /var/log/cron
定时器的日文件 /var/log/dmesg
记录开机的时候内核检查过程产生各项信息。 /var/log/lastlog
记录最近一次登录系统时的相关信息。 /var/log/maillog或者/var/log/mail/*
记录邮件的往来信息,主要记录sendmail与dovecot所产生的信息。 /var/log/messages
系统中几乎发生的错误信息都会记录到这个文件中。 /var/log/secure
涉及到需要输入账户密码软件,当登陆时(无论时错误还是正确的)都会记录到当前文件。su sudo ssh等。 /var/log/wtmp /var/log/faillog
记录正确登录(wtmp)账户信息,以及错误登陆时(fail)账户信息。 /var/log/nginx 或者 /var/log/http
第三方安装软件的日志。
1.日志的产生
1.有软件开发商自行定义写入日志文件与相关的格式,例如:nginx httpd docker 等
2.有linux提供日志文件管理系统统一管理。只需要将信息丢给这个服务,那么它就会将信息写入到日志中,
centos 提供 syslogd 服务同意管理日志文件有些已经被'rsyslog'替代,除此之外还有klogd服务专门记录内核信息的日志。
# 问题:
随着系统开启的时间增加,那么日志随之也会增加,就会导致磁盘与内存的压力变大,那么就会导致服务器性能上有所降低。
可以通过logrotate(日志文件轮替)将日志进行切割,本质上就是当日志超过多大的时候,就会新建一个文件存放日志,到达了某个时间点就会删除旧的日志。
2.rsyslogd日志服务
文档:http://www.rsyslog.com/doc/
2-1.日志格式
例如:/var/log/secure
[root@template ~]# cat /var/log/secure
Jan 19 10:33:36 template sshd[3165]: pam_unix(sshd:session): session closed for user root
Jan 20 08:35:01 template sshd[4013]: Accepted password for root from 192.168.85.1 port 61892 ssh2
Jan 20 08:35:01 template sshd[4013]: pam_unix(sshd:session): session opened for user root by (uid=0)
Jan 20 09:34:43 template sudo: root : TTY=pts/0 ; PWD=/test ; USER=root ; COMMAND=/bin/yum install patch
Jan 20 09:34:43 template sudo: pam_unix(sudo:session): session opened for user root by root(uid=0)
Jan 20 09:34:52 template sudo: pam_unix(sudo:session): session closed for user root
Jan 20 10:51:13 template sshd[4013]: pam_unix(sshd:session): session closed for user root
Jan 21 07:13:02 template sshd[4555]: Accepted password for root from 192.168.85.1 port 58926 ssh2
Jan 21 07:13:02 template sshd[4555]: pam_unix(sshd:session): session opened for user root by (uid=0)
解释:
Jan 21 07:13:02 template sshd[4555]: pam_unix(sshd:session): session opened for user root by (uid=0)
Jan 21 07:13:02:日期/时间
template sshd[4555]: pam_unix(sshd:session):服务相关的函数
session opened for user root by (uid=0):信息说明
在1月21号7:13:02秒用户template 通过sshd服务登录(pid:4555)由pam_unix模块提出,信息是为用户root打开会话。
2-2.配置文件
配置文件目录:
/etc/rsyslog.conf
格式如下:
服务器名称[.=!]信息的等级(日志等级) 记录的文件名称或设备主机
例如:
mail.info /var/login/maillog_info # 说明 mail的服务生成等于info等级的都会记录到/var/login/maillog_info文件内
# 通过grep命令筛选出未主注释的配置:
grep -v -E '#|^$' /etc/rsyslog.conf
[root@template ~]# grep -v -E '#|^$' /etc/rsyslog.conf
$WorkDirectory /var/lib/rsyslog # 指定工作目录,日志相关的临时文件或者工作文件存储的地方。
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # 设置日志文件的默认格式使用这中格式可以兼容早起的syslog
$IncludeConfig /etc/rsyslog.d/*.conf # 其他的配置文件
$OmitLocalLogging on # 禁用本地日志记录。避免日志循环
$IMJournalStateFile imjournal.state # 指定 imjournal 模块的状态文件。这个模块用于读取系统日志
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
2-3.配置信息说明
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler #
local7.* /var/log/boot.log # 开机显示的屏幕的信息写入boot.log文件中
# 例如:authpriv.* /var/log/secure
authpriv.*:记录所有 authpriv 设施的消息(不区分日志基本)。
/var/log/secure :存储的内容位置。
# 链接符号语法:
[.=!*]:
.:代表比后面更高的等级(包含该等级)的日志都会被记录。例如:mail.info除了info信息还会记录高于info等级的信息。
.=:代表只需要当前等级,其它的都不要。例如:mail.=info,只会记录info信息。
.!:代表不等于,除了当前等级,其它都要。例如:mail.!info,不会记录info信息,只会记录除了info以外的信息。
.*:包含全部的日志等级 包括 debug、info、notice、warning、err、crit、alert 和 emerg。
# 基本配置写法:
服务名称[链接符号]日志等级 存储日志文件的地址
mail.info /var/log/maillog # 存储到本地
mail.err @@server.example.net # 将信息发送到日志服务器上 server.example.net 远程地址(通过rsyslog服务接受)
# 注意:
更为高级的语法可以在官方文档中查看。
2-3-1.远程服务接受
# 机器A设置
实现远程接受:
mail.err @@server.example.net(域名或者ip地址)
# 机器B设置
1.修改配置文件 /etc/rsyslog.conf
# 启用 TCP 接收
module(load="imtcp") # 加载 TCP 输入模块
input(type="imtcp" port="514") # 监听 TCP 端口 514
2.设置配置规则 /etc/rsyslog.conf
*.* /var/log/remote.log # 将所有接收到的远程日志存储到一个文件中,可以写的更为精准一些复杂一些,更好区分。
3.重启rsyslog
systemctl restart rsyslog
4.测试,查看机器B是否有remote.log文件以及对应的信息
logger -p mail.err "This is a test error message"
2-3-2.简单语法场景
1.如果两个服务的日志都要放到同一个文件中
news.*,cron.* /var/log/cronnews # 将新闻服务于定时器服务日志放到同一个文件中,.*代表全部的日志级别
2.如果只要看到警告的日志级别
news.=warn,cron.=warn /var/log/cronnews # .=warn 只看警告的日志级别
3.只记录部分的系统日志,mail于cron的日志不记录
*.*;mail,cron.none /var/log/123.log # 第一种 *.*记录全部的服务,注意最后一个服务需要加了.none
*.*;mail.none,cron.none /var/log/123.log # 第二种 两个服务都加了 .none
2-3-3.添加日志功能
1.修改配置文件
# add 2024-10-12 # 添加一行增加的时间
*.info /var/log/admin.log # 将全部的服务信息日志包含info的以及以上等级的全部写入这个文件中。
2.重启服务
systemctl restart rsyslogd
2-4.服务名称
名称 | 说明 |
---|---|
auth(authpriv) | 认证相关的机制,比如login,ssh,su等需要账户密码。 |
cron | 定时器服务,cron/at等生成日志的地方。 |
daemon | 与各个demon有关信息 |
kern | 内核产生信息的地方 |
lpr | 打印相关的信息 |
邮件相关 | |
news | 新闻组服务器相关 |
rsyslog | 当前rsyslog本身生成的信息 |
user,uucp,local0-local7 | 与unix like基本本身有关的信息 |
例如:
开发商可以通过调用软件的服务名称来记录日志。sendmail 与dovecot 都是与邮件相关的服务软件,这些软件在设计时就会主动调用rsyslogd服务内的mail服务名称(LOG_MAIL)所以在rsyslogd服务看来,只要时(sendmail,postfix,dovecot)产生的日都是mail类型的。
2-5.日志级别
等级 | 名称 | 说明 |
---|---|---|
1 | info | 基本日志,一些普通的信息。 |
2 | notice | 除了info意外要注意的一些信息。 |
3 | warning | 警示信息,不会影响软件服务的运行。 |
4 | error | 错误信息,例如配置文件配置错误导致服务无法启动等。 |
5 | crit | 比error更为严重。 |
6 | aletrt | 警告,错误信息更为严重。 |
7 | emerg | '疼痛'等级,指系统几乎要死机。通常是硬件出现问题,导致内核无法顺序运行等。 |
3.logrotate日志切割服务
3-1.配置文件
/etc/logrotate.conf
/etc/logrotate..d/
3-2.执行的过程
当logrotate执行完毕第一次后:
原本的 123.log 变为 123.log.1,创建一个新的 123.log 空文件。
当logrotate执行完毕第二次后:
原本的 123.log.1 变为 123.log.2,在第一次创建的 123.log 变为 123.log.1,然后再创建一个空的 123.log文件
3-3.配置文件说明
[root@template ~]# cat /etc/logrotate.conf
weekly <== 默认个礼拜对日种子文件进行一次切割
rotate 4 <== 数据保留4
create <== 因为日志名称被重命名,所以创建一个新的进行存储
dateext <== 使用日期作为切割的文件后缀
#compress <== 使用压缩,取消注释使用,默认不使用
include /etc/logrotate.d <== 其他的日志轮换信息放入此目录
# 针对部分需要自定制的日志文件进行设置
/var/log/wtmp { <== 针对/var/log/wtmp配置
monthly <== 每月执行一次,代替默认的每周
create 0664 root utmp <== 指定创建文件的权限以及属主与数组
minsize 1M <== 文件大于1M自动切割,不受时间参数的影响。只要到达1M就会切割,如果不到1M就会按照时间切割
rotate 1 <== 文只会保留一个文件 wtmp.1
}
3-4.配置文件语法
# 配置语法:
日志文件的绝路径文件名称 {
个别其他的参数,会替换掉默认的参数。
}
# 例如:syslog的 rotate配置如下:
[root@template logrotate.d]# cat syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
3-5.相关配置参数
轮转周期:
daily:每天轮转一次。
weekly:每周轮转一次。
monthly:每月轮转一次。
yearly:每年轮转一次。
轮转次数
rotate count:指定保留的轮转日志文件数量。例如,rotate 5 表示保留最多 5 个轮转后的日志文件。
压缩选项:
compress:轮转后的日志文件将被 gzip 压缩。
nocompress:不压缩轮转后的日志文件。
delaycompress:与 compress 一起使用,延迟压缩到下一次轮转。
nodelaycompress:覆盖 delaycompress,立即压缩轮转后的日志
文件处理
copytruncate:备份当前日志文件并截断原始文件。
nocopytruncate:仅备份日志文件,不截断。
create mode owner group:以指定的权限、所有者和组创建新的日志文件。
nocreate:不创建新的日志文件
日志文件处理
ifempty:即使日志文件为空,也会进行轮转(默认行为)。
notifempty:如果日志文件为空,则不进行轮转。
size:当日志文件达到指定大小时进行轮转,例如 size=50M
其他选项:
dateext:在轮转后的日志文件名中添加日期后缀。
dateformat .%s:定义日期后缀的格式,必须与 dateext 配合使用。
errors address:将轮转过程中的错误信息发送到指定的电子邮件地址。
mail address:将轮转后的日志文件发送到指定的电子邮件地址。
nomail:不发送轮转后的日志文件
额外执行脚本:
prerotate 脚本 endscript # 在启动logrotate之前执行的命令脚本
postrotate 脚本 endscript # 在logrotate执行后启动的命令脚本
missingok # 如果日志文件不存在,logrotate不会报错
sharedscripts # 在轮转日志文件时,postrotate/prerotate脚本只会执行一次,避免重复执行
3-6.测试logrotate操作
命令:
logrotate [参数] 配置文件
作用:
当设置好新的配置文件,可以通过当前操作验证是否正常。
参数:
-v 启动显示模式,显示执行过程
-f 不论是否符合配置数据,强制操作每个日志文件进行rotate操作
例如:
logrotate -vf /etc/logrotate.conf
查询:
find /var/log/ -type f -name '*{当前执行的日期}'