log4js
是一个灵活的日志库,它允许你通过不同的方式(如控制台、文件等)记录信息,并根据日志的级别(如DEBUG、INFO、WARN、ERROR等)来控制日志的输出。下面附上我的代码
import log4js from 'log4js'
import path from 'path'
import config from '../configs.js' //导入配置信息
const logConfig = config.log
const isPm2 = process.env.DEPLOY === 'pm2' //判断是否在使用PM2 这里是决定日志的输出方式(控制台或控制台+文件)。
let appenders = isPm2 ? ['STDOUT'] : ['STDOUT', 'LOGFILE']
log4js.configure({
//定义了如何输出日志,如控制台或文件
appenders: {
STDOUT: {
type: 'console',
layout: {
type: 'pattern',
pattern: '%[%X{id}|%c|%p|%d{yyyy-MM-dd hh:mm:ss}|%x{portal}|pid:%z:%]%n%m',
tokens: {
portal: logConfig.appName
}
}
},
LOGFILE: {
type: 'dateFile',
filename: path.join(process.cwd(), 'log/' + logConfig.appName),
pattern: '-yyyy-MM-dd.log',
alwaysIncludePattern: true,
// maxLogSize: 10485760, // 10MiB
maxLogSize: 52428800, // 50MiB
backups: 30,
keepFileExt: true,
layout: {
type: 'pattern',
// 通过pattern和tokens来定义日志的具体格式,包括时间戳、日志级别、日志分类等信息。
// pattern: '%c|%d{yyyy-MM-dd hh:mm:ss}|%X{source}|%x{portal}|%m',
pattern: '%X{id}|%c|%p|%d{yyyy-MM-dd hh:mm:ss}|%x{portal}|pid:%z:%n%m',
tokens: {
portal: logConfig.appName
}
}
}
},
//定义了不同日志分类的级别和输出目标
categories: {
default: { appenders: appenders, level: logConfig.normalLevel },
CLIENT: { appenders: appenders, level: logConfig.normalLevel },
NODE: { appenders: appenders, level: logConfig.normalLevel }
},
//以及其他配置如pm2和disableClustering(与PM2相关)、replaceConsole(是否替换Node.js的内置console方法)
pm2: isPm2,
disableClustering: isPm2,
replaceConsole: true
})
// 该函数接收一个category(日志分类)和params(额外的上下文信息)作为参数
export default function (category, params) {
let logger = log4js.getLogger(category)
for (let key in params) {
if (params.hasOwnProperty(key)) {
logger.addContext(key, params[key])
}
}
return logger
};
总之,这段代码通过log4js
库为Node.js项目配置了一个灵活的日志系统,支持根据不同的部署环境(如是否使用PM2)和日志分类来定制日志的输出方式和格式。通过为日志记录器添加上下文信息,还可以在日志中嵌入更多的有用信息,以便于问题的排查和定位。
log日志附图