如何使用Winston为日志中的变量设置不同显示颜色?
Winston实现日志消息与变量不同颜色的方法
要让Winston日志里的消息和变量显示不同颜色,核心是在格式化环节单独对变量应用颜色样式,再与消息拼接输出。以下是具体实现方案:
1. 准备依赖(可选)
如果需要更丰富的颜色样式,可以安装chalk:
npm install chalk
如果用Winston自带的颜色工具,无需额外安装。
2. 修改Winston配置,添加变量着色逻辑
假设你已有包含自定义级别、时间格式化的基础配置,直接修改格式化部分即可:
方案一:使用chalk实现变量着色
const winston = require('winston'); const chalk = require('chalk'); // 自定义日志级别 const customLevels = { levels: { error: 0, warn: 1, info: 2, debug: 3 }, colors: { error: 'red', warn: 'yellow', info: 'green', debug: 'blue' } }; winston.addColors(customLevels.colors); const logger = winston.createLogger({ levels: customLevels.levels, format: winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.printf(({ timestamp, level, message, ...vars }) => { // 消息用对应级别的颜色 const coloredMessage = winston.config.colorize(level, message); // 变量统一用青色(可自行调整) let coloredVars = ''; if (Object.keys(vars).length > 0) { coloredVars = chalk.cyan(` ${JSON.stringify(vars)}`); } return `[${timestamp}] ${coloredMessage}${coloredVars}`; }) ), transports: [ new winston.transports.Console({ // 确保控制台支持颜色输出 format: winston.format.colorize({ all: false }) }) ] }); // 测试调用 logger.info('用户登录成功', { userId: 123, username: 'john_doe' }); logger.warn('磁盘空间不足', { used: '85%', total: '100GB' });
方案二:使用Winston内置颜色工具
不想额外安装依赖的话,直接用Winston自带的colorize方法:
// 其他配置与方案一一致,仅修改printf部分 winston.format.printf(({ timestamp, level, message, ...vars }) => { const coloredMessage = winston.config.colorize(level, message); let coloredVars = ''; if (Object.keys(vars).length > 0) { // 用内置的cyan颜色给变量上色 coloredVars = winston.config.colorize('cyan', ` ${JSON.stringify(vars)}`); } return `[${timestamp}] ${coloredMessage}${coloredVars}`; })
关键细节
- 变量提取:通过
...vars解构出所有额外传入的变量参数,确保所有需要着色的内容都被捕获 - 颜色开关:控制台传输器里设置
colorize({ all: false }),避免全局颜色覆盖我们自定义的样式 - 颜色自定义:可根据需求调整变量颜色,比如chalk支持
chalk.magenta()、chalk.whiteBright(),Winston内置支持的颜色包括'red'、'yellow'、'green'、'blue'、'cyan'、'magenta'等
内容的提问来源于stack exchange,提问作者Lauty
相关产品推荐
相关产品推荐

