本文约2300字,昨天应主任要求修改AX615的日志文件的大小(爱芯用于调试内核和系统的日志文件)限制,从默认的5M改为128K,因为内存实在太过紧张。顺便系统地梳理下这套日志机制。在嵌入式 Linux 开发中,日志系统是定位内核异常、调试应用程序的核心抓手。而基于 BusyBox 构建的嵌入式系统,通常自带一套轻量日志服务 ——syslogd与klogd,两者分工协作,完成内核与用户态日志的采集、转发与持久化。本文将从工作原理、配置方法到高级用法,一起来彻底搞懂这套嵌入式日志系统。
我建了一个BSP学习交流群,想学BSP或者已经是BSP开发者可私信我,加入群,一起交流学习,共同进步。
关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。
一 核心角色分工:syslogd 与 klogd 的职责边界
BusyBox 的日志系统采用 “双进程协作” 模式,两者配合完成全链路日志处理,职责划分清晰:

[1]. klogd:内核日志的 “搬运工”
Linux 内核运行过程中,会将日志写入内核环形缓冲区(/proc/kmsg),但内核本身无法直接将日志写入文件。klogd的作用就是读取该缓冲区中的日志,转发给syslogd进行后续处理,是内核日志与用户态日志系统之间的桥梁。
klogd通常由启动脚本/etc/init.d/S02klogd启动,默认会将所有内核日志转发给syslogd,无需额外配置即可工作。
[2]. syslogd:日志系统的 “总调度”
syslogd是 BusyBox 日志系统的核心进程,负责接收所有来源的日志,根据配置规则进行过滤、分发与持久化:
接收klogd转发的内核日志;
接收用户态应用通过syslog()系统调用输出的日志(如crond、ftp等服务日志);
根据/etc/syslog.conf配置文件,将不同类型的日志写入不同文件,或输出到控制台。
syslogd由启动脚本/etc/init.d/S01syslogd启动,是整个日志系统的入口进程。
二 核心配置文件:syslog.conf 解析
/etc/syslog.conf是syslogd的配置文件,决定了不同类型日志的存储路径与分发规则。配置文件的语法遵循经典的 “设施。优先级 目标” 格式,示例如下:
.conf
# 设施.优先级 目标文件路径kern.* /opt/data/AXSyslog/kernel/kernel.loguser.* /opt/data/AXSyslog/kernel/user.logauth.* /var/log/auth.logdaemon.* /var/log/daemon.log*.emerg *
[1]. 设施(Facility):日志的来源分类
设施用于标识日志的产生来源,常见的设施包括:
kern:内核日志,对应klogd转发的内核消息;
user:用户态应用日志,非系统服务的用户进程输出;
auth:认证相关日志(如登录、权限校验);
daemon:系统守护进程日志(如crond、syslogd自身);
ftp:FTP 服务日志;
cron:定时任务服务日志。
[2]. 优先级(Priority):日志的严重级别
优先级表示日志的严重程度,从低到高依次为:debug < info < notice < warning < err < crit < alert < emerg。配置中使用*表示匹配所有优先级,也可以指定具体级别(如kern.err表示仅匹配内核错误及以上级别的日志)。
[3]. 目标(Action):日志的输出方式
目标字段决定日志的去向,常见的目标类型包括:
文件路径:如/var/log/kernel.log,将日志写入指定文件;
*:将日志输出到所有登录用户的控制台;
/dev/console:直接输出到系统控制台;
@ip:port:将日志转发到远程 syslog 服务器(嵌入式场景较少用)。
三 关键配置:日志文件大小与轮转控制
BusyBox 的syslogd默认对日志文件有大小限制(默认 200KB),超出限制会触发日志轮转。但注意:日志文件大小限制和轮转规则,无法通过syslog.conf配置,需要通过syslogd的启动参数设置。
[1]. 启动参数修改方法
修改/etc/init.d/S01syslogd启动脚本,在syslogd命令后添加参数:
# 示例:设置单日志文件最大1MB,保留3份轮转日志syslogd -s 1024 -b 3
常用参数说明:

修改后重启服务生效:
/etc/init.d/S01syslogd restart[2]. 源码层面修改默认值(可选)
若需要永久修改默认配置,可在 BusyBox 的 menuconfig 中调整:
进入 BusyBox 配置界面:make menuconfig;
找到System Logging Utilities → syslogd;
修改Default log file size(默认 200KB)和Default number of rotated files;
重新编译 BusyBox 并刷入设备,即可永久生效。
四 工作流程梳理
从日志产生到持久化,整个流程分为 4 个阶段:
内核日志产生:内核运行过程中,通过printk()输出日志,写入内核环形缓冲区/proc/kmsg;
[1].klogd 采集转发:klogd读取/proc/kmsg中的日志,转发给本地的syslogd进程;
[2].用户态日志输出:用户态应用通过syslog()系统调用,将日志发送给syslogd;
[3].syslogd 过滤存储:syslogd根据syslog.conf配置,将不同设施、优先级的日志写入指定文件,或输出到控制台;同时根据启动参数控制日志文件大小与轮转。
五 常见问题与调试技巧
[1]. 日志文件不生成
检查syslogd和klogd是否正常运行:ps | grep syslogd;
检查目标文件路径是否存在,是否有写权限:ls -ld /opt/data/AXSyslog/kernel/;
检查syslog.conf配置语法是否正确,可临时添加*.debug /var/log/debug.log测试所有日志是否输出。
[2]. 日志文件大小不生效
确认syslogd启动参数是否正确,可通过ps | grep syslogd查看进程启动参数;
部分老版本 BusyBox 的-s参数存在上限(如最大 2MB),超出限制需使用外部脚本(如logrotate)实现定时轮转。
[3]. 如何实时查看日志
查看内核实时日志:cat /proc/kmsg;
查看 syslog 实时日志:tail -f /var/log/kernel.log;
查看 syslogd 是否接收日志:syslogd -n(前台运行,查看日志输出)。
六 与传统 syslog 的区别
嵌入式 BusyBox 的syslogd是轻量简化版,与桌面系统的rsyslog/syslog-ng相比,功能更精简:
不支持复杂的过滤规则、模板和远程日志转发(部分版本支持基础转发);
日志轮转仅支持简单的文件大小触发,无定时轮转功能;
配置文件语法兼容传统 syslog,但仅支持基础的设施和优先级匹配。
因此在嵌入式场景中,若需要更复杂的日志管理,通常会结合外部脚本或轻量工具实现扩展。
总结
BusyBox 的syslogd与klogd以极简的方式,为嵌入式 Linux 提供了完整的日志采集与存储能力。核心要点如下:
[1].klogd负责内核日志转发,syslogd负责日志统一处理与存储;
[2].syslog.conf控制日志的来源与去向,启动参数控制文件大小与轮转;
嵌入式场景中,需注意文件权限、路径存在性及参数兼容性问题。
掌握这套日志系统的工作机制,能帮我们快速定位嵌入式设备的内核 panic、应用崩溃等问题,是嵌入式 Linux 开发的必备技能。
以上为全文内容。

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助