可通过柯里化预先绑定模块名生成带上下文的日志函数,核心是用闭包固定模块名参数;支持多级路径扩展、bind轻量实现及生产环境自动剥离前缀。

可以通过柯里化预先绑定模块名,生成带上下文的日志函数,让每次调用自动携带模块标识。
核心思路:用柯里化固定模块名参数
日志函数通常形如 log(level, message),而模块名属于“固定上下文”。柯里化可把 log(moduleName) 变成一个新函数,后续只传 level 和 message 即可,模块名被闭包保留。
示例实现:
const createLogger = (moduleName) => {
return (level, message, ...args) => {
console[level](`[${moduleName}] ${message}`, ...args);
};
};
// 使用
const userLog = createLogger('UserModule');
userLog('info', '登录成功'); // [UserModule] 登录成功
userLog('error', '请求失败:', new Error('timeout'));
支持多级模块路径的柯里化扩展
实际项目中模块名可能是 'api/auth' 或 'components/Modal'。可进一步柯里化为两级工厂函数,灵活组合:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
const withModule = (moduleName) => (logger) => (...args) =>
logger(...args.map(a => typeof a === 'string' ? `[${moduleName}] ${a}` : a));
// 组合基础 log 函数
const baseLog = (level, msg, ...rest) => console[level](msg, ...rest);
const apiLog = withModule('API')(baseLog).bind(null, 'info');
apiLog('用户数据获取完成'); // info: [API] 用户数据获取完成
结合 bind 实现轻量柯里化(兼容旧写法)
不依赖箭头函数时,可用 Function.prototype.bind 快速实现相同效果:
-
console.log.bind(console, '[Auth]')固定前缀,但只能前置,无法插入中段 - 更实用的是封装一层:
const authLog = (...args) => console.info('[Auth]', ...args) - 若需支持 level 动态,仍推荐闭包方式,语义清晰、控制力强
配合配置与环境做条件注入
开发期开启模块名前缀,生产环境自动剥离(减少体积):
const createLogger = (moduleName) => {
if (process.env.NODE_ENV === 'production') {
return (level, message, ...args) => console[level](message, ...args);
}
return (level, message, ...args) => {
console[level](`[${moduleName}] ${message}`, ...args);
};
};

















