如何实现Nodejs中log4js重新检测配置

如何实现Nodejs中log4js重新检测配置

用log4js如何实现每天创建一个不同的名字的.log比如2013-04-27.log 2013-04-26.log

4 回复

当然可以!以下是如何使用 log4js 实现每天生成不同名称的日志文件(例如 2023-10-01.log2023-09-30.log)的示例。我们将通过动态生成日志文件名来实现这一点,并且可以通过定时任务定期更新配置。

示例代码

首先,确保你已经安装了 log4js

npm install log4js

然后,在你的 Node.js 应用程序中实现以下代码:

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

// 获取当前日期并格式化为 YYYY-MM-DD
function getCurrentDate() {
    const now = new Date();
    return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
}

// 初始化日志配置
function initLogger() {
    const currentDate = getCurrentDate();
    const logFileName = `${currentDate}.log`;

    log4js.configure({
        appenders: {
            out: { type: 'stdout' },
            file: { type: 'file', filename: path.join(__dirname, 'logs', logFileName) }
        },
        categories: {
            default: { appenders: ['out', 'file'], level: 'debug' }
        }
    });
}

// 定期检查日期并重新加载配置
function checkAndReloadConfig() {
    const currentDate = getCurrentDate();

    // 如果当前日期与上次配置的日期不同,则重新加载配置
    if (currentDate !== getCurrentDate()) {
        initLogger();
    }
}

// 每分钟检查一次
setInterval(checkAndReloadConfig, 60 * 1000);

// 初始化日志
initLogger();

// 使用日志
const logger = log4js.getLogger();
logger.debug("This is a debug message.");

解释

  1. 获取当前日期

    • getCurrentDate() 函数用于获取当前日期,并将其格式化为 YYYY-MM-DD 的形式。
  2. 初始化日志配置

    • initLogger() 函数根据当前日期生成日志文件名,并配置 log4js 使用该文件名。
    • 日志将被写入到 logs 目录下,文件名为当天日期(例如 2023-10-01.log)。
  3. 定期检查并重新加载配置

    • checkAndReloadConfig() 函数定期检查当前日期是否发生变化。如果发生变化,则调用 initLogger() 函数重新初始化日志配置。
    • 这里我们设置每分钟检查一次(setInterval(checkAndReloadConfig, 60 * 1000))。
  4. 使用日志

    • 最后,我们初始化日志并使用它来记录调试信息。

这样,每天的日志文件都会自动创建,并且每个文件都有唯一的名称。


{ "appenders": [ {
    "type": "dateFile",
    "filename": "blah.log",
    "pattern": "-yyyy-MM-dd"
  } ]
}

要在Node.js中使用log4js实现每天生成一个不同名字的日志文件(例如 2023-10-01.log),可以通过动态配置日志文件名来实现。这可以通过监听日期变化,并在日期变化时重新加载配置来实现。

以下是一个简单的示例代码,展示了如何使用log4js并根据日期动态更改日志文件名:

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

// 初始配置
let currentConfig = {
    appenders: {
        out: { type: 'stdout' },
        dateFile: {
            type: 'dateFile',
            filename: path.join(__dirname, 'logs/log'),
            pattern: '-yyyy-MM-dd.log',
            alwaysIncludePattern: true,
        }
    },
    categories: {
        default: { appenders: ['out', 'dateFile'], level: 'debug' }
    }
};

// 初始化log4js
log4js.configure(currentConfig);

const logger = log4js.getLogger();

function updateLogFilePath() {
    const now = new Date();
    const formattedDate = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
    
    // 更新配置中的文件路径
    currentConfig.appenders.dateFile.filename = path.join(__dirname, `logs/${formattedDate}.log`);
    
    // 重新加载配置
    log4js.configure(currentConfig);
}

// 每天更新一次日志文件路径
setInterval(updateLogFilePath, 1000 * 60 * 60 * 24); // 每天

// 示例日志输出
updateLogFilePath(); // 第一次初始化
logger.debug("Hello, this is a test log message!");

解释

  1. 初始配置:我们首先定义了一个基本的log4js配置,其中包含一个输出到控制台的日志处理器(stdout)和一个输出到文件的日志处理器(dateFile)。dateFile处理器会根据日期模式创建新的日志文件。

  2. 动态更新配置:通过updateLogFilePath函数,我们可以根据当前日期动态更新日志文件名。此函数每24小时执行一次(通过setInterval实现)。

  3. 日志输出:示例代码中包含了一个简单的日志输出,用于测试配置是否生效。

请注意,上面的代码假设你的系统时间是准确的,并且服务器不会重启。如果服务器可能重启,建议增加逻辑处理以确保在服务器启动时也能正确配置日志文件名。

回到顶部