柯里化在日志系统中最自然、最实用的落地方式是将多维上下文(如环境、模块名、默认级别)提前固化,生成轻量、无状态、语义明确的专用记录器,支持模块级logger、命名工厂、结构化字段注入及级别快捷方法。

柯里化在日志系统中最自然、最实用的落地方式,就是把多维上下文(如环境、模块名、日志级别默认值)提前固化,生成轻量、无状态、语义明确的专用记录器。
固定环境与模块名,生成模块级 logger
原始日志函数通常形如 log(level, module, env, message)。柯里化后可分步固化:先填 env,再填 module,最终得到只收 level 和 message 的函数。
- 例如:
const prodLogger = curry(log)('prod')('payment')→ 得到prodLogger('ERROR', 'timeout') - 每个模块只需定义一次,复用时不重复传环境或模块名,避免硬编码和拼写错误
- 生成的函数仍保持完整调用能力,也可进一步柯里化为
prodLogger('INFO')生成只等消息的终端函数
封装成“命名 logger”工厂
不手动链式调用,而是抽象为可配置的工厂函数:
const createLogger = curry((env, module, loggerFn) => (level, msg) => loggerFn(env, module, level, msg))const authLogger = createLogger('staging')('auth')(console.log)- 这样既解耦了日志行为(
console.log/sendToELK),又隔离了上下文(env + module)
配合结构化日志字段自动注入
柯里化不只是减少参数,更是为字段注入提供执行时机:
- 预设的
env和module可直接作为结构化日志的固定字段,无需每次构造对象 - 例如:
const jsonLogger = curry((env, module) => (level, msg) => ({ timestamp: Date.now(), env, module, level, msg })) - 调用
jsonLogger('dev')('api')('WARN', 'rate limit hit')直接产出完整 JSON 日志项
与日志级别快捷方法结合
真正贴近开发体验的是生成 .info()、.error() 等方法:
const makeLogger = (env, module) => ({ info: (m) => log(env, module, 'INFO', m), error: (m) => log(env, module, 'ERROR', m) })- 这本质是柯里化的面向对象表达:固化前两个参数后,返回一组已绑定上下文的方法
- 比全局
logger.info(...)更清晰,比每次写log('prod', 'user', ...)更安全











