log4js+pm2使用,问题总结

快速开始

安装

当前安装版本为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,
	  },
};

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值