JavaScript 应用程序日志记录:最佳实践 — 第 3 部分
在本系列关于 JavaScript 日志记录的最后一篇文章中,我们将探讨有助于在 Node.js 应用程序中构建可靠监控系统的高级技术和工具。这些内容既适合 学习,也适合实际应用——从 JavaScript 初学者 到经验丰富的开发者。我们将讨论结构化日志、日志轮转、与外部服务的集成以及安全性。
1. Node.js 中的结构化日志
常规的 console.log() 不适合生产环境。应使用生成 JSON 格式日志的库,这有助于简化和分析日志。
使用 Winston 库的示例
const winston = require('winston');
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }) ]});
// 使用方式logger.info('用户已注册', { userId: 123, email: 'user@example.com' });logger.error('数据库错误', { error: err.message, stack: err.stack });这种方法使你能够按级别、时间和上下文轻松过滤日志。这在 编程 微服务时尤为重要。
2. 日志轮转与大小管理
日志可能会迅速填满磁盘。请使用轮转机制——自动归档旧文件。在 Node.js 中,通过 winston-daily-rotate-file 模块可以轻松实现。
轮转配置示例
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({ filename: 'logs/application-%DATE%.log', datePattern: 'YYYY-MM-DD', maxSize: '20m', maxFiles: '14d'});
const logger = winston.createLogger({ transports: [transport]});这将确保日志每天不超过 20 MB,并保留 14 天。
3. 与外部监控服务的集成
为了实现集中式日志收集,请使用 Logstash、Datadog 或 Sentry 等服务。在 JavaScript 中,可以通过 Winston 传输通道实现。
将日志发送到 Logstash 的示例
const { LogstashTransport } = require('winston-logstash-transport');
const logger = winston.createLogger({ transports: [ new LogstashTransport({ host: 'logstash.example.com', port: 5000 }) ]});这样,你就可以实时分析日志、构建仪表盘并设置警报。
4. 日志安全
切勿记录敏感数据:密码、令牌、信用卡号。请使用过滤器或掩码函数。
数据掩码示例
function maskSensitive(obj) { const masked = { ...obj }; if (masked.password) masked.password = '***'; if (masked.token) masked.token = '***'; return masked;}
logger.info('用户请求', maskSensitive(req.body));这将保护你免受数据泄露,并帮助你遵守 GDPR 法规。
总结
在本部分中,我们涵盖了在 Node.js 上的 JavaScript 应用程序中的关键日志实践:结构化日志、轮转、与外部系统的集成以及安全性。这些技术将帮助你创建可靠且易于维护的系统。对于 学习,我们建议从 Winston 开始,然后逐步引入更复杂的工具。JavaScript 初学者 可能会觉得有些挑战,但实践会让你成为专业人士。祝 编程 顺利!