news 2026/9/12 4:47:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SRS 怎么配置 logrotate 自动轮转日志文件

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/srs

SRS 长期运行后会遇到一个实际问题:默认情况下它把全部日志写进单个srs.log文件,这个文件会持续变大。SRS 的 Log Rotate 文档给出的做法是借助系统的 logrotate 工具做自动轮转:把旧日志压缩、保留固定份数,并在轮转时给 SRS 发送SIGUSR1信号,让进程关闭旧文件描述符、重新打开srs.log继续写入。本文按文档流程完成三件事:写好 logrotate 配置、手动触发一次轮转、确认 SRS 在轮转后仍正常写日志。

轮转前需要了解的 SRS 日志行为

配置前先确认两个事实,来自 Log 文档 和 full.conf:

  • SRS 的日志容器srs_log_tank默认为file,日志文件由srs_log_file指定,默认路径是./objs/srs.log
  • 运行目录下有 pid 文件,默认是./objs/srs.pid。Log 文档中的启动日志示例里有write pid=4021 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.logobjs/srs.pid,需要把配置里这两处路径改成实际位置;
  • 配置项含义:daily按天轮转,size 1024M在日志达到 1024M 时提前轮转,rotate 7保留 7 份历史日志,dateextcompress让旧文件带日期后缀并压缩,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。验证轮转是否生效,看两点:

  1. 日志目录下出现被轮转出去的压缩旧日志,同时存在一个重新开始的srs.log
  2. SRS 进程收到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 接管:按dailysize 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 4:47:15

开源提示词模板库实战:从结构化设计到跨模型复用

1. 从到处CtrlC到自建提示词库&#xff1a;我为什么要做这个开源项目 先交代下背景。过去一年里&#xff0c;我几乎每天都在和提示词打交道。无论是日常的内容创作、代码调试&#xff0c;还是团队内部的项目协作&#xff0c;提示词都成了绕不开的入口。但真正让我暴躁到想骂人的…

作者头像 李华
网站建设 2026/9/12 4:46:46

RetroArch 缩略图不显示?沿 3 条故障线一次修好

RetroArch 缩略图不显示&#xff1f;沿 3 条故障线一次修好 【免费下载链接】RetroArch Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3. 项目地址: https://gitcode.com/GitHub_Trending/re/RetroArch 你打开 RetroArch&#xff0c;ROM…

作者头像 李华
网站建设 2026/9/12 4:46:32

Shared Memory与异构内存架构:32GB显存跑56GB大模型的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 4:45:09

从test1开始:单元测试基础与TDD实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华