ESC
输入关键词搜索文章标题和内容

Linux 日志彩色打印:Shell 和 C 语言实现指南

本文由 linuxROS 整理发布,首发于 linuxros.cn,转载请注明出处。

Linux 日志彩色打印:Shell 和 C 语言实现指南

简介

Linux 日志全是黑白,找报错超费眼!用 Shell 和 C 实现彩色打印,一眼揪 bug 少加班。

这其实是 Linux 通用 ANSI 转义码,简单给文字换色,记好万能公式就能用。


ANSI 彩色原理

flowchart LR A[程序] --> B[printf/echo] B --> C[插入转义码] C --> D[终端解析] D --> E[显示彩色文字]

核心流程:程序输出 → 插入 \033[...m → 终端识别 → 渲染彩色文字。


万能染色公式

\033[属性;颜色m 要打印的内容 \033[0m

重点碎碎念:结尾一定要加 \033[0m,千万别漏!

flowchart TD A[开始输出] --> B[插入 ESC31m 开启红色] B --> C[输出红色文字] C --> D{是否重置颜色} D -->|是 加ESC0m| E[恢复正常颜色] D -->|否 不加| F[整个终端变成红色] F --> G[后续所有输出都是红色]

不然整个终端都会被染成固定颜色,后续输啥都是这个色,想改回来超麻烦,踩过坑的都懂。


Shell 脚本用法

echo -e "\033[属性;颜色m 要打印的内容 \033[0m"

关键点:echo 后面必须加 -e 参数,不然染色暗号会当成普通文字原样打出来。


日志级别配色(行业通用)

级别 颜色 效果
报错 红色(31) 出问题一眼锁定,不用瞎翻乱找
成功 绿色(32) 运行顺利,看着就舒心,下班信号
警告 黄色(33) 小问题提前留意,避免后续踩大坑
提示 蓝色(34) 日常运行信息,不扎眼也不突兀

颜色速查小抄

文字属性

属性值 效果
0 恢复默认
1 高亮加粗(更显眼)

文字颜色

颜色值 颜色
30 黑色
31 红色
32 绿色
33 黄色
34 蓝色
35 紫色
36 青色
37 白色

高亮组合示例

1;31 = 高亮红色,报错用这个更扎眼,扫一眼就能看见。

来自 linuxros.cn · linuxROS

Shell 脚本示例

#!/bin/bash

# 彩色日志函数
log_error()   { echo -e "\033[1;31m[ERROR]\033[0m $1"; }
log_success() { echo -e "\033[1;32m[SUCCESS]\033[0m $1"; }
log_warn()    { echo -e "\033[1;33m[WARN]\033[0m $1"; }
log_info()    { echo -e "\033[1;34m[INFO]\033[0m $1"; }

# 使用示例
log_error "配置文件读取失败"
log_success "服务启动成功"
log_warn "内存使用率超过70%"
log_info "系统正常运行中"

C 语言实现

写 Linux C 程序、做嵌入式开发的朋友,染色原理和 Shell 一样,不需要额外头文件或第三方库。

简单用法

printf("\033[1;31m[ERROR]\033[0m 文件打开失败\n");
printf("\033[1;32m[SUCCESS]\033[0m 连接已建立\n");
printf("\033[1;33m[WARN]\033[0m 内存使用率高\n");
printf("\033[1;34m[INFO]\033[0m 任务完成\n");

推荐用法:宏封装

项目里更推荐用宏封装,代码看着干净整洁,后续改颜色只改宏就行。

#include <stdio.h>

#define COLOR_ERROR   "\033[1;31m"
#define COLOR_SUCCESS "\033[1;32m"
#define COLOR_WARN    "\033[1;33m"
#define COLOR_INFO    "\033[1;34m"
#define COLOR_RESET   "\033[0m"

#define log_error(fmt, ...)   printf(COLOR_ERROR   "[ERROR] "   fmt "\n" COLOR_RESET, ##__VA_ARGS__)
#define log_success(fmt, ...) printf(COLOR_SUCCESS "[SUCCESS] " fmt "\n" COLOR_RESET, ##__VA_ARGS__)
#define log_warn(fmt, ...)    printf(COLOR_WARN    "[WARN] "    fmt "\n" COLOR_RESET, ##__VA_ARGS__)
#define log_info(fmt, ...)    printf(COLOR_INFO    "[INFO] "    fmt "\n" COLOR_RESET, ##__VA_ARGS__)

int main() {
    log_error("配置文件读取失败: %s", "/etc/app.conf");
    log_success("服务启动成功,监听端口: %d", 8080);
    log_warn("内存使用率: %d%%", 75);
    log_info("系统正常运行,当前时间: %s", "2026-05-04");
    return 0;
}

新手避坑指南

这几点千万别踩雷,照着做就完全没事:

1. Shell 的 echo 必须加 -e

# 错误
echo "\033[31m红色文字\033[0m"

# 正确
echo -e "\033[31m红色文字\033[0m"

2. 结尾必须加 \033[0m

忘记加 \033[0m 重置颜色,整个终端都会变色,后续所有输出都带着这个颜色。

3. 日志存文件不要加颜色

彩色 ANSI 码写入文件会变成乱码。彩色日志只适合终端调试,正式文件用黑白就好。


总结

真的别再用枯燥的黑白日志折磨自己了,就一行代码的小事。

调试的时候,报错、提示、成功分得明明白白,再也不用盯着密密麻麻的文字抠细节。省下找 bug 的时间,准点下班、安心摸鱼。

赶紧用起来吧!

版权声明

作者linuxROS
协议本作品采用 CC BY-NC-SA 4.0 许可协议:署名-非商业性使用-相同方式共享
关注欢迎关注微信公众号 linuxROS,获取更多机器人 / 嵌入式 / Linux 干货
返回首页