关于Nodejs的后台日志功能
关于Nodejs的后台日志功能
代码如下:问题是:1、访问日志文件没有被写入 2、这俩文件怎么把他们创建在和服务端启动文件在同一个目录下
fs = require('fs'),
accessLogfile = fs.createWriteStream('./logs/access.log', {flags: 'a'}), //访问日志
errorLogfile = fs.createWriteStream('./logs/error.log', { flags: 'a' }); //错误日志
app.configure('production', function () {
app.use(express.logger({ stream: accessLogfile }));
app.use(function (err, req, res, next) {
var now = new Date();
var time = now.getFullYear() + '-' + now.getMonth() + '-' + now.getDate() + ' '
+ now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
var meta = '[' + time + '] '+req.method+' ' + req.url + '\r\n';
errorLogfile.write(meta + err.stack + '\r\n\r\n\r\n');
next();
});
});
6 回复
好的,针对你提到的问题和代码片段,我将详细解释如何在 Node.js 应用程序中正确配置后台日志功能,并确保日志文件能够被正确地写入到与服务端启动文件相同的目录下。
问题分析
-
访问日志文件没有被写入:
- 可能的原因包括:路径错误、权限问题或日志文件未被正确打开。
-
日志文件创建在同一目录下:
- 确保相对路径正确指向服务启动文件所在的目录。
解决方案
以下是一个改进后的示例代码,该代码使用 winston
日志库来处理日志记录。winston
是一个广泛使用的日志库,支持多种传输方式(如文件、控制台等)。
安装依赖
首先,你需要安装 winston
和 winston-daily-rotate-file
(用于每日轮转日志文件):
npm install winston winston-daily-rotate-file
示例代码
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
// 创建一个日志目录(如果不存在)
const logDir = './logs';
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir);
}
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: { service: 'your-service-name' },
transports: [
new winston.transports.Console({
format: winston.format.simple()
}),
new DailyRotateFile({
filename: `${logDir}/%DATE%-access.log`,
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
timestamp: true,
maxFiles: '30d'
}),
new DailyRotateFile({
filename: `${logDir}/%DATE%-error.log`,
level: 'error',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
timestamp: true,
maxFiles: '30d'
})
]
});
// 将日志对象挂载到应用中
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
logger.info(`${req.method} ${req.url} - ${duration}ms`);
});
next();
});
// 错误处理中间件
app.use((err, req, res, next) => {
logger.error(`${err.message} - ${req.method} ${req.url}`);
next(err);
});
代码解释
- 日志目录检查:确保日志文件所在目录存在。
- 创建日志实例:使用
winston
创建日志实例,并定义了两个传输方式:控制台输出和每日轮转文件。 - 请求日志:通过中间件记录每个请求的时间。
- 错误日志:通过错误处理中间件捕获并记录错误信息。
通过这种方式,你可以确保日志文件被正确地写入到指定目录,并且在生产环境中提供更可靠的日志记录机制。
日志用log4js吧 http://blog.fens.me/nodejs-log4js/
- 错误日志: 访问错误通过Level配置
- 系统错误: 通过程序判断,用程序输出 logger.error(‘Cheese is too ripe!’);
- 输出目录:filename: ‘logs/access.log’,
你把log4js的配置,整个贴出来
我的项目没有单独做日志设置,因为项目是用 forever 启动的,forever 本身具有日志记录功能