柯里化日志分级是通过柯里化函数将日志级别和输出目标分层固化,调用时仅需传入消息内容即可自动携带上下文与格式,实现可复用、可组合、可配置的日志模块。

什么是柯里化日志分级?
柯里化日志分级,是指把 日志级别(如 debug/info/warn/error) 和 目标输出(如 console、文件、远程服务) 通过柯里化函数分层固化,让调用时只需传入消息内容,自动带上下文和格式。它不是单纯封装 console.log,而是构建可复用、可组合、可配置的日志模块。
基础柯里化日志工厂
用闭包 + 柯里化生成带固定级别和前缀的日志函数:
const createLogger = (level, prefix = '') => {
return (target = console) => (msg, ...args) => {
const timestamp = new Date().toISOString().slice(11, 19);
const formatted = `[${level.toUpperCase()} ${timestamp}] ${prefix}${msg}`;
target[level]?.(formatted, ...args) ?? target.log(formatted, ...args);
};
};
// 生成不同级别的日志函数
const debug = createLogger('debug')();
const info = createLogger('info')();
const warn = createLogger('warn')();
const error = createLogger('error')();
debug('用户登录', { userId: 123 }); // [DEBUG 14:22:05] 用户登录 {userId: 123}
支持模块命名与多目标输出
进一步柯里化:先固定模块名,再固定输出目标,最后接收消息:
const moduleLogger = (moduleName) => (target = console) => {
return {
debug: (msg, ...args) => target.debug?.(`[${moduleName}] ${msg}`, ...args) || target.log(`[DEBUG ${moduleName}] ${msg}`, ...args),
info: (msg, ...args) => target.info?.(`[${moduleName}] ${msg}`, ...args) || target.log(`[INFO ${moduleName}] ${msg}`, ...args),
warn: (msg, ...args) => target.warn?.(`[${moduleName}] ${msg}`, ...args) || target.log(`[WARN ${moduleName}] ${msg}`, ...args),
error: (msg, ...args) => target.error?.(`[${moduleName}] ${msg}`, ...args) || target.log(`[ERROR ${moduleName}] ${msg}`, ...args),
};
};
// 使用示例
const authLog = moduleLogger('Auth')(console);
authLog.info('token refreshed');
authLog.error('invalid signature', { token: 'xxx' });
// 也可切换到自定义目标(如上报服务)
const reportTarget = {
error: (msg, data) => fetch('/api/log', {
method: 'POST',
body: JSON.stringify({ level: 'error', module: 'Auth', msg, data })
})
};
const authReport = moduleLogger('Auth')(reportTarget);
authReport.error('DB timeout');
结合环境与开关控制输出
在柯里化链中加入环境判断,避免生产环境打印 debug 日志:
const envLogger = (env = 'development') => (moduleName) => (target = console) => {
const shouldLog = (level) => env === 'development' || level !== 'debug';
return {
debug: (msg, ...args) => {
if (shouldLog('debug')) target.debug?.(`[${moduleName}] ${msg}`, ...args);
},
info: (msg, ...args) => target.info?.(`[${moduleName}] ${msg}`, ...args),
warn: (msg, ...args) => target.warn?.(`[${moduleName}] ${msg}`, ...args),
error: (msg, ...args) => target.error?.(`[${moduleName}] ${msg}`, ...args),
};
};
// 生产环境自动过滤 debug
const apiLog = envLogger('production')('API')(console);
apiLog.debug('this will not print'); // 被静默
apiLog.error('request failed'); // 仍会输出
小结:柯里化日志的核心价值
柯里化不是炫技,而是让日志能力解耦:
• 模块名、环境、输出目标 —— 提前固化,不侵入业务代码
• 级别调用 —— 保持语义清晰,如 userLog.warn() 直观表达意图
• 易扩展 —— 新增「slow」或「audit」级别,只需加一个柯里化分支
• 易测试 —— 替换 target 为 mock 对象,即可断言日志是否触发
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











