Linux 日志管理journald和rsyslog

目录

1、systemd-journald和rsyslog相关概念

1.1、常见的日志分类

2、查看系统日志文件(日志记录设备和优先级)

2.1、日志设备

2.2、日志优先级

2.3、Rsyslog规则示例

2.4、手动发送syslog消息

2.5、日志轮替

3、查看内存日志

3.1、查看内存日志

3.2、显示最后n个日志条目

3.3、显示最后10个日志条目,并实时更新新写入的日志条目。

3.4、根据日志条目的优先级过滤日志输出

3.5、查看指定时间段的日志

3.6、从末尾查看内存日志,并加上注解

3.7、显示从开机启动时起的内存日志,并加上注解

3.8、查看日志条目详细字段信息

4、保存系统日志

5、lnav命令

6、rsyslog日志服务状态

7、配置文件(/etc/systemd/journald.conf)

7.1、Storage 在哪里存储日志文件:

7.2、Compress

7.3、Seal

7.4、SplitMode

7.5、RateLimitIntervalSec 与RateLimitBurst

7.6、限制日志文件的大小上限。

7.7、MaxFileSec日志滚动的时间间隔

7.8、MaxRetentionSec日志文件的最大保留期限

7.9、SyncIntervalSec

7.10、ForwardToSyslog=,  ForwardToKMsg=,  ForwardToConsole=,  ForwardToWall=

7.11、MaxLevelStore=,  MaxLevelSyslog=,  MaxLevelKMsg=,  MaxLevelConsole=,  MaxLevelWall=

7.12、TTYPath

8、systemd-journald服务相关命令


 

1、systemd-journald和rsyslog相关概念

Linux中内建了一个基于Syslog协议的标准日志记录。

 

  1. systemd-journald.service: 记录与服务、开机引导有关的日志,服务在运行的时候才有相关的日志,它以二进制文件的形式保存在内存中,如果系统被重启或关机之后,systemd-journald.service保存的日志就没有了。

Linux 日志管理journald和rsyslog_第1张图片

  1. rsyslog.service:就是把 systemd-journald.service 保存的二进制日志内容,整理转换成文本文档,并且会保存在 /var/log 中。

Linux 日志管理journald和rsyslog_第2张图片

1.1、常见的日志分类

Linux 日志管理journald和rsyslog_第3张图片

dmesg:可以查看从系统引导到正常启动整个过程的硬件级别的日志

wtmpfaillog:登录时的正解或错误信息

lastlog:记录系统上所有账号最近一次登陆的信息

 

注意:

1、systemd-journald.service:这里的日志是没有分类的,分类是 rsyslog 干的事情。

2、日志文件内容,不要手动修改,如果修改了,rsyslog就不会再往该文件写入内容

 

系统日志格式(举例:/var/log/secure)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Yqq5Yqb5a2m5Lmg56C05aSp6I2S,size_20,color_FFFFFF,t_70,g_se,x_16

时间:日志产生(记录)的时间

servera:谁产生了这条日志(rsyslog可以记录远程主机的日志)

sshd[34039]:这个日志是由哪个用户及进程(或服务)产生的(标注用户名以及进程PID)

Accepted .. 65493 ssh2 :具体的日志事件

2、查看系统日志文件(日志记录设备和优先级)

许多程序使用syslog协议将事件记录到系统。每一条日志信息根据设备类型(消息的类型)和优先级(消息的严重性)分类。

2.1、日志设备

auth:pam(认证服务)产生的日志

authpriv:ssh,ftp等登录信息的验证信息

cron:计划任务相关

kern:内核

lpr:打印

mail:邮件

mark(syslog):rsyslog服务内部的信息,时间标识

news:新闻组

user:用户程序产生的相关信息

uucp:unix to unix copy, unix主机之间相关的通讯

local0~7:自定义的日志设备

 

2.2、日志优先级

0 emerg:内核崩溃等严重信息(默认定义会在所有终端上显示)

1 alert:需要立刻响应的信息

