Openwrt/ Linux 定长 日志文件

2023-10-28 08:55:43 +08:00
 yaocf

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

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

希望各位大神不吝赐教。

1438 次点击
所在节点    OpenWrt
14 条回复
vcn8yjOogEL
2023-10-28 10:42:59 +08:00
直接扔进系统 log ?
cabbage
2023-10-28 11:03:40 +08:00
logrotate 了解下,限制日志文件长度,还能自动压缩
billlee
2023-10-28 11:21:00 +08:00
你对 unix socket 的理解是错的,openwrt x86 支持 unix socket. 但 unix socket 实现不了你要的功能。

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

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

另外,你的需求“可以查看进程输出的日志”指的是随时查看吗?还是说要日志文件达到一定大小后改为输出到另一个文件?
如果只是要随时查看,查看时不想看到新的内容,那用 more 或者 less 之类的工具应该能支持?
如果是要日志文件达到一定大小后改为输出到另一个文件,个人觉得较好的方案是日志输出到一个程序,然后程序计算大小并保存到文件里。这个方案也许某些 syslog 服务端程序是支持的,自己写一个也不麻烦。
julyclyde
2023-10-29 14:03:29 +08:00
@ysc3839 那你首先就记错了
ysc3839
2023-10-29 14:22:50 +08:00
@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
2023-10-29 17:17:28 +08:00
@ysc3839 确实是不能 open 啊。但是你之前说的错误说法是不能 write 啊
yaocf
2023-11-02 20:21:41 +08:00
嗯,之前理解错了,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