Yocto系统中Syslog日志文件大小限制配置位置咨询
我用Yocto构建的系统部署了syslog和logrotate,syslog生成两类日志:一类存储debug级消息,另一类存储其他消息。当前debug日志文件增长至200KB后会被重命名为debug.0,但不会生成debug.1、debug.2这类归档文件,导致数据丢失。我已为该文件配置logrotate,设置为每日或文件达10MB时执行轮转。想知道syslog的日志文件最大大小是在哪里设置的?
补充说明:我曾怀疑系统存在未知的固有最大文件大小限制,但这似乎并非系统特性。
相关配置文件
syslog.conf(由busybox.bbappend安装)
# /etc/syslog.conf Configuration file for busybox's syslogd utility *.debug /home/root/.evcc_logs/debug *.info /var/log/info *.info /dev/console
busybox.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" SRC_URI += "file://evcc_kernel_features.cfg file://syslog.conf" do_deploy() { install -d ${D}/etc/ install -m 0755 ${WORKDIR}/syslog.conf ${D}/etc/ } addtask deploy after do_install do_install_append () { install -d ${D}/home/root/.evcc_logs/ install -d ${D}/etc/evcc/ install -d ${D}/tmpfs/ install -d ${D}/tmpfs/can } FILES_${PN} += "/home/root/.evcc_logs/ \ /etc/evcc/ \ /tmpfs/ \ /tmpfs/can \ "
logrotate.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}/files/:" SRC_URI_append = " file://logrotate.conf file://services file://rotaterules" inherit systemd SYSTEMD_SERVICE_${PN} = " logrotate.service logrotate.timer" do_install_append(){ install -d 755 ${D}/${sysconfdir}/logrotate.d/ install -m 0644 ${WORKDIR}/logrotate.conf ${D}/etc install -m 0644 ${WORKDIR}/rotaterules/info ${D}/etc/logrotate.d/info install -m 0644 ${WORKDIR}/rotaterules/debug ${D}/etc/logrotate.d/debug install -m 0644 ${WORKDIR}/rotaterules/btmp ${D}/etc/logrotate.d/btmp install -m 0644 ${WORKDIR}/rotaterules/wtmp ${D}/etc/logrotate.d/wtmp install -d ${D}{systemd_system_unitdir} install -m 0644 ${WORKDIR}/services/logrotate.service ${D}${systemd_system_unitdir} install -m 0644 ${WORKDIR}/services/logrotate.timer ${D}${systemd_system_unitdir} } FILES_${PN} += " \ /etc/logrotate.conf \ ${base_libdir}/systemd/system/logrotate.service \ ${base_libdir}/systemd/system/logrotate.timer \ /lib/systemd/system \ "
logrotate.conf
# see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # compress log files compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d
logrotate.timer(设置为每分钟运行一次以处理debug日志)
[Unit] Description=Timer to run log rotation every day Requires=logrotate.service [Timer] Unit=logrotate.service OnCalendar=*-*-* *:*:00 Persistent=true [Install] WantedBy=timers.target
logrotate.service
[Unit] Description=Log rotation service [Service] Type=simple ExecStart=/usr/sbin/logrotate -f /etc/logrotate.conf
你遇到的debug日志在200KB就被轮转的问题,不是syslog本身的配置限制,而是BusyBox syslogd自带的内部轮转机制在生效,这个机制和你配置的logrotate无关。
BusyBox的syslogd默认会对单个日志文件做内部轮转:当文件大小达到200KB时,就会把当前日志重命名为[filename].0,然后创建新的空日志文件继续写入。但它不会保留更多归档(比如.1、.2),新的轮转会直接覆盖.0文件,这就是你看到数据丢失的原因。
解决这个问题有两个方向:
1. 关闭BusyBox syslogd的内部轮转,完全交给logrotate处理
你需要在启动syslogd时添加-O参数(大写O),禁用它的内部日志轮转功能。在Yocto构建中,可通过以下方式实现:
- 如果用systemd管理syslogd,找到syslog.service文件,在ExecStart行添加
-O参数,例如:ExecStart=/sbin/syslogd -O - 如果用init脚本,修改对应的启动命令,加入
-O参数
同时,确保/etc/logrotate.d/debug配置正确,需包含size 10M和rotate N(N为你想要保留的归档文件数量),示例配置:
/home/root/.evcc_logs/debug { daily size 10M rotate 5 create dateext compress }
2. 修改BusyBox syslogd的内部轮转参数
如果想保留syslogd的内部轮转,可调整它的轮转阈值和归档数量:
- 启动syslogd时添加
-s <size>参数,设置触发轮转的文件大小(比如-s 10485760代表10MB) - 添加
-b <num>参数,设置保留的归档文件数量(比如-b 5代表保留.0到.4共5个归档)
同样需要在Yocto中修改syslogd的启动命令来加入这些参数。
总结:当前的200KB限制是BusyBox syslogd的默认内部轮转阈值,和logrotate无关,你需要通过修改syslogd的启动参数调整该限制,或禁用内部轮转完全交给logrotate处理。
内容的提问来源于stack exchange,提问作者Michael