2 crit:严重级别,阻止整个系统或者整个软件不能正常工作的信息

3 err:错误级别,阻止某个功能或者模块不能正常工作的信息

4 warning:警告级别(比如使用一个软件,这个软件的某个功能在下一个版本中可能会被剔除,那么在当前版本中给你一个warning)

5 notice:最具有重要性的普通条件的信息(通知)

6 info:一般信息的日志,最常用

7 debug:调试信息,日志量最多

none:什么都不记录

*:代表所有级别

Linux 日志管理journald和rsyslog_第4张图片

Tips:从上到下,级别从高到低,记录的信息越来越多若定义了日志的等级是info,代表包含了info以及以上的所有等级事件日志都记录。如果是*.none,则不记录该服务的任何日志。

 

2.3、Rsyslog规则示例

其配置规则文件为/etc/rsyslog.conf 文件和/etc/rsyslog.d 目录下扩展名为.conf的任何文件。

Linux 日志管理journald和rsyslog_第5张图片

Linux 日志管理journald和rsyslog_第6张图片

2.4、手动发送syslog消息

logger命令可以发送消息到rsyslog服务。-p 参数 可以指定发送消息的设备类型和优先级,这对测试rsyslog服务配置更改很有用。

 

通过logger产生一条debug级别日志“ hello world”,推送到日志设备local7

# logger -p local7.notice "hello world"

Linux 日志管理journald和rsyslog_第7张图片

 

2.5、日志轮替

    logrotate工具会轮转日志文件,以防止/var/log/目录下的日志文件占用文件空间过多。

    相关配置文件:/etc/logrotate.conf(默认规则)

Linux 日志管理journald和rsyslog_第8张图片

Linux 日志管理journald和rsyslog_第9张图片

Linux 日志管理journald和rsyslog_第10张图片

注意:如果针对某个具体的日志文件定义了轮替规则,那么这个日志文件的轮替规则就会采用自己定义的轮替方式。

配置参数

说明

monthly

日志文件将按月轮循。其它可用值为'daily','weekly'或者'yearly'。

rotate 5

一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。

compress

在轮循任务完成后,已轮循的归档将使用gzip进行压缩。

delaycompress

总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。

missingok

在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。

notifempty

如果日志文件为空,轮循不会进行。

create 644 root root

以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。

postrotate/endscript

在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。

 

 

3、查看内存日志

systemd-journald服务将日志数据存储在带有索引的结构化二进制文件中,该文件称为日志。

 

要从上述日志中检索日志消息,使用journalctl命令。(普通用户可能会被限制查看某些消息)

 

3.1、查看内存日志

# journalctl

 

优先级为notice或warning的消息显示为粗体文本,而优先级为error或以上的消息则显示为红色文本。

 

3.2、显示最后n个日志条目

# journalctl -n 数字 (默认显示10个日志条目)

 

3.3、显示最后10个日志条目,并实时更新新写入的日志条目。

# journalctl -f   ( Ctrl + c 可退出)

 

3.4、根据日志条目的优先级过滤日志输出

 -p 参数后可接受优先级的名称或编号作为参数,显示该优先级别及以上的日志条目。

# journalctl -p err (显示err优先级别及以上的日志条目)

 

3.5、查看指定时间段的日志

#journalctl --since 时间 –until 时间

时间选项采用的格式为“ YYYY-MM-DD hh:mm:ss ” (必须使用双括号,以保留选项中的空格)

 

Tips:

  1. 如果省略日期,则命令会假定日期为当天;
  2. 如果省略时间,则命令假定为自00:00:00 起的一整天。
  3. 这两个选项还接受yesterday、today、tomorrow 作为有效的参数。

 

查看2021-01-21 13:00:00至今天的日志

# journalctl --since "2021-01-21 13:00:00" --until today

 

查看相对于当前时间之前一小时的日志

# journalctl --since "-1 hour"

 

3.6、从末尾查看内存日志,并加上注解

# journalctl -xe

 

