关于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 应用程序中正确配置后台日志功能,并确保日志文件能够被正确地写入到与服务端启动文件相同的目录下。

问题分析

  1. 访问日志文件没有被写入

    • 可能的原因包括:路径错误、权限问题或日志文件未被正确打开。
  2. 日志文件创建在同一目录下

    • 确保相对路径正确指向服务启动文件所在的目录。

解决方案

以下是一个改进后的示例代码,该代码使用 winston 日志库来处理日志记录。winston 是一个广泛使用的日志库,支持多种传输方式(如文件、控制台等)。

安装依赖

首先,你需要安装 winstonwinston-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);
});

代码解释

  1. 日志目录检查:确保日志文件所在目录存在。
  2. 创建日志实例:使用 winston 创建日志实例,并定义了两个传输方式:控制台输出和每日轮转文件。
  3. 请求日志:通过中间件记录每个请求的时间。
  4. 错误日志:通过错误处理中间件捕获并记录错误信息。

通过这种方式,你可以确保日志文件被正确地写入到指定目录,并且在生产环境中提供更可靠的日志记录机制。


  1. 错误日志: 访问错误通过Level配置
  2. 系统错误: 通过程序判断,用程序输出 logger.error(‘Cheese is too ripe!’);
  3. 输出目录:filename: ‘logs/access.log’,

你把log4js的配置,整个贴出来

我的项目没有单独做日志设置,因为项目是用 forever 启动的,forever 本身具有日志记录功能

根据你的问题描述,你在配置Node.js后台日志时遇到了两个问题:

  1. 访问日志文件没有被写入。
  2. 如何将日志文件创建在与服务端启动文件相同的目录下。

1. 访问日志文件没有被写入

确保路径是正确的,并且Node.js应用有权限写入该路径。你可以通过检查路径是否存在以及是否有写入权限来排除这个问题。

2. 将日志文件创建在与服务端启动文件相同的目录下

你可以使用 __dirname 来获取当前脚本所在的目录路径。这样可以确保无论你的应用运行在哪里,日志文件都会被创建在与应用启动文件相同的目录下。

示例代码

const fs = require('fs');
const path = require('path');

// 获取当前脚本所在的目录
const logDir = path.join(__dirname, 'logs');

// 确保日志目录存在
if (!fs.existsSync(logDir)) {
    fs.mkdirSync(logDir);
}

const accessLogFile = fs.createWriteStream(path.join(logDir, 'access.log'), { flags: 'a' });
const errorLogFile = fs.createWriteStream(path.join(logDir, 'error.log'), { flags: 'a' });

// 使用express的logger中间件
const express = require('express');
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.use(express.logger({
    stream: accessLogFile,
}));

app.use((err, req, res, next) => {
    const now = new Date();
    const time = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`;
    const meta = `[${time}] ${req.method} ${req.url}\n`;
    
    errorLogFile.write(`${meta}${err.stack}\n\n\n`);
    next();
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  • 获取当前目录:使用 __dirname 获取当前脚本所在的目录,并创建一个名为 logs 的子目录。
  • 确保日志目录存在:如果 logs 目录不存在,则创建它。
  • 创建日志文件:使用 fs.createWriteStream 创建日志文件流,并将其流传递给 express.logger 中间件。
  • 错误处理:捕获错误并将其写入到错误日志文件中。

通过这种方式,你可以确保日志文件总是被创建在与应用启动文件相同的目录下,并且避免了路径错误或权限问题。

回到顶部