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");