前端日志分级怎么合理设置才不会影响性能?

令狐镇逵 阅读 5

我们项目里现在所有日志都用console.log,上线后发现控制台太乱,想按 info/warn/error 分级,但又怕加太多判断影响性能。有没有轻量又清晰的做法?

比如我现在这样写,感觉每次都要判断环境,重复代码太多了:

const log = {
  info: (msg) => process.env.NODE_ENV === 'development' && console.log(msg),
  warn: (msg) => process.env.NODE_ENV === 'development' && console.warn(msg),
  error: (msg) => console.error(msg) // 错误始终要记录
};
我来解答 赞 12 收藏
二维码
手机扫码查看
1 条解答
Designer°雨欣
你的问题在于运行时每次都做环境判断,这个确实有点浪费。核心思路是把环境判断移到模块加载时做掉,生产环境直接替换成空函数。

最简单直接的写法:

// logger.js
const isDev = process.env.NODE_ENV === 'development';

export default {
info: isDev ? console.log : () => {}, warn: isDev ? console.warn : () => {},
error: console.error
};


这样写的好处是环境判断只在模块初始化时执行一次。生产环境下 info 和 warn 会被替换成空函数 () => {},调用时完全没有判断逻辑,开销几乎为零。

如果你需要更灵活分级(比如测试环境只开 warn 以上),可以这样:

// logger.js
const levels = { error: 0, warn: 1, info: 2, debug: 3 };

// 根据环境设置当前级别
const env = process.env.NODE_ENV;
const currentLevel = env === 'production' ? 0 : env === 'test' ? 1 : 3;

export default {
debug: (msg) => levels.debug <= currentLevel && console.log(msg),
info: (msg) => levels.info <= currentLevel && console.log(msg),
warn: (msg) => levels.warn <= currentLevel && console.warn(msg),
error: (msg) => console.error(msg)
};


这种写法利用了短路求值,生产环境 level 是 0,只有 error 条件成立。其他级别直接返回 false,不会执行 console 方法。

另外注意安全方面:生产环境如果真的需要记录日志,光用 console 可不行,最好接一个真正的日志服务,可以考虑把 error 级别的日志上报到监控系统,而不是只打印到控制台。
点赞
2026-03-14 06:00