【systemd系列】journal日志管理

本文适用于所有使用systemd的Linux发行版,如Debian、Ubuntu、Fedora、CentOS、openSUSE等。

systemd是Linux操作系统之下的一套init程序和基础组件集合,其目标替代传统的System VBSD风格init程序。systemd支持并行启动服务,并能减少在shell上的系统开销,相比传统的init是一大革新,已被大多数Linux发行版所使用。

按照约定,Linux Kernel加载执行的第一个用户空间程序是/sbin/init,它的进程ID是1,在使用systemd的系统上,/sbin/init是一个软链接,指向/lib/systemd/systemd

Systemd 是一系列组件的集合,包括热插拔设备管理(udevd)、域名解析(resolved)、时间同步(timesyncd)、日志管理(journald)等。本文介绍一下日志管理。

在计算机远古时代,日志往往被分散在整套系统当中,由不同的守护进程及进程负责处理,很难跨越多种应用程序对其内容进行解读。systemd尝试提供一套集中化管理方案,从而统一打理全部内核及用户级进程的日志信息。这套系统能够收集并管理日志内容,而这也就是我们所熟知的Journal系统。Journal的实现归功于journald守护进程,其负责处理由内核、initrd以及服务等产生的信息。

首先,使用systemctl命令确认systemd-journald服务正常工作:

$ systemctl status systemd-journald.service 

然后,我们就可以使用journalctl命令来查看systemd-journald服务所记录的日志数据。

如果不带任何参数,journalctl命令将输出所有日志,日志按Page展示,我们可以一页页翻看查找感兴趣的内容。

Tips:如果我们不希望按Page方式展示,而是希望它一股脑地全dump出来,那么可以使用--no-pager参数,还支持按Json格式输出哟。

  • 查看内核日志

    journalctl -k
    
  • 查看某次启动的日志

    journalctl -b        # 等价于 journalctl -b 0,查看最后一次启动的日志
    journalctl -b  -1    # 查看上一次启动的日志
    

    Tips:使用journalctl --list-boots命令可以查看启动记录。

  • 跟踪实时日志

    journalctl -f
    

为了提高效率,journalctl还支持日志过滤,可以按照FIELD=VALUE格式进行匹配(可以同时添加多个不同字段进行过滤,它们之间是逻辑与的关系)。

  • 查看内核日志

    journalctl -k
    
  • 查看某次启动的日志

    journalctl -b        # 等价于 journalctl -b 0,查看最后一次启动的日志
    journalctl -b  -1    # 查看上一次启动的日志
    

    Tips:使用journalctl --list-boots命令可以查看启动记录。

  • 跟踪实时日志

    journalctl -f
    
  • 按时间进行过滤

    可以利用–since–until参数设定时间段,时间表示方式支持多种格式。对于绝对时间值,可以使用YYYY-MM-DD HH:MM:SS格式。

    示例1:查看2015年1月10日17:15之后的日志:

    journalctl --since "2015-01-10 17:15:00"
    

    如果以上格式中的某些组成部分未填写,系统会填充默认值:如果日期部分未填写,则默认填充当前日期;如果时间部分未填写,则缺省使用00:00:00

    示例2:查看2015年1月10日00:00~03:00之间的日志

    journalctl --since "2015-01-10" --until "2015-01-11 03:00"
    

    另外,journal还能理解相对值及命名简写,如“yesterday”、“today”、“tomorrow”或者“now”等表达。另外,我们也可以使用“-”或者“+”设定相对值,或者使用“ago”之前的表达。

    示例3:查看最近一个小时的日志

    journalctl --since "1 hour ago"
    
  • 按服务/组件名称进行过滤

    参考man journalctl的信息,journalctl -ujournalctl _SYSTEMD_UNIT=是过滤某个systemd unit的日志,这里的unit就是systemctl list-units看到的那些服务。比如:

    journalctl -u docker.service        # 过滤docker运行日志(所有历史日志)
    journalctl _SYSTEMD_UNIT=udisks2.service
    
  • 按进程ID进行过滤

    journalctl _PID=5755
    

    也可以结合pidof命令,过滤当前正在运行的某个进程的日志,比如:

    journalctl _PID=$(pidof dockerd)
    
  • 按用户ID进行过滤

    journalctl _UID=1000
    

除了查看日志,journalctl还有其他一些用途:

  • 查看系统启动记录

    journalctl --list-boots 
    
  • 查看日志占用的硬盘空间

    journalctl --disk-usage
    
  • 清理日志

    journalctl --vacuum-size=1G        # 仅保留1GB大小的日志,按时间顺序滚动删除
    journalctl --vacuum-time=1years    # 仅保留近1年的日志
    

    Tips:可通过/etc/systemd/journald.conf配置文件来管理systemd-journald服务的行为。

参考资料:

  • 34
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值