Openwrt/ Linux 定长 日志文件 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OpenWrt 是一个专门面向嵌入式设备的 Linux 发行版。你可以将 OpenWrt 支持的型号的嵌入式设备,比如各种路由器上的系统,换成一个有更多可能性可以折腾的 Linux 系统。
OpenWrt 官方网站
yaocf
V2EX    OpenWrt

Openwrt/ Linux 定长 日志文件

  •  
  •   yaocf 2023-10-28 08:55:43 +08:00 2126 次点击
    这是一个创建于 793 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    希望各位大神不吝赐教。

    14 条回复    2023-11-02 20:21:41 +08:00
    vcn8yjOogEL
        1
    vcn8yjOogEL  
       2023-10-28 10:42:59 +08:00 via Android
    直接扔进系统 log ?
    cabbage
        2
    cabbage  
       2023-10-28 11:03:40 +08:00 via Android
    logrotate 了解下,限制日志文件长度,还能自动压缩
    billlee
        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 吧
    zhng920823
        4
    zhng920823  
       2023-10-28 11:24:06 +08:00
    OpenWRT 本身的日志就满足你的要求了啊,直接 logread 加 grep 就可以了啊
    看实时日志可以 logread -f | grep xxxxx
    zhng920823
        5
    zhng920823  
       2023-10-28 11:25:23 +08:00
    @billlee OpenWRT 本身是定长的日志, 数据多了后就丢弃旧的
    julyclyde
        6
    julyclyde  
       2023-10-28 13:05:36 +08:00
    @yaocf @cabbage
    首先你都已经写到 procd 了,就不可能用 cron 来截断了吧?这事根本轮不着你选择

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

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

    至于为啥要一个定长日志,原因如下:那个进程的输出文本产生的特别快,如果直接怼到系统 log ,会导致其他进程的 log 被冲掉,但是,如果在 procd 中将输出信息重定向到文件,又担心那个文件会无限制增长。用 cron 倒是可以做到效果,但是总感觉不是很完善。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     946 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 22:51 PVG 06:51 LAX 14:51 JFK 17:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86