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以更加规范,统一的格式存储来自内核、驱动、应用等日志消息,能够帮助用户调试应用,以及事后分析系统运行状态,为定位问题提供信息。一般情况下都建议用户保留日志功能。
请登录后查看评论内容