突破日志边界:electron-log自定义日志级别完全指南
你是否在Electron应用开发中遇到过日志级别不足的困境?默认的error/warn/info体系无法满足复杂场景需求?本文将带你掌握electron-log自定义日志级别的完整实现方案,从基础扩展到高级应用,让日志系统真正适配你的业务需求。
读完本文你将获得:
- 3种自定义日志级别实现方案(基础扩展/优先级调整/全流程定制)
- 日志级别与 transports 联动配置技巧
- 类型安全保障的TypeScript声明文件配置
- 生产环境日志分级实践案例
- 常见问题解决方案与性能优化建议
日志级别的核心价值
日志级别(Log Level)是日志系统的基础架构,它通过对日志信息进行分类分级,实现:
- 信息过滤:在开发环境显示详细调试日志,生产环境仅保留关键信息
- 问题定位:通过级别快速定位系统异常
- 性能优化:减少不必要的日志输出提升应用性能
- 数据分析:结构化日志便于后续统计分析
electron-log默认提供6个级别,按严重程度从高到低排序:
| 级别 | 严重程度 | 适用场景 |
|---|---|---|
| error | 6 | 影响系统运行的严重错误 |
| warn | 5 | 不影响主流程的警告信息 |
| info | 4 | 重要业务流程节点信息 |
| verbose | 3 | 详细业务操作步骤 |
| debug | 2 | 开发调试信息 |
| silly | 1 | 极详细的追踪信息(通常禁用) |
基础实现:快速扩展日志级别
添加新级别
electron-log提供了addLevel()方法用于扩展日志级别,最简单的实现只需两步:
// 1. 添加新级别
log.addLevel('notice');
// 2. 使用新级别
log.notice('支付流程已启动');
log.notice('用户登录成功', { userId: '12345', timestamp: new Date() });
默认情况下,新添加的级别会被追加到现有级别列表末尾,优先级低于silly。上述代码执行后,级别顺序变为: error > warn > info > verbose > debug > silly > notice
调整级别优先级
通过指定索引位置,可以控制新级别在优先级体系中的位置:
// 在info(索引3)之前插入notice级别
log.addLevel('notice', 3);
// 现在级别顺序变为:error(0) > warn(1) > info(2) > notice(3) > verbose(4) > debug(5) > silly(6)
索引值决定了级别在数组中的位置,数值越小优先级越高。你可以通过以下代码查看当前级别顺序:
console.log('当前日志级别顺序:', log.levels);
// 输出: ["error", "warn", "info", "notice", "verbose", "debug", "silly"]
高级配置: transports 级别控制
添加自定义级别后,需要确保日志传输器(transports)正确处理这些级别。每个transport都可以独立设置日志级别阈值:
控制台输出配置
// 控制台只输出notice及以上级别
log.transports.console.level = 'notice';
// 文件传输保留所有级别
log.transports.file.level = 'silly';
自定义传输器适配
为自定义传输器添加级别支持:
// 创建支持自定义级别的传输器
log.transports.security = (message) => {
// 仅处理security级别日志
if (message.level !== 'security') return;
const text = `[${message.date.toISOString()}] SECURITY: ${message.data.join(' ')}`;
fs.appendFileSync('/var/log/app-security.log', text + '\n');
};
// 设置传输器级别
log.transports.security.level = 'security';
级别比较工具函数
使用内置的compareLevels方法判断日志是否应该被记录:
// 判断notice级别是否应该被记录(当前transport级别为info)
const shouldLog = log.compareLevels('info', 'notice');
console.log(shouldLog); // true,因为notice级别高于info
// 实现自定义级别过滤逻辑
log.hooks.push((message, transport, transportName) => {
// 对于安全传输器,仅处理security级别
if (transportName === 'security' && message.level !== 'security') {
return false; // 跳过非安全级别日志
}
return message;
});
类型安全:TypeScript声明扩展
为确保TypeScript项目中的类型安全,需要扩展日志级别定义:
创建扩展声明文件
新建src/types/electron-log.d.ts文件:
import 'electron-log';
declare module 'electron-log' {
interface LogFunctions {
// 添加自定义级别函数定义
notice(...params: any[]): void;
security(...params: any[]): void;
}
// 扩展LogLevel类型
type LogLevel = 'error' | 'warn' | 'info' | 'notice' | 'verbose' | 'debug' | 'silly' | 'security';
}
tsconfig配置
确保TypeScript识别扩展声明:
{
"compilerOptions": {
"typeRoots": ["./src/types", "./node_modules/@types"],
// 其他配置...
}
}
实战案例:电商系统日志分级方案
以下是一个完整的电商应用日志级别扩展方案,包含业务特定级别:
1. 定义业务级别
// logger.js
import log from 'electron-log';
// 添加业务特定级别
log.addLevel('security', 1); // 安全相关,优先级高于warn
log.addLevel('business', 3); // 业务流程,位于info和verbose之间
log.addLevel('payment', 2); // 支付相关,位于warn和info之间
log.addLevel('performance', 5); // 性能监控,位于verbose和debug之间
export default log;
2. 配置传输策略
// 配置不同传输器的级别策略
log.transports.console.level = 'business';
log.transports.file.level = 'silly';
// 创建专用支付日志传输器
log.transports.payment = (message) => {
if (message.level !== 'payment') return;
const logPath = path.join(app.getPath('userData'), 'payments.log');
const entry = `[${message.date.toISOString()}] ${message.data.join(' ')}\n`;
fs.appendFileSync(logPath, entry);
};
log.transports.payment.level = 'payment';
3. 业务日志应用
// 安全日志
log.security('用户尝试多次登录失败', { userId: '123', ip: '192.168.1.1' });
// 支付流程
log.payment('支付发起', { orderId: 'ORD-12345', amount: 99.99 });
log.payment('支付成功', { orderId: 'ORD-12345', transactionId: 'TXN-67890' });
// 业务流程
log.business('订单创建', { orderId: 'ORD-12345', items: 3 });
log.business('订单完成', { orderId: 'ORD-12345', total: 129.97 });
// 性能监控
log.performance('商品列表渲染', { duration: 120, items: 42 });
log.performance('数据库查询', { query: 'SELECT * FROM products', duration: 45 });
4. 日志级别动态调整
// 根据环境动态调整日志级别
if (process.env.NODE_ENV === 'development') {
log.transports.console.level = 'silly';
} else {
log.transports.console.level = 'info';
// 生产环境启用远程日志收集
log.transports.remote = createRemoteTransport('https://log-collector.example.com');
log.transports.remote.level = 'error';
}
// 运行时调整级别
ipcMain.on('set-log-level', (event, level) => {
if (log.levels.includes(level)) {
log.transports.console.level = level;
event.reply('log-level-updated', level);
}
});
常见问题解决方案
级别优先级冲突
问题:添加新级别后日志不按预期输出
解决方案:检查级别索引值,使用log.levels查看完整级别顺序
// 修复级别顺序
console.log('当前级别顺序:', log.levels); // 查看顺序
log.levels = ['error', 'warn', 'security', 'info', 'payment', 'business', 'verbose', 'debug', 'silly'];
传输器不响应新级别
问题:自定义级别日志未被传输器处理
解决方案:确保传输器级别设置正确
// 确保传输器级别设置为false或有效级别
log.transports.console.level = false; // 禁用传输器
log.transports.console.level = 'silly'; // 启用所有级别
多实例级别同步
问题:多个Logger实例级别配置不一致
解决方案:创建基础配置函数统一管理
function createLoggerInstance(logId) {
const instance = log.create({ logId });
// 统一添加业务级别
instance.addLevel('security', 1);
instance.addLevel('payment', 2);
// 统一配置传输器
instance.transports.file.level = 'silly';
return instance;
}
// 创建实例
const networkLogger = createLoggerInstance('network');
const uiLogger = createLoggerInstance('ui');
性能优化与最佳实践
级别使用规范
| 级别 | 使用频率 | 数据量 | 存储策略 |
|---|---|---|---|
| error | 低 | 小 | 永久保存 |
| warn | 中 | 中 | 保存30天 |
| info | 中 | 中 | 保存14天 |
| 业务级别 | 中高 | 中 | 按业务需求定制 |
| verbose | 高 | 大 | 开发环境保留 |
| debug/silly | 极高 | 极大 | 仅本地开发保留 |
动态级别调整
实现基于应用状态的动态级别调整:
// 应用空闲时提高日志级别
let appActive = true;
setInterval(() => {
if (!appActive) {
log.transports.file.level = 'warn'; // 空闲时只记录重要日志
} else {
log.transports.file.level = 'silly';
}
}, 60000);
// 监听用户活动
ipcMain.on('user-active', () => {
appActive = true;
setTimeout(() => appActive = false, 300000); // 5分钟无活动视为空闲
});
生产环境最佳实践
// 生产环境日志配置
if (process.env.NODE_ENV === 'production') {
// 限制文件大小
log.transports.file.maxSize = 10 * 1024 * 1024; // 10MB
// 添加日志轮转钩子
log.hooks.push((message) => {
// 敏感数据脱敏
if (message.data.some(item => item?.password)) {
message.data = message.data.map(item =>
typeof item === 'object' ? { ...item, password: '***' } : item
);
}
return message;
});
}
总结与扩展学习
通过本文介绍的方法,你已经掌握了electron-log自定义日志级别的完整流程:
- 使用
addLevel()扩展基础级别 - 配置索引调整级别优先级
- 适配transports实现差异化日志收集
- 添加TypeScript类型支持确保类型安全
- 应用于实际业务场景的完整方案
进阶学习路径
- 日志聚合:结合ELK栈分析自定义级别日志
- 告警系统:基于security级别日志实现实时告警
- 用户行为分析:利用business级别日志构建用户画像
- 性能监控:通过performance级别日志优化应用瓶颈
掌握自定义日志级别,让你的Electron应用日志系统更加灵活、高效,为开发调试和线上问题定位提供强大支持。立即在项目中实施这些技巧,体验更智能的日志管理方式!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