3.7、显示从开机启动时起的内存日志,并加上注解

# journalctl -xb

3.8、查看日志条目详细字段信息

# journalctl -o verbose ( 显示包含所有字段的完整结构化条目项。)

 

常用字段:

_COMM是命令的名称

_EXE是进程的可执行文件的路径

_PID是进程的PID

_UID是运行该进程的用户UID

_SYSTEMD_UNIT 是启动该进程的systemd单元

 

查看PID为17341的所有日志条目

# journalctl _PID=17341

 

4、保存系统日志

默认情况下,系统日志保存在/run/log/journal 目录中,系统重启时这些日志会被清除。

 

如果需要将系统日志保存下来,则需要修改 /etc/systemd/journald.conf 文件中的Storage参数。

Storage参数可设为以下三个值:

  1. persistment: 将日志存储在 /var/log/journal 目录中,这可以在系统重启后持久保留。
  2. volatile:将日志存储在易失性/run/log/journal 目录中

因为/run 文件系统是临时的,仅存在于运行内存中,存储在其中的数据(包括系统日志)不会在系统重启后持续保留。

  1. auto: 默认参数,rsyslog决定要使用持久存储还是易失性存储。如果/var/log/journal 目录存在,那么rsyslog 会使用持久存储,否则使用易失性存储。

 

Linux 日志管理journald和rsyslog_第11张图片

 

  1. 将Storage=auto 修改为 persistent
  2. 重启systemd-journald服务

# systemctl restart systemd-journald

  1. 查看/var/log/journal目录下是否有文件(注意:systemd.journal不能直接被查看(因为是二进制文件),只能通过rsyslog 去分类读取。)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Yqq5Yqb5a2m5Lmg56C05aSp6I2S,size_20,color_FFFFFF,t_70,g_se,x_16

  1. 查看已保存的过往的内存日志:

# journalctl --list-boots

Linux 日志管理journald和rsyslog_第12张图片

# journalctl -b 文件名

 

5、lnav命令

Linux 日志管理journald和rsyslog_第13张图片

Linux 日志管理journald和rsyslog_第14张图片

 

6、rsyslog日志服务状态

# systemctl status rsyslog

 

7、配置文件(/etc/systemd/journald.conf)

7.1、Storage 在哪里存储日志文件:

  1. "volatile" 表示仅保存在内存中, 也就是仅保存在 /run/log/journal 目录中(将会被自动按需创建)。
  2. "persistent" 表示优先保存在磁盘上, 也就优先保存在/var/log/journal 目录中(将会被自动按需创建), 但若失败(例如在系统启动早期"/var"尚未挂载), 则转而保存在 /run/log/journal 目录中(将会被自动按需创建)。
  3. "auto"(默认值) 与 "persistent" 类似, 但不自动创建 /var/log/journal 目录, 因此可以根据该目录的存在与否决定日志的保存位置。
  4. "none" 表示不保存任何日志(直接丢弃所有收集到的日志), 但日志转发(见下文)不受影响。
  5. 默认值是 "auto"

7.2、Compress

  1. 默认值"yes"表示: 将大于特定阈值的对象存储到日志中时先压缩再存储。

7.3、Seal

  1. 默认值"yes"表示:如果存在一个"sealing key"(由 journalctl(1) 的 --setup-keys 命令创建), 那么就为所有持久保存的日志文件启用 FSS(Seekable Sequential Key Generators)保护, 以避免日志文件被恶意或无意的修改。

7.4、SplitMode

设置如何按用户分割日志文件,以实现不同的访问控制策略(日志守护进程会确保每个用户都能读取自己的日志文件)。 注意,仅分割持久保存的日志(/var/log/journal),内存中的日志永不分割(/run/log/journal)。

可以使用的分割策略如下:

  1. "uid" 表示每个用户都有自己专属的日志文件(无论该用户是否拥有登录会话), 但系统用户的日志依然记录到系统日志中。这是默认值。
  2. "none" 表示不对日志文件进行分隔,所有日志都将记录到系统日志中。 这意味着非特权用户根本无法读取属于自己的日志信息。

