You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:50:28