kaixin
Published on 2023-09-15 / 6 Visits
0

Linux日志

日志

重要性:

  1. 解决系统方面的错误,可以通过日志查询到错误的信息方便定位问题。
  2. 解决网络服务问题,如果出现网络无法使用等问题,可以通过日志查询具体的错误原因进行解决。
  3. 假设,你的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打开会话。

image-20250121222744290


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

image-20250121223729151


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"

image-20250121231527253


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 打印相关的信息
mail 邮件相关
news 新闻组服务器相关
rsyslog 当前rsyslog本身生成的信息
user,uucp,local0-local7 与unix like基本本身有关的信息
例如:
    开发商可以通过调用软件的服务名称来记录日志。sendmail 与dovecot 都是与邮件相关的服务软件,这些软件在设计时就会主动调用rsyslogd服务内的mail服务名称(LOG_MAIL)所以在rsyslogd服务看来,只要时(sendmail,postfix,dovecot)产生的日都是mail类型的。

image-20250121224625412


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文件

image-20250121234132515


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
}

image-20250121235014826


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
    }

image-20250121235502827


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 '*{当前执行的日期}'

image-20250122001330147