Openwrt/ Linux 定长 日志文件

195 天前
 yaocf

有这么一个需求:一个进程会源源不断输出日志(不支持修改日志级别),现在把这个进程写进了 Openwrt 的 Service 的 procd 进行管理,有什么方案可以做到:可以查看进程输出的日志,但是日志长度不会无限制增长。(最好是不使用 cron 任务定时去截断日志文件这个方案)。

倒是想到了一个方式,创建一个 unix socket 文件,然后让进程把日志输出到 socket 文件中,想要查看的时候,直接怼在 socket 文件上读。而且 socket 文件好像可以设置长度。但是不知为何,Openwrt x86 上无法创建成功 socket 。(如果有大神有相关经验,望可指点一下。)

希望各位大神不吝赐教。

1091 次点击
所在节点    OpenWrt
14 条回复
vcn8yjOogEL
195 天前
直接扔进系统 log ?
cabbage
195 天前
logrotate 了解下,限制日志文件长度,还能自动压缩
billlee
195 天前
你对 unix socket 的理解是错的,openwrt x86 支持 unix socket. 但 unix socket 实现不了你要的功能。

Linux 上现在通用的做法是让 systemd-joirnald 管理日志,可以实现你的需求,但 openwrt 不用 systemd. 所以还是用 cron logrotate 吧
zhng920823
195 天前
OpenWRT 本身的日志就满足你的要求了啊,直接 logread 加 grep 就可以了啊
看实时日志可以 logread -f | grep xxxxx
zhng920823
195 天前
@billlee OpenWRT 本身是定长的日志, 数据多了后就丢弃旧的
julyclyde
195 天前
@yaocf @cabbage
首先你都已经写到 procd 了,就不可能用 cron 来截断了吧?这事根本轮不着你选择

socket 文件不能设置长度
serialt
195 天前
@cabbage 对应的进程需要提供一个重新打开日志文件的接口让 logrotate 去通知,不然还是轮转有问题
serialt
195 天前
op 可以用 supervisor 管理进程,可以很好的控制日志轮转
julyclyde
195 天前
如果把日志发送给日志处理程序,那自然是由处理程序负责切段存盘
如果是自己亲自写日志,那需要能够接受信号再做“关闭文件再打开”动作,才能从外部控制切断
如果是 stderr 输出,可以重定向再用第一种方法
ysc3839
194 天前
socket 文件?可以设置长度?我印象中不可以吧?你指的是什么?
首先没记错的话 Unix socket 不能当作普通文件 open write ,必须要用 socket 系列函数。
其次就算可以,TCP 是有流控制的,写入数据塞满缓冲区,但又没被读取的话,就不能继续写入了,所以不能满足需求。

另外,你的需求“可以查看进程输出的日志”指的是随时查看吗?还是说要日志文件达到一定大小后改为输出到另一个文件?
如果只是要随时查看,查看时不想看到新的内容,那用 more 或者 less 之类的工具应该能支持?
如果是要日志文件达到一定大小后改为输出到另一个文件,个人觉得较好的方案是日志输出到一个程序,然后程序计算大小并保存到文件里。这个方案也许某些 syslog 服务端程序是支持的,自己写一个也不麻烦。
julyclyde
194 天前
@ysc3839 那你首先就记错了
ysc3839
194 天前
@julyclyde
我确认了一下,Unix socket 确实是不能直接作为普通文件 open 啊
```
~/testsocket $ python ../s.py &
[1] 23401
~/testsocket $ ls -alh
total 7.0K
drwx------ 2 root root 3.5K Oct 29 14:17 .
drwx------ 9 root root 3.5K Oct 29 14:16 ..
srwx------ 1 root root 0 Oct 29 14:17 socket
~/testsocket $ echo 123 > socket
bash: socket: No such device or address
~/testsocket $ echo 123 > ./socket
bash: ./socket: No such device or address
~/testsocket $ echo 123 | tee socket
tee: socket: No such device or address
123
~/testsocket $ cat socket
cat: socket: No such device or address
```
julyclyde
194 天前
@ysc3839 确实是不能 open 啊。但是你之前说的错误说法是不能 write 啊
yaocf
190 天前
嗯,之前理解错了,unix 可以设置的是缓冲长度(-I length TCP receive buffer length )。

至于为啥要一个定长日志,原因如下:那个进程的输出文本产生的特别快,如果直接怼到系统 log ,会导致其他进程的 log 被冲掉,但是,如果在 procd 中将输出信息重定向到文件,又担心那个文件会无限制增长。用 cron 倒是可以做到效果,但是总感觉不是很完善。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/986183

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX