突破日志边界:electron-log自定义日志级别完全指南

突破日志边界:electron-log自定义日志级别完全指南

【免费下载链接】electron-log Just a simple logging module for your Electron application 【免费下载链接】electron-log 项目地址: https://gitcode.com/gh_mirrors/el/electron-log

你是否在Electron应用开发中遇到过日志级别不足的困境?默认的error/warn/info体系无法满足复杂场景需求?本文将带你掌握electron-log自定义日志级别的完整实现方案,从基础扩展到高级应用,让日志系统真正适配你的业务需求。

读完本文你将获得:

  • 3种自定义日志级别实现方案(基础扩展/优先级调整/全流程定制)
  • 日志级别与 transports 联动配置技巧
  • 类型安全保障的TypeScript声明文件配置
  • 生产环境日志分级实践案例
  • 常见问题解决方案与性能优化建议

日志级别的核心价值

日志级别(Log Level)是日志系统的基础架构,它通过对日志信息进行分类分级,实现:

  1. 信息过滤:在开发环境显示详细调试日志,生产环境仅保留关键信息
  2. 问题定位:通过级别快速定位系统异常
  3. 性能优化:减少不必要的日志输出提升应用性能
  4. 数据分析:结构化日志便于后续统计分析

electron-log默认提供6个级别,按严重程度从高到低排序:

级别严重程度适用场景
error6影响系统运行的严重错误
warn5不影响主流程的警告信息
info4重要业务流程节点信息
verbose3详细业务操作步骤
debug2开发调试信息
silly1极详细的追踪信息(通常禁用)

mermaid

基础实现:快速扩展日志级别

添加新级别

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自定义日志级别的完整流程:

  1. 使用addLevel()扩展基础级别
  2. 配置索引调整级别优先级
  3. 适配transports实现差异化日志收集
  4. 添加TypeScript类型支持确保类型安全
  5. 应用于实际业务场景的完整方案

进阶学习路径

  1. 日志聚合:结合ELK栈分析自定义级别日志
  2. 告警系统:基于security级别日志实现实时告警
  3. 用户行为分析:利用business级别日志构建用户画像
  4. 性能监控:通过performance级别日志优化应用瓶颈

掌握自定义日志级别,让你的Electron应用日志系统更加灵活、高效,为开发调试和线上问题定位提供强大支持。立即在项目中实施这些技巧,体验更智能的日志管理方式!


【免费下载链接】electron-log Just a simple logging module for your Electron application 【免费下载链接】electron-log 项目地址: https://gitcode.com/gh_mirrors/el/electron-log

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值