You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash自定义日志函数:如何将变量传入日志模板实现指定输出?

Bash自定义日志功能修复方案

问题根源

你之前的实现存在两个核心问题:

  1. SCRIPT_LOG_PATTERN定义时,$(date)会在脚本启动阶段执行一次,后续所有日志都会使用这个固定时间,而非日志输出时的实时时间。
  2. 定义模板时使用的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:53:03