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

Openwrt/ Linux 定长 日志文件

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

    有这么一个需求:一个进程会源源不断输出日志(不支持修改日志级别),现在把这个进程写进了 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   ·   实用小工具   ·   1099 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:40 · PVG 06:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.