Linux 中没有 Sudo-Log-Format 配置项;sudo 日志字段(TTY、PWD、USER、COMMAND)由源码硬编码固定,不可增删或重排,仅能通过 logfile、log_input 等 Defaults 选项控制是否输出及写入位置。

Linux 中没有名为 Sudo-Log-Format 的内置配置项或命令。这是常见误解——sudo 本身不提供类似 Nginx 或 systemd 那样的自定义日志格式语法(如 $remote_addr - $user [$time_local])。它的日志字段是固定结构、由源码硬编码决定的,但可通过配置影响哪些字段出现、是否启用输入/输出记录、以及最终写入位置。
确认 sudo 实际记录的字段内容
默认日志行形如:
这些字段(TTY、PWD、USER、COMMAND)是 sudo 内置输出的,不可增删或重排顺序。能否完整显示,取决于以下配置:
- Defaults logfile="/var/log/sudo.log":启用独立日志文件,确保上述字段稳定输出(避免被 syslog 合并或截断)
- Defaults tty_tickets:强制为每个终端生成唯一会话标识,使 TTY 字段可靠
-
Defaults log_input:追加原始输入字节(含空格与转义),末尾带
runas=root sid=0x1a2b3c—— 这不是“格式化”,而是扩展字段 - 禁用
Defaults !syslog(否则日志可能丢失)
实现类“格式化输出”的实用替代方案
虽然不能改 sudo 日志模板,但可通过外部工具对已生成日志做结构化处理:
- 用
awk提取并重排字段:
awk -F': ' '{gsub(/; /,"|",$5); print $1" | "$2" | "$5}' /var/log/sudo.log
输出示例:May 15 09:42:11 server | alice | TTY=pts/3|PWD=/home/alice|USER=root|COMMAND=/bin/mount... - 用
journalctl(systemd 系统)按字段过滤:
journalctl _COMM=sudo -o json | jq '.MESSAGE' | grep COMMAND= - 配合 rsyslog 自定义模板(仅限 syslog 输出路径):
在/etc/rsyslog.d/10-sudo.conf中添加:
template(name="SudoFormat" type="string" string="%TIMESTAMP% %HOSTNAME% SUDO[%PROCID%]: %msg%\n")
if $programname == 'sudo' then /var/log/sudo.log;SudoFormat
关键注意事项:别踩这些坑
-
/var/log/sudo.log 默认不存在 —— 必须手动在
/etc/sudoers中添加Defaults logfile=...并创建文件、设权限(chmod 600 /var/log/sudo.log; chown root:root) -
log_input/log_output 不等于“格式化” —— 它们会显著增大日志体积,且
log_output需配合sudo_logsrvd或 iolog 目录才能生效,普通部署中极少启用 -
NOLOG 规则会彻底跳过记录 —— 如
%admin ALL=(ALL) NOLOG: /usr/bin/reboot,该命令连COMMAND=行都不会出现在 auth.log 或 sudo.log 中 - 日志时间戳受系统时区和 rsyslog 配置影响,
journalctl默认用本地时区,而auth.log可能按 UTC 记录 —— 跨工具比对前先统一时区


















