柯里化实现日志等级过滤的核心是将最小允许级别固化为参数,返回只接收消息的函数,在内部通过数组索引比较级别优先级并决定是否输出;支持动态级别、多环境适配及与console方法对齐的代理对象封装。

用柯里化实现日志等级过滤,核心是把“日志级别”提前固化为函数参数,返回一个只接收消息的函数,再在内部判断是否满足输出条件。
基础柯里化日志工厂
定义一个可配置级别的日志生成器,它接收一个最小允许级别(如 'warn'),返回对应的日志函数:
- 约定级别顺序:'debug'
- 用数组索引比较优先级,避免硬编码 if-else 链
- 返回的函数保留级别判断逻辑,调用时只传消息和可选数据
const levels = ['debug', 'info', 'warn', 'error'];
const createLogger = (minLevel) => {
const minIndex = levels.indexOf(minLevel);
return (msg, data) => {
// 假设当前执行环境有全局 level(或从上下文读取)
const currentLevel = 'warn'; // 实际中可能来自 config 或 console.level
const currentIndex = levels.indexOf(currentLevel);
if (currentIndex >= minIndex) {
console[currentLevel]?.(msg, data);
}
};
};
const warnLogger = createLogger('warn'); // 只输出 warn 及以上
warnLogger('API failed', { status: 500 }); // ✅ 输出
warnLogger('Request started'); // ❌ 不输出(info 级别低于 warn)
支持动态当前级别 + 多环境适配
真实项目中,当前日志级别常由环境变量或配置决定。柯里化可配合闭包捕获配置,让每个 logger 实例独立响应自身规则:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 把 currentLevel 作为 createLogger 的第二个参数传入,或从外部作用域读取
- 也可返回一个“检查器函数”,再组合 console 方法,提高复用性
- 例如:curriedFilter('warn') 返回 (level) => level === 'warn' || level === 'error'
const filterByLevel = (minLevel) => (level) =>
levels.indexOf(level) >= levels.indexOf(minLevel);
const isWarnOrHigher = filterByLevel('warn');
console.log(isWarnOrHigher('info')); // false
console.log(isWarnOrHigher('error')); // true
// 结合实际输出
const log = (level, msg, data) => {
if (isWarnOrHigher(level)) {
console[level]?.(msg, data);
}
};
log('warn', 'Timeout'); // ✅
与 console 方法自动对齐
为了让 logger 行为贴近原生 console(如支持 .warn()、.error() 方法),可以用柯里化封装一层代理:
立即学习“Java免费学习笔记(深入)”;
- createLogger('error') 返回一个对象,其每个方法都带级别检查
- 调用 logger.warn(...) 时,先比对 warn 和设定的最小级别,再决定是否透传给 console
- 这样既保持语义清晰,又不破坏开发者习惯
const createLogger = (minLevel) => {
const shouldLog = (level) => levels.indexOf(level) >= levels.indexOf(minLevel);
return {
debug: (...args) => shouldLog('debug') && console.debug?.(...args),
info: (...args) => shouldLog('info') && console.info?.(...args),
warn: (...args) => shouldLog('warn') && console.warn?.(...args),
error: (...args) => shouldLog('error') && console.error?.(...args),
};
};
const prodLogger = createLogger('error');
prodLogger.warn('This will not print'); // 被过滤
prodLogger.error('Critical failure'); // ✅ 输出
小结:柯里化的价值在哪
它把“什么级别能过”这个策略提前锁定,避免每次调用都重复解析配置;每个 logger 实例职责单一、可预测;还能轻松组合,比如 filterByLevel('warn') 和 throttle(1000) 套在一起做限频日志。不复杂但容易忽略。

















