资讯动态

SRS 怎么配置 logrotate 自动轮转日志文件

发布时间:2026/9/12 4:47:40 来源:尧图企业网站定制
SRS 怎么配置 logrotate 自动轮转日志文件【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srsSRS 长期运行后会遇到一个实际问题默认情况下它把全部日志写进单个srs.log文件这个文件会持续变大。SRS 的 Log Rotate 文档给出的做法是借助系统的 logrotate 工具做自动轮转把旧日志压缩、保留固定份数并在轮转时给 SRS 发送SIGUSR1信号让进程关闭旧文件描述符、重新打开srs.log继续写入。本文按文档流程完成三件事写好 logrotate 配置、手动触发一次轮转、确认 SRS 在轮转后仍正常写日志。轮转前需要了解的 SRS 日志行为配置前先确认两个事实来自 Log 文档 和 full.confSRS 的日志容器srs_log_tank默认为file日志文件由srs_log_file指定默认路径是./objs/srs.log运行目录下有 pid 文件默认是./objs/srs.pid。Log 文档中的启动日志示例里有write pid4021 to ./objs/srs.pid success!文档示例其中的 pid 数值仅为示例。SRS 进程持续持有srs.log的文件描述符只把文件mv走并不会让 SRS 写到新文件必须让它重新打开日志文件。文档明确说明向 SRS 发送SIGUSR1后SRS will close the previous file fd and reopen the log file。这正是 logrotate 配置里postrotate要发信号的原因。如果不想装 logrotate、只手动做一次轮转文档给出的流程是# 1. 把日志挪到临时位置 mv objs/srs.log /tmp/srs.date %s.log # 2. 发信号让 SRS 关闭旧 fd、重新打开日志文件 killall -s SIGUSR1 # 3. 压缩或删除 /tmp 下的临时日志下面这条路径只适用于在 SRS 运行目录下执行生产环境更推荐交给 logrotate 自动化。安装 logrotate文档给出的安装命令yum 系发行版sudo yum install -y logrotate编写 /etc/logrotate.d/srs 配置按文档写入 SRS 的 logrotate 规则cat END /etc/logrotate.d/srs /usr/local/srs/objs/srs.log { daily dateext compress rotate 7 size 1024M sharedscripts postrotate kill -USR1 \cat /usr/local/srs/objs/srs.pid\ endscript } END配置里有两处需要和你的部署方式对得上/usr/local/srs/objs/srs.log与/usr/local/srs/objs/srs.pid对应 SRS 通过make install安装到默认前缀/usr/local/srs的情况安装前缀说明见 Linux Service 文档。如果你是在源码构建目录里直接跑./objs/srs -c conf/srs.conf日志和 pid 文件在运行目录下的objs/srs.log与objs/srs.pid需要把配置里这两处路径改成实际位置配置项含义daily按天轮转size 1024M在日志达到 1024M 时提前轮转rotate 7保留 7 份历史日志dateext与compress让旧文件带日期后缀并压缩postrotate在轮转后执行kill -USR1把信号发给 SRS 进程。一个执行细节要注意这个 heredoc 的END没有加引号cat /usr/local/srs/objs/srs.pid会在写入配置文件的那一刻被 shell 展开最终落盘的是当时的 SRS pid 数值而不是命令本身。所以执行这条命令前 SRS 必须已经在运行SRS 重启后 pid 变化时这个配置里的postrotate需要按新 pid 重新写入。手动触发一次轮转并验证文档建议用强制方式先手动跑一轮确认配置可用logrotate -f /etc/logrotate.d/srs这一轮的效果是logrotate 按配置把旧srs.log挪走、压缩并加日期后缀随后postrotate中的kill -USR1把信号发给 SRS。验证轮转是否生效看两点日志目录下出现被轮转出去的压缩旧日志同时存在一个重新开始的srs.logSRS 进程收到SIGUSR1后关闭了旧 fd 并重新打开日志文件新的日志写入新的srs.log。如果强制执行后srs.log仍在按旧文件句柄增长优先检查配置里的日志路径是否与实际srs_log_file一致以及postrotate中的 pid 是否指向当前 SRS 进程。替代方式用 init.d 脚本发送轮转信号如果 SRS 已安装为 Linux 服务步骤见 Linux Service 文档仓库自带的 init.d 脚本 提供了rotate子命令/etc/init.d/srs rotate脚本内部的logrotate()函数会先校验进程存活然后执行kill -s SIGUSR1 ${srs_pid}。脚本自身对它的说明是rotate: For log rotate, to send SIGUSR1 to SRS to reopen the log file。手工执行前面mv轮转流程时可以用它代替killall -s SIGUSR1避免向所有同名进程广播信号。不推荐的做法copytruncate文档里还给出了一份copytruncate配置先复制日志、再清空原文件/usr/local/srs/objs/srs.log { daily dateext compress rotate 7 size 1024M copytruncate }文档明确提示copytruncate强烈不推荐因为日志可能丢失它只是 SRS2 这类不支持SIGUSR1的旧版本的替代手段SRS3 虽然支持 copytruncate同样不建议。因此只要你的 SRS 能响应SIGUSR1就用上面postrotate发信号的方案。限制与注意点文档只给出了sudo yum install -y logrotate这一条安装命令面向 yum 系系统其他包管理器请按发行版习惯自行替换logrotate 配置首行的日志路径和postrotate里的 pid 路径必须同时匹配你的实际部署位置其中任一不一致都会导致轮转失效或信号发错对象copytruncate 方案有日志丢失风险文档标注为 SRS3 下也不推荐仅在无法使用SIGUSR1的旧版本上作为兜底。完成上述配置后SRS 的日志轮转由 logrotate 接管按daily或size 1024M触发旧日志压缩保留 7 份轮转后 SRS 通过SIGUSR1重新打开日志文件继续写入。【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价