Bash自定义日志函数:如何将变量传入日志模板实现指定输出?
Bash自定义日志功能修复方案
问题根源
你之前的实现存在两个核心问题:
SCRIPT_LOG_PATTERN定义时,$(date)会在脚本启动阶段执行一次,后续所有日志都会使用这个固定时间,而非日志输出时的实时时间。- 定义模板时使用的
$1、$2是脚本全局的位置参数,不是函数调用时传入的参数,完全无法实现动态替换。
正确实现代码
以下是符合需求的完整实现,每次输出日志时都会获取实时时间,并正确注入日志级别和内容:
#!/usr/bin/env bash set -e +x SCRIPT_LOG_NAME='[MYSCRIPT]' SCRIPT_LOG_DATETIME_FORMAT="+%Y-%m-%d %H:%M:%S" SCRIPT_LOG_LEVEL_INFO='INFO' log_general() { # 用local定义局部变量,避免污染全局环境 local log_level="$1" local log_message="$2" # 实时获取当前时间,按格式拼接日志内容 echo "${SCRIPT_LOG_NAME} $(date "${SCRIPT_LOG_DATETIME_FORMAT}") ${log_level} : ${log_message}" } log_info() { # 传入INFO级别和日志内容到通用日志函数 log_general "$SCRIPT_LOG_LEVEL_INFO" "$1" } # 测试示例 log_info "Something logged"
可选优化:用printf控制格式
如果需要更稳定的格式控制(比如处理特殊字符),可以用printf替代echo:
log_general() { local log_level="$1" local log_message="$2" printf "%s %s %s : %s\n" \ "$SCRIPT_LOG_NAME" \ "$(date "${SCRIPT_LOG_DATETIME_FORMAT}")" \ "$log_level" \ "$log_message" }
之前尝试的问题说明
- 第一种写法:
SCRIPT_LOG_PATTERN中的$1、$2是脚本初始化时的全局参数,和函数参数无关,且date只执行一次,时间固定。 - 第二种写法:
SCRIPT_LOG_PATTERN中的$(date)和${SCRIPT_LOG_LEVEL}在脚本启动时就已解析完成,函数内对SCRIPT_LOG_LEVEL的赋值无法反向更新模板内容。
内容的提问来源于stack exchange,提问作者Michael Linker
相关产品推荐
相关产品推荐

