Linux Journald日志系统

By Toradex 胡珊逢

[title]简介[/title]

长久以来 syslog 是每一个 Unix 系统中的重要部件。在漫长的历史中在各种 Linux 发行版中都有不同的实现去完成类似的工作,它们采取的是逻辑相近,并使用基本相同的文件格式。但是 syslog 也存在诸多的问题,随着新设备的出现以及对安全的重视,这些缺点越发显得突出,例如日志消息内容无法验证、数据格式松散、日志检索低效、有限的元数据保存、无法记录二进制数据等。

 

Journald是针对以上需求的解决方案。受udev事件启发,Journal 条目与环境组块相似。一个键值域,按照换行符分开,使用大写的变量名。除了支持ASCII 格式的字符串外,还能够支持二进制数据,如 ATA SMART 健康信息、SCSI 数据。应用程序和服务可以通过将项目域传递给systemd journald服务来生成项目。该服务可以为项目增加一定数量的元数据。这些受信任域的值由 Journal 服务来决定且无法由客户端来伪造。在Journald中,可以把日志数据导出,在异地读取,并不受处理器架构的影响。这对嵌入式设备是很有用的功能,方便维护人员分析设备运行状况。

 

Toradex从V2.0 Linux BSP 开始,使用Journald作为默认的日志管理系统。下面将基于Toradex Colibri iMX6DL ARM嵌入式平台介绍Journald的基本使用方法,这个平台是基于NXP iMX6系列ARM处理器,支持双核心Cortex-A9。

 

[title]配置[/title]

a). 在使用日志之前,我们需要设置好系统的时间,便于后面按时间查找。Toradex默认 BSP 使用 UTC 时区,通过下面命令设置中国时区。因为 BSP 编译的时候并没有将时区数据添加进来,所以需要把模块联网,在线安装。

root@colibri-imx6:~# opgk update

root@colibri-imx6:~# root@colibri-imx6:~# opkg install tzdata-asia

root@colibri-imx6:~# timedatectl set-timezone Asia/Shanghai

 

root@colibri-imx6:~# timedatectl

Local time: Sat 2017-05-27 10:34:59 CST

Universal time: Sat 2017-05-27 02:34:59 UTC

RTC time: Sat 2017-05-27 02:34:59

Time zone: Asia/Shanghai (CST, +0800)

Network time on: yes

NTP synchronized: yes

 

b). Journald使用journalctl工具读取日志,默认参数下显示所有日志内容。

root@colibri-imx6:~# journalctl

— Logs begin at Thu 2017-05-25 13:03:26 CST, end at Sat 2017-05-27 10:34:52 CST. —

May 25 13:03:26 colibri-imx6 systemd-journald[171]: Time spent on flushing to /var is 312.683ms for 301 entries.

May 25 13:03:26 colibri-imx6 journalctl[204]: Got message type=method_return sender=n/a destination=n/a object=n/a interface=n/a

member=n/a cookie=3 reply_cookie=1 error=n/a

May 25 13:03:26 colibri-imx6 udevadm[207]: calling: trigger

……

 

c). 查看  2017-05-27 09:37:00 到  2017-05-27 10:47:00 之间日志。

root@colibri-imx6:~# journalctl –since “2017-05-27 09:37:00” –until “2017-05-27 10:47:00”

 

d). 查看重启的记录。

root@colibri-imx6:~# journalctl –list-boots

-17 e3416bec4326422bbc2271baf67caaf3 Thu 2017-05-25 13:16:44 CST—Thu 2017-05-25 13:17:17 CST

-16 573073b2515b4751b0205ded156984d7 Thu 2017-05-25 13:17:28 CST—Thu 2017-05-25 13:33:27 CST

……

-4 e80be8c90ec842b19b1590c70c4665ba Fri 2017-05-26 15:11:27 CST—Fri 2017-05-26 16:27:57 CST

-3 f561b1efea1e457bb43d7a0bf4958809 Sat 2017-05-27 09:35:13 CST—Sat 2017-05-27 09:38:03 CST

-2 792db153b94f49998533e0a9b9a522a2 Sat 2017-05-27 09:38:15 CST—Sat 2017-05-27 10:52:57 CST

-1 a7ff749ec1974aae918212f677ac692e Sat 2017-05-27 10:53:09 CST—Sat 2017-05-27 10:54:12 CST

0 c7fc347a54984918ade11928491dd5f8 Sat 2017-05-27 10:54:22 CST—Sat 2017-05-27 10:56:15 CST

 

 

e). 查看上一次启动以来的日志,根据上面的记录,也可以选择其他重启以来的日志。

root@colibri-imx6:~# journalctl -b -1

 

f). 查看最新的日志

root@colibri-imx6:~# journalctl -r

 

g). 查看严重等级为错误的日志

root@colibri-imx6:~# journalctl -p err

 

h). 查看指定应用日志

root@colibri-imx6:~# journalctl -t sshd

— Logs begin at Thu 2017-05-25 13:16:44 CST, end at Sat 2017-05-27 11:14:24 CST. —

May 25 13:19:06 colibri-imx6 sshd[635]: Accepted none for root from 192.168.31.202 port 59948 ssh2

May 25 13:19:06 colibri-imx6 sshd[635]: pam_unix(sshd:session): session opened for user root by (uid=0)

May 25 13:19:06 colibri-imx6 sshd[635]: Received disconnect from 192.168.31.202 port 59948:11: disconnected by user

……

 

i). Journald将日志文件存储在 /var/log/journal/。日志以循环滚动的方式存储到二进制文件中,所以这里的文件无法直接查看。日志系统默认最大占用 16MB 空间,你可以修改 /etc/systemd/journald.conf文件重新配置Journald。将该目录下的文件复制到其他支持Journald的系统(X86 PC 或者 ARM Linux 设备),通过可以通过journalctl命令查看,使用 -D 参数指定日志文件目录

ben@LinuxDev:~$ journalctl -D ~/log/journal/880c7cfadf73453691af3a6c4c951a39

 

j). 使用 logger 工具,可以直接将信息传入到Journald中,-p 参数指定服务名称,和日志级别

root@colibri-imx6:~# logger -p user.info “log test with logger”

root@colibri-imx6:~# journalctl -r

— Logs begin at Thu 2017-05-25 13:16:44 CST, end at Sat 2017-05-27 11:28:21 CST. —

May 27 11:28:21 colibri-imx6 root[656]: log test with logger

May 27 11:14:24 colibri-imx6 connmand[266]: eth0 {del} route 82.165.8.211 gw 10.42.0.1 scope 0 <UNIVERSE>

 

k). 在代码中,sd_journal_print函数也可以实现同样的功能。

#include <systemd/sd-journal.h>

#include <stdio.h>

 

intmain(intargc, char *argv[])

{

sd_journal_print(LOG_ERR, “An error message.”);

sd_journal_print(LOG_WARNING, “A warning.”);

sd_journal_print(LOG_INFO, “Some information: %d”, 1001);

sd_journal_print(LOG_DEBUG, “A debug message.”);

 

return 0;

}

 

[title] 总结[/title]

Journald以更加规范,统一的格式存储来自内核、驱动、应用等日志消息,能够帮助用户调试应用,以及事后分析系统运行状态,为定位问题提供信息。一般情况下都建议用户保留日志功能。

温馨提示: 本文最后更新于2019-05-17,至今已有2050天,某些文章具有时效性,若有错误或已失效,请在下方留言
© 版权声明
THE END
喜欢就支持一下吧❀
点赞0投币 分享
评论 抢沙发

    请登录后查看评论内容