7.5、RateLimitIntervalSec 与RateLimitBurst

 

用于限制日志的生成速度(设为零表示不作限制)。

  1. RateLimitIntervalSec= 用于设置一个时间段长度,默认值是30秒。 
  2. RateLimitBurst= 用于设置一个正整数,表示消息条数,默认值是1000条。

含义是在 RateLimitIntervalSec= 时间段内, 每个服务最多允许产生 RateLimitBurst= 数量(条数)的日志。 在同一个时间段内,超出数量限制的日志将被丢弃,直到下一个时间段才能再次开始记录。 对于所有被丢弃的日志消息,仅用一条类似"xxx条消息被丢弃"的消息来代替。 这个限制是针对每个服务的限制,一个服务超限并不会影响到另一个服务的日志记录。

RateLimitIntervalSec= 可以使用下面的时间单位:"ms", "s", "min", "h", "us"

 

7.6、限制日志文件的大小上限。

SystemMaxUse=,  SystemKeepFree=,  SystemMaxFileSize=,  SystemMaxFiles=,  RuntimeMaxUse=,  RuntimeKeepFree=,  RuntimeMaxFileSize=,  RuntimeMaxFiles=

  1. 以 "System" 开头的选项用于限制磁盘使用量, 也就 /var/log/journal 的使用量。
  2. 以 "Runtime" 开头的选项用于限制内存使用量, 也就是 /run/log/journal的使用量。

tips:

  1. 以 "System" 开头的选项仅在 /var/log/journal 目录确实存在且可写时才有意义。 但以 "Runtime" 开头的选项永远有意义。 也就是说, 在系统启动早期 /var 尚未挂载时、 或者系统管理员禁止在磁盘上存储日志的时候, 仅有 "Runtime" 开头的选项有意义。 
  2. journalctl 与 systemd-journald 工具会忽略日志目录中所有 后缀名不等于 ".journal" 或 ".journal~" 的文件。 换句话说, 日志目录中不应该存在后缀名不等于 ".journal" 或 ".journal~" 的文件, 因为这些文件永远不会被清理。
  3. SystemMaxUse= 与 RuntimeMaxUse= 限制全部日志文件加在一起最多可以占用多少空间。
  4. SystemKeepFree= 与 RuntimeKeepFree= 表示除日志文件之外,至少保留多少空间给其他用途。
  5. systemd-journald 会同时考虑这两个因素, 并且尽量限制日志文件的总大小,以同时满足这两个限制。  SystemMaxUse= 与 RuntimeMaxUse= 的默认值是10%空间与4G空间两者中的较小者; 
  1. SystemKeepFree= 与 RuntimeKeepFree= 的默认值是15%空间与4G空间两者中的较大者; 如果在 systemd-journald 启动时, 文件系统即将被填满并且已经超了 SystemKeepFree= 或 RuntimeKeepFree= 的限制,那么日志记录将被暂停。 也就是说,如果在创建日志文件时,文件系统有充足的空闲空间, 但是后来文件系统被其他非日志文件过多占用, systemd-journald 只会立即暂停日志记录, 但不会删除已经存在的日志文件。
  2. SystemMaxFileSize= 与 RuntimeMaxFileSize= 限制单个日志文件的最大体积, 到达此限制后日志文件将会自动滚动。 默认值是对应的 SystemMaxUse= 与 RuntimeMaxUse= 值的1/8 , 这也意味着日志滚动默认保留7个历史文件。
  3. 日志大小的值可以使用以1024为基数的 K, M, G, T, P, E 后缀, 分别对应于 1024, 1024², ... 字节。
  4. SystemMaxFiles= 与 RuntimeMaxFiles= 限制最多允许同时存在多少个日志文件, 超出此限制后, 最老的日志文件将被删除, 而当前的活动日志文件不受影响。 默认值为100个。

