log4js动态配置

log4js 动态配置

在开发中总是会碰到需要配置各种各样类型的日志文件。要是能够实现动态配置功能而不用去更新调整log4js的配置文件就方便太多了。大部分应用的log4js 的配置文件格式都是大同一样的。所以本着这个想法做了个简单的实现。

基础配置文件

基础配置包含了基本的日志类型和等级定义,动态配置中也是参照这个配置做了模板来生产相同配置。

{
  appenders: {
    console: {
      type: "console",
    },
    normal: {
      type: "dateFile", //文件类型
      filename: `./logs/normal`, //日志文件的存储路径
      alwaysIncludePattern: true, //(可选,默认false)将模式包含在当前日志文件的名称以及备份中
      pattern: "yyyy-MM-dd.log", //(可选,默认为-yyyy-MM-dd) 确定何时滚动日志的模式。 格式:.yyyy-MM-dd-hh:mm:ss.log
      encoding: "utf-8", //(可选,默认为utf-8)文件数据的存储编码
      maxLogSize: "10M", //文件最大存储空间,当文件内容超过文件存储空间会自动生成一个文件xxx.log.1的序列自增长的文件, 单位:K M G
    },
    http: {
      type: "dateFile", //文件类型
      filename: `./logs/http/http`, //日志文件的存储路径
      alwaysIncludePattern: true, //(可选,默认false)将模式包含在当前日志文件的名称以及备份中
      pattern: "yyyy-MM-dd.log", //(可选,默认为-yyyy-MM-dd) 确定何时滚动日志的模式。 格式:.yyyy-MM-dd-hh:mm:ss.log
      encoding: "utf-8", //(可选,默认为utf-8)文件数据的存储编码
      maxLogSize: "10M", //文件最大存储空间,当文件内容超过文件存储空间会自动生成一个文件xxx.log.1的序列自增长的文件, 单位:K M G
    },
  },
  categories: {
    default: {
      appenders: ["console", "normal"],
      level: "debug",
    },
    http: {
      appenders: ["console", "http"],
      level: "debug",
    },
  },
}

logger.js封装

const log4js = require("log4js");
const config = require('../config/log4js.conf')

// 初始化默认配置
log4js.configure(config);

/**
 * 创建日志类型配置
 * @param {string} category 日志类型
 * @param {string} level 日志等级
 * @returns
 */
function _createLogConfig(category, level) {
  let categoryConfig = {
    type: "console",
  };
  if (category) {
    categoryConfig = {
      type: "dateFile", //文件类型
      filename: `./logs/${category}/${
        level ? `${category}_${level}` : category
      }`, //日志文件的存储路径
      alwaysIncludePattern: true, //(可选,默认false)将模式包含在当前日志文件的名称以及备份中
      pattern: "yyyy-MM-dd.log", //(可选,默认为-yyyy-MM-dd) 确定何时滚动日志的模式。 格式:.yyyy-MM-dd-hh:mm:ss.log
      encoding: "utf-8", //(可选,默认为utf-8)文件数据的存储编码
      maxLogSize: "10M", //文件最大存储空间,当文件内容超过文件存储空间会自动生成一个文件xxx.log.1的序列自增长的文件, 单位:K M G
    };
    if (level) {
      categoryConfig.level = level;
    }
  }
  return categoryConfig;
}
/**
 * 创建指定等级日志配置
 * @param {string} category
 * @param {string} level
 * @returns
 */
function _createLogLevelFilter(category, level) {
  let categoryConfig = {
    type: "logLevelFilter",
    appender: `${category}_${level}`,
    level: level,
  };
  return categoryConfig;
}

/**
 * log4js
 */
module.exports.log4js = log4js;

/**
 * getLogger
 * @param {string} category log存储文件名称
 * @param {string} level  log level []
 * @returns
 */
module.exports.getLogger = function (category, level) {
  if (!config.categories[category]) {
    config.appenders[category] = _createLogConfig(category, false);
    config.appenders[`${category}_error`] = _createLogConfig(
      category,
      "error"
    );
    config.appenders[`${category}_levelFilter`] = _createLogLevelFilter(
      category,
      "error"
    );
    config.categories[category] = {
      appenders: ["console", category, `${category}_levelFilter`],
      level: level || "all",
    };
    console.log(JSON.stringify(config, null, 2));
    log4js.configure(config);
  }
  return log4js.getLogger(category || "default");
};

使用

const logger_test1 = require('../src/utils/logger').getLogger('test1');
const logger_test2 = require('../src/utils/logger').getLogger('test2');
 
logger_test1.log("error", "这是一条日志测试打印 error!", 66);
logger_test1.log("fatal", "这是一条日志测试打印 fatal"); 
logger_test1.debug("debug", "这是一条日志测试打印 debug111111111!");
logger_test1.info("info", "这是一条日志测试打印 info11111111!", "777", null);
logger_test1.warn("warn", "这是一条日志测试打印 warn111111111111", 1123);
logger_test1.error("error", "这是一条日志测试打印 error11111111111!", null);
logger_test1.fatal("fatal", "这是一条日志测试打印 fatal111111111111", "kkkkkkkkkkkk");
logger_test1.error("这是一条日志测试打印 fatal111111111111", "kkkkkkkkkkkk");


logger_test2.log("error", "这是一条日志测试打印 error!", 66);
logger_test2.log("fatal", "这是一条日志测试打印 fatal"); 
logger_test2.debug("debug", "这是一条日志测试打印 debug111111111!");
logger_test2.info("info", "这是一条日志测试打印 info11111111!", "777", null);
logger_test2.warn("warn", "这是一条日志测试打印 warn111111111111", 1123);
logger_test2.error("error", "这是一条日志测试打印 error11111111111!", null);
logger_test2.fatal("fatal", "这是一条日志测试打印 fatal111111111111", "kkkkkkkkkkkk");
logger_test2.error("这是一条日志测试打印 fatal111111111111", "kkkkkkkkkkkk");
logger_test2.log("这是一条日志测试打印 none not paramters!", 111, "uuuuuuuuu", null, {jj: 188, name: "hello"});
logger_test2.log("none", "这是一条日志测试打印 none");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值