目录
四、journalctl和/var/log/messages查到的日志有什么区别
一、前言
说起 journald 其实它还有另一种叫法systemd-journald,它是systemd项目的一个组成部分,是一个内建的日志管理服务。由于 systemd 是这个服务的上下文环境,所以在提到该服务时,通常会结合在一起称之为 systemd-journald 所以在聊起journald不得不先提一下systemd
二、systemd的主要组成
1.系统和服务管理器
这是systemd的核心部分,它负责启动和管理系统服务。systemd支持并行启动系统服务,使用套接字和D-Bus激活来启动服务,按需启动守护程序,利用Linux控制组监视进程,以及实现基于事务依赖关系的服务控制逻辑。
2.资源限制
systemd通过配置文件(如system.conf和user.conf)以及系统单元目录(如/etc/systemd/system、/usr/local/lib/systemd/system和/usr/lib/systemd/system)和用户单元目录(如/etc/systemd/user和/usr/lib/systemd/user)来实现资源的限制和管理。
3.环境限制
systemd可以限制和控制系统的环境,包括执行进程的环境变量、工作目录、用户、组等。
4.日志记录守护程序
systemd包含一个日志记录守护程序,用于记录系统事件和服务状态,方便进行故障排查和系统监控。通常指的是systemd-journald 。它是 systemd 的核心组件之一,负责收集、存储和管理系统的日志信息。也就是我们今天的要聊的主角 journald
5.支持SysV和LSB初始化脚本
systemd可以兼容并替代传统的SysVinit初始化系统,支持SysV和LSB(Linux Standard Base)初始化脚本。
6.其他
此外,systemd还支持许多其他功能,如快照和系统恢复、维护挂载点和自动挂载点、各服务间基于依赖关系的精密控制等。这些功能使得systemd成为了一个强大而灵活的系统和服务管理器,可以大大提高Linux系统的稳定性和可维护性。
二、journald 能做什么
1.收集日志
systemd-journald
从各种来源收集日志,包括内核、系统服务、用户进程等。
2.结构化日志
与传统的文本日志不同,systemd-journald
支持结构化日志,即日志条目包含额外的元数据,如时间戳、进程ID、用户ID等。
3.持久化存储
systemd-journald
将日志存储在磁盘上,即使系统重启也不会丢失。默认没开启
4.实时查看日志
通过 journalctl
命令,用户可以实时查看或搜索日志。journalctl
会与 systemd-journald
通信,获取所需的日志条目,并将其显示给用户。
5.灵活的过滤与搜索
用户可以基于时间、进程、用户、优先级等条件过滤和搜索日志。
6.日志轮换
systemd-journald
支持日志轮换,即自动将旧的日志移到归档目录,并创建新的日志文件。
7.压缩和加密
为了节省空间,systemd-journald
支持压缩旧的日志。此外,它还可以加密日志,以保护日志内容的安全。
三、journalctl 详解
1.工作原理
journalctl
是systemd
服务管理器提供的系统日志管理工具。它默认查找的二进制文件存储在/run/log/journal
目录或者/var/log/journal
目录下。这些二进制文件包含了日志数据,并以带有索引的结构化形式保存。
2.配置文件路径
journal配置文件默认路径 /etc/systemd/journald.conf
3.中文命令手册
journalctl [选项...] [匹配项...]
查询日志。
选项:
--system 显示系统日志
--user 显示当前用户的用户日志
-M --machine=CONTAINER 对本地容器进行操作
-S --since=DATE 显示不早于指定日期的条目
-U --until=DATE 显示不晚于指定日期的条目
-c --cursor=CURSOR 从指定的游标开始显示条目
--after-cursor=CURSOR 显示指定游标之后的条目
--show-cursor 在所有条目后打印游标
--cursor-file=FILE 显示文件中游标后的条目并更新文件
-b --boot[=ID] 显示当前启动或指定的启动
--list-boots 显示有关记录启动的简洁信息
-k --dmesg 显示当前启动的内核消息日志
-u --unit=UNIT 显示指定单元的日志
--user-unit=UNIT 显示指定用户单元的日志
-t --identifier=STRING 显示具有指定syslog标识符的条目
-p --priority=RANGE 显示具有指定优先级的条目
--facility=FACILITY... 显示具有指定设施的条目
-g --grep=PATTERN 显示与PATTERN匹配的MESSAGE的条目
--case-sensitive[=BOOL] 强制进行大小写敏感或不敏感的匹配
-e --pager-end 在分页器中立即跳到末尾
-f --follow 跟踪日志
-n --lines[=INTEGER] 要显示的日志条目数量
--no-tail 即使在跟踪模式下也显示所有行
-r --reverse 先显示最新的条目
-o --output=STRING 改变日志输出模式 (short, short-precise,
short-iso, short-iso-precise, short-full,
short-monotonic, short-unix, verbose, export,
json, json-pretty, json-sse, json-seq, cat,
with-unit)
--output-fields=LIST 在verbose/export/json模式下选择要打印的字段
--utc 以协调世界时(UTC)表示时间
-x --catalog 在可用的地方添加消息解释
--no-full 缩略字段
-a --all 显示所有字段,包括长和不可打印的
-q --quiet 不显示信息消息和权限警告
--no-pager 不将输出管道输出到分页器
--no-hostname 抑制主机名字段的输出
-m --merge 显示所有可用日志的条目
-D --directory=PATH 显示来自目录的日志文件
--file=PATH 显示日志文件
--root=ROOT 在根目录下操作文件
--namespace=NAMESPACE 显示指定命名空间的日志数据
--interval=TIME 更改FSS密封键的时间间隔
--verify-key=KEY 指定FSS验证键
--force 使用--setup-keys覆盖FSS密钥对
命令:
-h --help 显示此帮助文本
--version 显示包版本
-N --fields 列出当前使用的所有字段名称
-F --field=FIELD 列出指定字段采取的所有值
--disk-usage 显示所有日志文件的总磁盘使用量
--vacuum-size=BYTES 将磁盘使用量减少到指定大小以下
--vacuum-files=INT 只保留指定数量的日志文件
--vacuum-time=TIME 删除早于指定时间的日志文件
--verify 验证日志文件的一致性
--sync 将未写入的日志消息同步到磁盘
--relinquish-var 停止记录到磁盘,记录到临时文件系统
--smart-relinquish-var 类似,但如果日志目录在根挂载上,则无操作
--flush 将所有日志数据从 /run 刷新到 /var
--rotate 请求立即旋转日志文件
--header 显示日志头信息
--list-catalog 在目录中显示所有消息ID
--dump-catalog 显示消息目录中的条目
--update-catalog 更新消息目录数据库
--setup-keys 生成新的FSS密钥对
有关详细信息,请参阅 journalctl(1) 手册页。
4.实战场景下的运用
a.查看某个服务的日志(高频使用)
journalctl -u 服务名称
例子:查看sshd服务的日志
b.快速定位报错日志并给出相关上下文解释(高频使用)
journalctl -xe
-x 选项:这个标志让 journalctl 输出时包含额外的调试信息,特别是当有错误发生时,会尝试展示可能与错误相关的详细上下文和解释文本。
-e 选项:该选项指示 journalctl 跳转到日志文件的结尾(end),并继续显示新的日志条目,直到用户停止命令或没有更多新日志为止。它通常用来实时监控系统当前正在发生的事件。
当出现报错时,一个必不可少的命令。
c.查看某个时间段的日志(高频使用)
#查询2024年2月21日早上9点到10点的日志
journalctl --since "2024-02-21 09:00:00" --until "2024-02-21 10:00:00"
d.实时跟踪日志(高频使用)
journalctl -f
一般直接开两个终端,一个调试复现问题一个追踪日志。效果极佳
e.查看某一个进程今天的日志(排故障必备)
#先拿到进程的PID,再根据PID拿该进程今天的日志。下面以dockerd进程为例
ps -ef | grep docker 先看个大概主要是找准进程拿PID(第二列就是PID值,熟悉的直接awk 出来)
journalctl _PID=上面拿到的第PID --since today
四、journalctl和/var/log/messages查到的日志有什么区别
1.访问方式不同
journalctl是直接访问一个二进制的文件,文件存放位置默认在/run/log/journal目录下,不过也有的在/var/log/journal目录下。而/var/log/messages是访问了一个文本文件。
2.可读性不同
一个二进制文件本身就是为了让机器更容易阅读,同时可以记录结构化的日志,记录的信息更加丰富,细节更加准确。但正常人类是无法阅读的,所以出现了journalctl这个工具可以将复杂的二进制文件内容转化为人类易读的内容(太强了)。而/var/log/messages是传统的系统日志文件之一,以文本的方式去记录系统启动后的各种消息和事件,所以本身就十分适合人类去阅读。还可以直接编辑这个文件。
3.使用场景略有不同
由于journalctl可以记录结构化日志,这本身是/var/log/messages一个文本存储不具备的能力。所以前者对于细节可以记录的更加详细,配合它强大的过滤能力(基于时间,进程,用户,优先级等)具备快速筛选定位故障的能力。而/var/log/messages主要记录一些事件告警等,虽然也能通过(grep,sed,awk等方法筛选)很麻烦不推荐,更多的应用场景在应用监控告警方面,日志记录的详细程度不如journalctl 。
4.出现的时间不同
/var/log/messages (历史悠久的syslog体系的一部分,目前与journalctl是共存的关系)
这个文件在传统的 syslog 体系结构中是一个非常重要的系统日志文件,用于存储来自各种守护进程和服务的非安全相关的消息。它包含了系统的启动信息、服务运行状态、错误和警告等。
Syslog 是一个历史悠久的日志协议和守护程序,在没有 systemd 的早期 Linux 发行版以及类 Unix 操作系统中广泛应用。
journalctl (新一代,可以简单的理解为Centos7之后linux发行版都已经集成了)
journalctl是随着 systemd 在 Linux 内核管理中的引入而出现的新一代日志工具。当 CentOS 7 开始采用 systemd 后,journalctl 成为了查看和管理由 systemd-journald 收集的系统日志的标准工具。但这并不意味着 syslog 不再存在或不再使用,实际上很多情况下,systemd-journald 会与 syslog 共存,甚至可以配置为将部分日志信息通过 syslog 协议发送出去。
五、总结
综上所述,在采用 systemd 的现代 Linux 发行版中,journalctl
已经成为管理和查看系统日志的主要手段,提供了更为全面和灵活的功能,而 /var/log/messages
则是基于 syslog 的传统日志文件,两者在功能和实现上有显著差异。默认情况下,systemd
的日志会在每次系统重启后被覆盖。因此,如果你需要保留旧的日志信息,你需要配置systemd
以在不同的方式下处理这些日志。不多说了,铁粉看到这里肯定已经点赞收藏关注了,借鉴了很多优秀的文章以及把AI都快问傻了。我要继续肝帕鲁去了!!!