Bash 日志记录
为Bash脚本提供结构化日志记录模式,支持颜色、表情符号图标和CI/CD集成。
基本日志函数
简单、可移植的日志实现:
# 颜色定义
declare -A colors=(
[green]=$'\033[0;32m'
[red]=$'\033[0;31m'
[yellow]=$'\033[1;33m'
[blue]=$'\033[0;34m'
[reset]=$'\033[0m'
)
declare -A emojis=(
[success]='✅'
[error]='❌'
[warning]='⚠️'
[info]='ℹ️'
[debug]='🐛'
)
# 日志函数
print_success() {
printf '%b %b%b%b\n' "${emojis[success]}" "${colors[green]}" "$*" "${colors[reset]}"
}
print_error() {
printf '%b %b%b%b\n' "${emojis[error]}" "${colors[red]}" "$*" "${colors[reset]}" >&2
}
print_warning() {
printf '%b %b%b%b\n' "${emojis[warning]}" "${colors[yellow]}" "$*" "${colors[reset]}"
}
print_info() {
printf '%b %b\n' "${emojis[info]}" "$*"
}
print_debug() {
[[ -n "${DEBUG:-}" ]] && printf '%b %b%b%b\n' "${emojis[debug]}" "${colors[blue]}" "$*" "${colors[reset]}"
}
日志级别
实现可配置的日志级别。
TTY检测
在非交互式环境中禁用颜色:
setup_colors() {
if [[ -t 1 ]] && [[ -z "${NO_COLOR:-}" ]]; then
# 终端支持颜色
COLOR_RED=$'\033[0;31m'
COLOR_GREEN=$'\033[0;32m'
COLOR_YELLOW=$'\033[1;33m'
COLOR_BLUE=$'\033[0;34m'
COLOR_RESET=$'\033[0m'
else
# 不支持颜色
COLOR_RED=''
COLOR_GREEN=''
COLOR_YELLOW=''
COLOR_BLUE=''
COLOR_RESET=''
fi
}
# CI环境通常支持颜色
detect_color_support() {
if [[ -n "${CI:-}" ]] || [[ -n "${GITLAB_CI:-}" ]] || [[ -n "${GITHUB_ACTIONS:-}" ]]; then
return 0 # CI环境,启用颜色
elif [[ -t 1 ]]; then
return 0 # 终端,启用颜色
else
return 1 # 不支持颜色
fi
}
GitLab CI可折叠部分
在GitLab CI中创建可折叠的日志部分:
section_start() {
local section_key="\${1:-section}"
local section_header="\${2:-$section_key}"
local collapsed="\${3:-true}"
if [[ -n "${GITLAB_CI:-}" ]]; then
printf "\e[0Ksection_start:%s:%s[collapsed=%s]\r\e[0K%s\n" \
"$(date +%s)" "$section_key" "$collapsed" "$section_header"
else
printf '\n=== %s ===\n' "$section_header"
fi
}
section_end() {
local section_key="\${1:-section}"
if [[ -n "${GITLAB_CI:-}" ]]; then
printf "\e[0Ksection_end:%s:%s\r\e[0K" "$(date +%s)" "$section_key"
else
printf '\n'
fi
}
# 用法
section_start "build" "构建应用程序"
make build
section_end "build"
GitHub Actions分组
进度指示器
结构化步骤日志
Shlocksmith日志记录库
用于全面日志记录并完全集成CI的shlocksmith日志记录库。
特性
- 20+ 个日志级别函数(log_info, log_error, log_warning等)
- 基于步骤的日志记录(log_step_start, log_step_pass, log_step_fail)
- 颜色和表情符号支持,带TTY检测
- GitLab CI部分管理
- TUI的框线绘制字符
- 键值对格式化
可用函数
# 基本日志
log_info "信息性消息"
log_warning "警告消息"
log_error "错误消息"
log_debug "调试消息" # 仅在设置DEBUG时显示
log_notice "通知消息"
log_fatal "致命错误" # 退出脚本
# 基于步骤的日志
log_start "进程名称"
log_step_start "步骤描述"
log_step_pass "成功消息"
log_step_fail "失败消息"
log_step_skip "跳过消息"
log_step_done "完成消息"
log_done "进程完成"
# 结果
log_pass "测试通过"
log_fail "测试失败"
log_result "结果详情"
log_success "成功消息"
# CI部分
section_start "section_id" "部分标题"
section_end "section_id"
用法
#!/usr/bin/env bash
source /path/to/log_functions.sh
log_start "部署过程"
section_start "deps" "安装依赖"
log_step_start "安装包"
if apt-get install -y package; then
log_step_pass "包已安装"
else
log_step_fail "包安装失败"
fi
section_end "deps"
log_done "部署完成"
其他资源
脚本
- log_functions.sh - 完整的shlocksmith日志记录库
颜色参考
| 代码 | 颜色 |
|---|---|
\033[0;30m | 黑色 |
\033[0;31m | 红色 |
\033[0;32m | 绿色 |
\033[0;33m | 黄色 |
\033[0;34m | 蓝色 |
\033[0;35m | 洋红色 |
\033[0;36m | 青色 |
\033[0;37m | 白色 |
\033[1;XXm | 粗体变体 |
\033[0m | 重置 |