快速开始
安装
当前安装版本为6.9.1
npm install log4js -S
使用
日志级别:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < MARK < OFF
指定了日志级别将会输出指定级别及以上的日志,默认为 off
var log4js = require("log4js");
var logger = log4js.getLogger();
logger.level = "info";
logger.info("hello log4js");
logger.debug("不会输出,因为 DEBUG < INFO");
常用配置
在实际开发中日志场景比较丰富,例如需要对日志分类,输出至文件保存等,这里需要用到单独的配置。
const log4js = require("log4js");
log4js.configure({
appenders: {
out: { type: "stdout" },
app: { type: "file", filename: "application.log" },
},
categories: {
default: { appenders: ["out", "app"], level: "debug" },
},
});
appenders
追加程序将日志事件序列化为某种形式的输出。他们可以写入文件,发送电子邮件,通过网络发送数据。所有的追加器都有一个类型来决定使用哪个追加器
categories
categories是一组日志事件。Categories的类别可以通过 log4js. getlogger (’ someecategory '),定义具有相同类别的日志事件将发送到相同的appenders。
layout
大多数appender配置将接受一个名为layout的字段,这个字段用来格式化日志输入
配置示例
下面展示按日期分割日志,并展示输出结果,仔细看一遍就明白了
var log4js = require("log4js");
const path = require("path")
// 配置log4js
log4js.configure({
pm2: true, // 是否使用pm2管理进程
pm2InstanceVar: "INSTANCE_ID", // pm2的实例变量名
appenders: { // 定义日志输出源
trace: { // 定义trace日志输出源
type: "dateFile", // 日志类型为按日期分割的文件
encoding: "utf-8", // 日志编码为utf-8
pattern: "yyyy-MM-dd", // 日志文件名的日期格式
alwaysIncludePattern: true, // 文件名始终以日期区分
filename: path.join(__dirname, "./logs/trace.log"), // 生成文件名
numBackups: 7, // 要保留日志文件的数量(不包括热文件)
keepFileExt: true, // 保持文件扩展名
layout: { // 定义日志格式
type: "pattern", // 格式类型为模式
pattern: "%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %m", // 模式为日期+级别+消息
charset: "utf-8", // 字符集为utf-8
},
},
stdout: { // 定义标准输出源
type: "stdout", // 日志类型为标准输出
},
},
categories: { // 定义日志分类
default: { appenders: ["stdout"], level: "info" }, // 默认分类使用标准输出源,级别为info
trace: { appenders: ["trace"], level: "all" }, // trace分类使用trace输出源,级别为all
},
})
// 获取trace日志对象
const traceLogger = log4js.getLogger('trace');
// 获取默认日志对象
const defaultLogger = log4js.getLogger();
// 使用trace日志对象记录不同级别的日志
traceLogger.trace('这是一条trace级别的日志');
traceLogger.debug('这是一条debug级别的日志');
traceLogger.info('这是一条info级别的日志');
traceLogger.warn('这是一条warn级别的日志');
traceLogger.error('这是一条error级别的日志');
traceLogger.fatal('这是一条fatal级别的日志');
// 使用默认日志对象记录info级别的日志
defaultLogger.info('这是一条默认的info级别的日志');
// 运行结果:
// 在控制台输出:
// 2023-09-15 11:14:23.123 [INFO] 这是一条默认的info级别的日志
// 在logs/trace.log文件中追加:
// 2023-09-15 11:14:23.123 [TRACE] 这是一条trace级别的日志
// 2023-09-15 11:14:23.123 [DEBUG] 这是一条debug级别的日志
// 2023-09-15 11:14:23.123 [INFO] 这是一条info级别的日志
// 2023-09-15 11:14:23.123 [WARN] 这是一条warn级别的日志
// 2023-09-15 11:14:23.123 [ERROR] 这是一条error级别的日志
// 2023-09-15 11:14:23.123 [FATAL] 这是一条fatal级别的日志
结合pm2使用
pm2会记录控制台日志,也有自己的日志文件,当应用开启 cluster 模式后log4js日志输出可能会丢失,或者出现资源抢占等问题。
log4js需要添加配置
pm2: true, // 是否使用pm2管理进程
pm2InstanceVar: "INSTANCE_ID", // pm2的实例变量名
pm2 配置添加选项 pm2InstanceVar 和 instance_var 值需要一样
instance_var: "INSTANCE_ID",
pm2 安装 pm2-intercom 模块
pm2 install pm2-intercom
大致原理是通过pm2-intercom来进行线程通信,由主线程写日志
来自 log4js 文档 https://log4js-node.github.io/log4js-node/clustering.html
日志乱码,及出现[32m 和 [39m
当log4js的日志被重定向到了pm2中可能会出现乱码及色彩信息 [32 [39
[32m[2023-09-15T18:39:37.738] [INFO] [aPad:1119609857] - [39mnetwork.join:
解决方案
使用stdout,并添加 layout,将输出的日志自定义,把颜色去掉
// 配置log4js
log4js.configure({
pm2: true, // 是否使用pm2管理进程
pm2InstanceVar: "INSTANCE_ID", // pm2的实例变量名
appenders: { // 定义日志输出源
stdout: { // 定义标准输出源
type: "stdout", // 日志类型为标准输出
layout: { // 定义日志格式
type: "pattern", // 格式类型为模式
pattern: "%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %m", // 模式为日期+级别+消息
charset: "utf-8", // 字符集为utf-8
},
},
},
categories: { // 定义日志分类
default: { appenders: ["stdout"], level: "info" }, // 默认分类使用标准输出源,级别为info
},
})
log4js输出的日志在pm2日志中找不到
log4js 只有 type: “stdout” 默认的日志输入才会记录到pm2的日志文件中,也就是控制台的输出,自定义的日志输出会按照appenders配置生效,如果发现pm2 out.log没有日志,请尝试使用 type: “stdout”
// 以上面配置为基础
// 获取trace日志对象
// traceLogger输出的日志会记录在log4js的文件中
const traceLogger = log4js.getLogger('trace');
// 获取默认日志对象
// type: "stdout"的输出会记录在pm2 out.log中,和console.log()一样会被pm2记录
const defaultLogger = log4js.getLogger();
pm2配置参考
module.exports = {
name: "prod",
script: "./bin/www",
cwd: "./",
watch: false, // 默认关闭watch 可替换为 ['src']
instance_var: "INSTANCE_ID",
ignore_watch: ["node_modules", "build", "logs"],
log_date_format: "YYYY-MM-DD HH:mm:ss.SSS",
out_file: "./logs/out.log", // 日志输出
merge_logs: true,
error_file: "./logs/error.log", // 错误日志
max_memory_restart: "2G", // 超过多大内存自动重启,仅防止内存泄露有意义,需要根据自己的业务设置
exec_mode: "cluster", // 开启多线程模式,用于负载均衡
instances: "max", // 启用多少个实例,可用于负载均衡
autorestart: true, // 程序崩溃后自动重启
// 项目环境变量
env: {
NODE_ENV: "prod",
PORT: 3000,
},
};