mm_logs
v1.6.5
Published
高性能 Node.js 日志模块,支持多级别日志、文件轮转、事件钩子和灵活配置。
Maintainers
Readme
mm_logs
高性能 Node.js 日志模块,支持多级别日志、文件轮转、事件钩子和灵活配置。
特性
- 📝 多级别日志: debug, info, success, warn, error, fatal
- 💾 文件轮转: 按大小自动分割日志文件
- 🎨 双格式输出: 支持 JSON 和文本格式
- 🖥️ 双路输出: 同时输出到控制台和文件
- 🌐 HTTP 日志: 单独记录 HTTP 请求日志
- 🔍 日志查询: 支持按日期、时间、关键词查询
- 🎯 事件钩子: 支持日志记录前后的事件监听
- ⚡ 异步处理: 非阻塞日志写入,提高应用性能
- 🧹 自动清理: 自动管理日志文件数量
安装
npm install mm_logs快速开始
const { Log } = require('mm_logs');
// 创建日志实例
const logger = new Log({
level: 'debug',
dir: './logs',
console: true,
file: true
});
// 记录日志
logger.debug('调试信息');
logger.info('普通信息');
logger.success('成功信息');
logger.warn('警告信息');
logger.error('错误信息');
logger.fatal('致命错误');
// 记录带参数的日志
logger.info('用户登录', { username: 'admin', ip: '127.0.0.1' });
// 记录 HTTP 日志
logger.http('info', 'API 请求', { method: 'GET', url: '/api/users' });配置选项
| 配置项 | 类型 | 默认值 | 描述 |
|-------|------|-------|------|
| level | string | 'debug' | 日志级别 |
| dir | string | './log' | 日志文件目录 |
| console | boolean | true | 是否输出到控制台 |
| file | boolean | true | 是否输出到文件 |
| max_size | number | 3145728 (3MB) | 单个日志文件最大大小(字节) |
| max_files | number | 7 | 保留的日志文件最大数量 |
| date_pattern | string | '_yyyy-MM-dd' | 日期格式 |
| content_pattern | string | '%d{hh:mm:ss.SSS} [%p] - %m' | 日志内容格式 |
| file_name_pattern | string | '{type}_{date}_{index}' | 文件名格式 |
| is_json | boolean | false | 是否使用 JSON 格式输出 |
日志级别
日志级别从低到高排序:
debug: 调试信息,开发环境使用info: 普通信息,记录程序运行状态success: 成功信息,记录操作成功warn: 警告信息,需要关注但不影响运行error: 错误信息,功能异常但程序仍可运行fatal: 致命错误,程序无法继续运行
高级用法
批量记录日志
logger.batch([
{ level: 'info', message: '用户登录', args: [{ username: 'admin' }] },
{ level: 'warn', message: '密码错误', args: [{ username: 'user123' }] }
]);重新配置
// 动态更新配置
logger.reconfig({
level: 'info',
is_json: true,
max_size: 5 * 1024 * 1024 // 5MB
});日志查询
const result = logger.find({
date: '2023-12-01', // 查询日期
start_time: '09:00:00', // 起始时间
end_time: '18:00:00', // 结束时间
keyword: 'error', // 关键词
page: 1, // 页码
size: 50 // 每页大小
});
console.log(result.logs); // 日志列表
console.log(result.pagination); // 分页信息事件监听
// 日志记录前
logger.on('before_log', (data) => {
// 可以在这里处理敏感信息脱敏
console.log('准备记录日志:', data);
});
// 日志记录后
logger.on('record:after', (result) => {
// 可以在这里进行性能监控
console.log('日志记录完成:', result);
});
// 日志记录错误
logger.on('record:error', (error) => {
console.error('日志记录出错:', error);
});
// 查询错误
logger.on('find:error', (error) => {
console.error('日志查询出错:', error);
});刷新与销毁
// 刷新日志缓存到磁盘
logger.flush().then(() => {
console.log('日志已刷新');
});
// 销毁日志实例
logger.destroy().then(() => {
console.log('日志实例已销毁');
});日志文件
模块自动创建三种类型的日志文件:
debug_{date}_{index}.log: 记录 debug、info、success 级别error_{date}_{index}.log: 记录 warn、error、fatal 级别http_{date}_{index}.log: 记录 HTTP 相关日志
当文件大小超过 max_size 时,自动创建新文件(索引递增)。
最佳实践
1. 全局日志实例
// logger.js
const { Log } = require('mm_logs');
const logger = new Log({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
dir: './logs',
console: true,
file: true,
is_json: process.env.NODE_ENV === 'production'
});
module.exports = logger;2. Express 集成
const express = require('express');
const logger = require('./logger');
const app = express();
// HTTP 请求日志中间件
app.use((req, res, next) => {
const startTime = Date.now();
const originalSend = res.send;
res.send = function(body) {
const duration = Date.now() - startTime;
const logData = {
method: req.method,
url: req.url,
status: res.statusCode,
duration: duration,
ip: req.ip
};
// 根据状态码记录不同级别
if (res.statusCode >= 500) {
logger.http('error', 'HTTP 错误', logData);
} else if (res.statusCode >= 400) {
logger.http('warn', 'HTTP 警告', logData);
} else {
logger.http('info', 'HTTP 请求', logData);
}
return originalSend.call(this, body);
};
next();
});
app.get('/', (req, res) => {
logger.debug('处理请求', { path: req.path });
res.send('Hello World');
});
app.listen(3000);3. 错误处理
// error-handler.js
const logger = require('./logger');
function handleError(err, req, res, next) {
logger.error('应用错误', {
message: err.message,
stack: process.env.NODE_ENV === 'production' ? '' : err.stack,
path: req.path,
method: req.method
});
res.status(500).json({
error: process.env.NODE_ENV === 'production' ? 'Internal Server Error' : err.message
});
}
module.exports = handleError;兼容性
支持 Node.js 12.x 及以上版本。
性能
- 使用流式写入,避免阻塞主线程
- 异步日志处理,提高应用响应速度
- 自动轮转和清理,保持文件系统整洁
- 优化的文件 I/O,减少磁盘操作开销
许可证
MIT License
