有这么一个需求:一个进程会源源不断输出日志(不支持修改日志级别),现在把这个进程写进了 Openwrt 的 Service 的 procd 进行管理,有什么方案可以做到:可以查看进程输出的日志,但是日志长度不会无限制增长。(最好是不使用 cron 任务定时去截断日志文件这个方案)。
倒是想到了一个方式,创建一个 unix socket 文件,然后让进程把日志输出到 socket 文件中,想要查看的时候,直接怼在 socket 文件上读。而且 socket 文件好像可以设置长度。但是不知为何,Openwrt x86 上无法创建成功 socket 。(如果有大神有相关经验,望可指点一下。)
希望各位大神不吝赐教。
1
vcn8yjOogEL 2023-10-28 10:42:59 +08:00 via Android
直接扔进系统 log ?
|
2
cabbage 2023-10-28 11:03:40 +08:00 via Android
logrotate 了解下,限制日志文件长度,还能自动压缩
|
3
billlee 2023-10-28 11:21:00 +08:00 via Android
你对 unix socket 的理解是错的,openwrt x86 支持 unix socket. 但 unix socket 实现不了你要的功能。
Linux 上现在通用的做法是让 systemd-joirnald 管理日志,可以实现你的需求,但 openwrt 不用 systemd. 所以还是用 cron logrotate 吧 |
4
zhng920823 2023-10-28 11:24:06 +08:00
OpenWRT 本身的日志就满足你的要求了啊,直接 logread 加 grep 就可以了啊
看实时日志可以 logread -f | grep xxxxx |
5
zhng920823 2023-10-28 11:25:23 +08:00
@billlee OpenWRT 本身是定长的日志, 数据多了后就丢弃旧的
|
6
julyclyde 2023-10-28 13:05:36 +08:00
|
8
serialt 2023-10-28 13:21:16 +08:00
op 可以用 supervisor 管理进程,可以很好的控制日志轮转
|
9
julyclyde 2023-10-28 19:57:44 +08:00
如果把日志发送给日志处理程序,那自然是由处理程序负责切段存盘
如果是自己亲自写日志,那需要能够接受信号再做“关闭文件再打开”动作,才能从外部控制切断 如果是 stderr 输出,可以重定向再用第一种方法 |
10
ysc3839 2023-10-29 06:12:55 +08:00 via Android
socket 文件?可以设置长度?我印象中不可以吧?你指的是什么?
首先没记错的话 Unix socket 不能当作普通文件 open write ,必须要用 socket 系列函数。 其次就算可以,TCP 是有流控制的,写入数据塞满缓冲区,但又没被读取的话,就不能继续写入了,所以不能满足需求。 另外,你的需求“可以查看进程输出的日志”指的是随时查看吗?还是说要日志文件达到一定大小后改为输出到另一个文件? 如果只是要随时查看,查看时不想看到新的内容,那用 more 或者 less 之类的工具应该能支持? 如果是要日志文件达到一定大小后改为输出到另一个文件,个人觉得较好的方案是日志输出到一个程序,然后程序计算大小并保存到文件里。这个方案也许某些 syslog 服务端程序是支持的,自己写一个也不麻烦。 |
12
ysc3839 2023-10-29 14:22:50 +08:00 via Android
@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 ``` |
14
yaocf OP 嗯,之前理解错了,unix 可以设置的是缓冲长度(-I length TCP receive buffer length )。
至于为啥要一个定长日志,原因如下:那个进程的输出文本产生的特别快,如果直接怼到系统 log ,会导致其他进程的 log 被冲掉,但是,如果在 procd 中将输出信息重定向到文件,又担心那个文件会无限制增长。用 cron 倒是可以做到效果,但是总感觉不是很完善。 |