#command-output #logging #logs #log-file #nohup #disown #setsid

app si-loggy

自动日志记录与对任意命令的 nohup 支持

1 个不稳定版本

0.1.0 2024 年 6 月 26 日

#253调试

CC0 许可协议

21KB
400

loggy

loggy 包装命令,并将它们的输出自动 tee 到日志文件中,而无需修改原始程序或脚本。

功能

  • 将命令输出(stdout 和 stderr)记录到自动创建的文件中
  • 透传模式用于管道:类似于 tee,无需指定名称
  • 高性能:每秒处理数GB输出,启动时间低于毫秒
  • 处理 SIGHUP 和关闭的 stdout/stderr(在终端或 SSH 断开连接后继续)
  • 通过符号链接、别名或 Bash 魔术包装任何命令;可通过正则表达式模式进行配置

安装

从源码安装

sudo -E "$(command -v cargo)" install --root /usr/local si-loggy

从 Git 安装

sudo -E "$(command -v cargo)" install --root /usr/local --git https://github.com/Standard-Intelligence/loggy

使用方法

手动调用

使用 loggy 包装命令以记录其输出

$ loggy echo hello world
[loggy] logging to /home/robert/logs/echo-0.log
hello world

或者,将命令管道到 loggy

$ echo hello world | loggy
[loggy] logging to /home/robert/logs/loggy-14.log
hello world

包装命令(即运行 loggy command 或使用以下方法之一)比管道到 loggy 更好,因为 loggy 可以代表包装进程处理 SIGHUP 和关闭的 stdout/stderr(例如来自已分离的终端)。

loggy 链接到要记录的每个程序

ln -s /usr/local/bin/loggy /usr/local/bin/pip
ln -s /usr/local/bin/loggy /usr/local/bin/python
ln -s /usr/local/bin/loggy /usr/local/bin/python3

当运行包装程序时,loggy 根据命令名称和任何对应现有文件的参数,在 ~/logs 中创建一个日志文件

$ pip install -r requirements.txt
[loggy] logging to /home/user/logs/pip-requirements.txt-0.log

如果包装程序没有输出(例如 loggy true),则不会创建日志文件。

环境变量

loggy 可以通过设置 NO_LOGGY 环境变量(除 0 以外的任何值)来暂时禁用包装命令

NO_LOGGY= python3 -m print-all-my-secrets

执行钩子

为了让 loggy 处理任何命令中可能出现的广泛模式(例如下面 /sandbox 的示例),它必须运行在每个命令上(此时,配置文件将决定哪些命令实际被记录)。将以下内容添加到您的 .bashrc 中,以在 loggy 下运行每个命令

loggy() {
    if [[ -v AT_PROMPT ]]; then
        unset AT_PROMPT
        local t="$(type -t $@)"
        if [[ "$t" == "file" ]]; then
            command loggy $@
            shopt -s extdebug
            return 1
        elif [[ "$t" == "function" ]]; then
            $@
            shopt -s extdebug
            return 1
        fi
    fi
}

unset -f command_not_found_handle
trap 'loggy ${BASH_COMMAND}' DEBUG
PROMPT_COMMAND="shopt -u extdebug; ${PROMPT_COMMAND}; AT_PROMPT="

配置文件

默认情况下,loggy 为它包装的任何内容创建日志。您可能想要比符号链接和 NO_LOGGY 提供的更精细的控制,例如仅记录特定 Python 模块的调用。作为最后的手段,loggy~/.config/loggy/etc/loggy 中的第一个存在的文件加载正则表达式列表。如果这些文件中的一个存在,并且命令被 loggy 包装,那么只有在它与配置文件中的正则表达式之一匹配时,它才会被记录。

示例配置

# Log `make` commands with any arguments
^make( |$)

# Log all Python scripts, but not e.g. `python -m pip`
^([^ ]*/)?(python3?|python-[0-9.]+) .*\.py\b

# Log invocations of a specific Python module
^([^ ]*/)?(python3?|python-[0-9.]+) -m ?torch\.distributed\.run

# Log any commands involving the /sandbox directory
/sandbox

我们建议最后使用配置文件,因为编写正则表达式很难 :)

技巧

如果您已经运行了 loggy 并断开了终端或 SSH 连接,请在新的终端中运行 tail -f ~/logs/example.log 以流式传输其输出。

如果已安装,loggy 会自动使用 stdbuf 确保包装的命令逐行将输出写入终端和日志文件,而不是使用 完全缓冲。请确保安装了 stdbuf 以获得最佳性能。

依赖项

~4–14MB
~168K SLoC