1 个不稳定版本
0.1.0 | 2024 年 6 月 26 日 |
---|
#253 在 调试
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