7.7、MaxFileSec日志滚动的时间间隔

通常并不需要使用基于时间的日志滚动策略, 因为由 SystemMaxFileSize= 与 RuntimeMaxFileSize= 控制的基于文件大小的日志滚动策略 已经可以确保日志文件的大小不会超标。 默认值是一个月, 设为零表示禁用基于时间的日志滚动策略。 可以使用 "year", "month", "week", "day", "h", "m" 时间后缀, 若不使用后缀则表示以秒为单位。

7.8、MaxRetentionSec日志文件的最大保留期限

。当日志文件的最后修改时间超过此期限后将被删除。 默认值零表示不使用基于时间的日志删除策略。 通常并不需要使用基于时间的日志删除策略,因为由SystemMaxUse= 与 RuntimeMaxUse= 控制的基于文件大小的日志滚动策略 已经可以确保日志文件的大小不会超标。 可以使用 "year", "month", "week", "day", "h", "m" 时间后缀, 若不使用后缀则表示以秒为单位。

7.9、SyncIntervalSec

向磁盘刷写日志文件的时间间隔,默认值是五分钟。 刷写之后,日志文件将会处于离线(OFFLINE)状态。 注意,当接收到 CRIT, ALERT, EMERG 级别的日志消息后, 将会无条件的立即刷写日志文件。 因此此设置仅对 ERR, WARNING, NOTICE, INFO, DEBUG 级别的日志消息有意义。

7.10、ForwardToSyslog=,  ForwardToKMsg=,  ForwardToConsole=,  ForwardToWall=

  1. ForwardToSyslog= 表示是否将接收到的日志消息转发给传统的 syslog 守护进程,默认值为"no"。 如果设为"yes",但是没有任何进程监听对应的套接字,那么这种转发是无意义的。 此选项可以被内核命令行选项"systemd.journald.forward_to_syslog="覆盖。 
  2. ForwardToKMsg= 是否将接收到的日志消息转发给内核日志缓冲区(kmsg),默认值为"no"。 此选项可以被内核命令行选项"systemd.journald.forward_to_kmsg="覆盖。
  3. ForwardToConsole= 是否将接收到的日志消息转发给系统控制台,默认值为"no"。 如果设为"yes",可以通过下面的 TTYPath= 选项指定转发目标。 此选项可以被内核命令行选项"systemd.journald.forward_to_console="覆盖。 
  4. ForwardToWall= 是否将接收到的日志消息作为警告信息发送给所有已登录用户,默认值为"yes"。 此选项可以被内核命令行选项"systemd.journald.forward_to_wall="覆盖。

 

7.11、MaxLevelStore=,  MaxLevelSyslog=,  MaxLevelKMsg=,  MaxLevelConsole=,  MaxLevelWall=

  1. MaxLevelStore= 设置记录到日志文件中的最高日志等级,默认值为"debug"; 
  2. MaxLevelSyslog= 设置转发给传统的 syslog 守护进程的最高日志等级,默认值为"debug"; 
  3. MaxLevelKMsg= 设置转发给内核日志缓冲区(kmsg)的最高日志等级,默认值为"notice"; 
  4. MaxLevelConsole= 设置转发给系统控制台的最高日志等级,默认值为"info"; 
  5. MaxLevelWall= 设置作为警告信息发送给所有已登录用户的最高日志等级,默认值为"emerg"; 这些选项的值可以设置为日志等级的名称, 也可以设置为日志等级的数字: "emerg"(0), "alert"(1), "crit"(2), "err"(3), "warning"(4), "notice"(5), "info"(6), "debug"(7) 。 所有高于设定等级的日志消息都将被直接丢弃, 仅保存/转发小于等于设定等级的日志消息。

7.12、TTYPath

指定 ForwardToConsole=yes 时所有使用的控制台TTY, 默认值是 /dev/console

 

8、systemd-journald服务相关命令

# systemctl status systemd-journald

 

 

 

你可能感兴趣的:(Linux基础,linux,centos)