OpenWRT(15):ubox下的日志管理logd/logread
logd搜集日志,保存在缓存中。通过ubus提供给logrread读取。logd/logread和ubus/ubusd大致架构如下:
1 logd
1.1 logd主要作用
logd是 OpenWrt 系统中的日志守护进程,它负责处理系统产生的日志消息。logd的主要作用包括日志的收集、过滤、存储和转发。以下是logd的一些详细功能和作用:
1. 日志收集:logd监听系统日志消息,这些消息可能来自系统守护进程、应用程序或其他内核组件。它使用系统日志机制(如syslog协议)来接收日志消息。
2. 日志过滤:logd可以根据日志级别、消息内容或其他标准对日志消息进行过滤。可以配置logd以忽略某些日志消息或只关注特定类型的日志。
3. 日志存储:logd通常在内存中维护一个循环缓冲区来存储最近的日志消息。虽然logd本身不直接将日志持久化到存储设备,但它可以通过配置将日志消息转发给其他服务,如syslogng或rsyslog,这些服务可以将日志保存到文件中。
4. 实时日志查看:logd提供实时日志查看功能,允许用户和应用程序实时获取系统日志。这对于监控系统状态和调试问题非常有用。
5. 日志转发:logd可以将日志消息转发到其他日志服务器或日志收集系统,如集中日志管理系统。这种转发功能使得在大型网络或分布式系统中集中管理和分析日志成为可能。
6. 日志通知:logd可以配置为在特定日志事件发生时发送通知,例如通过电子邮件、SNMP 陷阱或其他机制。
7. 与ubus集成:logd与 OpenWrt 的统一 bus(ubus)紧密集成,允许通过ubus接口进行日志管理。通过ubus,用户和应用程序可以查询日志、配置日志策略和接收日志事件。
8. 安全性:logd可以配置为只允许特定用户或服务访问日志信息,从而提高系统的安全性。
9. 性能优化:logd针对嵌入式系统和资源受限的环境进行了优化,以高效地处理日志消息,减少对系统资源的占用。
10. 灵活性和可扩展性:logd提供了丰富的配置选项和 API,使其可以根据不同的需要进行定制和扩展。
总的来说,logd是 OpenWrt 系统中一个关键的组件,它不仅提供了基本的日志处理功能,还通过与ubus的集成提供了高级的日志管理和分析能力。这使得logd成为 OpenWrt 系统日志架构的核心部分。
1.2 logd代码
main
uloop_init
log_init
log_buffer_init
syslog_open--打开/dev/log,并监控read。
syslog_handle_fd
recv
log_add
klog_open--打开/proc/kmsg。读取内核log。
ustream_fd_init
klog_cb--当关联的文件描述符有数据可读时调用。
ustream_get_read_buf
log_add
ustream_consume
openlog--用于打开系统日志的函数。用于初始化日志记录过程,配置日志消息的发送方式,并且通常在程序开始时被调用。
ubus_auto_connect--用于自动连接到 ubus。它初始化一个ubus_context
,然后尝试连接到 ubus。如果连接失败,它会在后台周期性地重试连接,直到连接成功或程序退出。
ubus_connect_handler--连接回调函数,当连接成功或失败时被调用。
uloop_run--循环读取/dev/log和/proc/kmsg中内容,写入到初始化的缓存中。
logd提供ubus服务:读写log。
static const struct ubus_method log_methods[] = {
UBUS_METHOD("read", read_log, read_policy),--解析请求参数,然后根据这些参数从日志缓冲区中提取相应的日志条目,并通过ubus
响应发送回去。
{ .name = "write", .handler = write_log, .policy = &write_policy, .n_policy = 1 },--接收一个日志条目,将其添加到内部日志存储系统(如环形缓冲区),并可能将其输出到标准输出或文件。
};
static struct ubus_object_type log_object_type =
UBUS_OBJECT_TYPE("log", log_methods);
static struct ubus_object log_object = {
.name = "log",
.type = &log_object_type,
.methods = log_methods,
.n_methods = ARRAY_SIZE(log_methods),
};
查看logd支持的ubus调用:
ubus -v list log 'log' @dccb40cb "read":{"lines":"Integer","stream":"Boolean","oneshot":"Boolean"} "write":{"event":"String"}
使用ubus写logd内容:
ubus call log write '{"event": "Hello, log!"}'
使用ubus读logd内容:
ubus call log read '{"lines":1, "stream":false, "oneshot":false} ' { "log": [ { "msg": "Hello, log!", "id": 229, "priority": 0, "source": 1, "time": 1725873662198 } ] }
2 logread
2.1 logread作用
logread用于从logd 服务中读取日志。它提供了一个命令行界面,允许用户检索和查看系统日志。以下是logread的一些主要作用和特点:
1. 实时日志查看:- 用户可以使用logread实时查看系统日志消息,这对于监控系统状态和调试问题非常有用。
2. 历史日志检索:-logread允许用户检索和查看一定时间内的日志历史记录,而不仅仅是实时日志。
3. 日志过滤:- 用户可以通过logread使用不同的过滤选项来筛选特定的日志消息,例如按日志级别、消息内容或时间范围过滤。
4. 简洁的用户界面:-logread提供了一个简单易用的命令行界面,用户可以通过命令行参数来控制日志的读取行为,如设置日志数量、启用跟随模式等。
5. 与ubus集成:-logread通过 OpenWrt 的统一 bus(`ubus`)与logd服务进行通信,这使得日志的读取操作更加高效和灵活。
6. 日志监控:- 用户可以使用logread以跟随模式运行,实时监控新的日志消息,这对于实时跟踪系统事件和快速响应问题很有帮助。
7. 日志分析:- 虽然logread主要用于日志的读取和查看,但它也可以作为日志分析工具的输入源,帮助用户进行更深入的日志分析。
8. 跨平台兼容性:-logread旨在与 OpenWrt 系统兼容,但它也可以在其他基于 Linux 的系统上使用,只要这些系统实现了类似的logd服务和ubus机制。
9. 脚本和自动化:-logread可以被集成到脚本和自动化工具中,以实现自动化的日志监控和处理。
10. 轻量级和高效:-logread被设计为轻量级且高效,适合在资源受限的嵌入式设备上运行。
总的来说,logread是 OpenWrt 系统中一个重要的日志查看工具,它提供了实时和历史日志的检索、过滤和监控功能,帮助用户更好地理解和管理他们的系统。
2.2 logread使用
Usage: logread [options] Options: -s <path> Path to ubus socket -l <count> Got only the last 'count' messages--只获取最后count
条日志消息。 -e <pattern> Filter messages with a regexp--使用正则表达式pattern
来过滤日志消息。 -r <server> <port> Stream message to a server--将日志消息流式传输到指定的server
和port
。 -F <file> Log file--将日志消息输出到指定的file
文件中。 -S <bytes> Log size--设置日志缓冲区的大小为KB
。 -p <file> PID file -h <hostname> Add hostname to the message--在日志消息中添加主机名hostname
。 -P <prefix> Prefix custom text to streamed messages--为流式传输的日志消息添加自定义的前缀prefix
。 -z <facility> handle only messages with given facility (0-23), repeatable--只处理具有指定facility
的日志消息。设施是一个从0到23的数字,表示日志消息的来源类别。此选项可以重复使用,以指定多个设施。 -Z <facility> ignore messages with given facility (0-23), repeatable--忽略具有指定设施facility
的日志消息。这与-z
选项相反,用于过滤掉不需要的日志消息。 -f Follow log messages--跟随日志消息。这个选项会让logread
持续运行,实时显示新的日志消息。 -u Use UDP as the protocol--使用 UDP 协议进行通信。 -t Add an extra timestamp--在日志消息中添加额外的时间戳。 -0 Use \0 instead of \n as trailer when using TCP
2.3 logread转发到rsyslogd/syslog-ng