log4js 日志库

log4js是NodeJS中一个流行的日志库,它的设计参考了Java中著名的Log4J日志框架。如果你熟悉Java开发,会对log4js中的配置方式感到十分亲切。

项目Github地址:https://github.com/log4js-node/log4js-node

相关概念

在开始使用log4js之前,我们先了解几个核心概念。

Level 日志级别:log4js定义了6个日志级别,按优先级从低到高依次为:TRACE、DEBUG、INFO、WARN、ERROR、FATAL,级别按顺序递增,实际输出时只会输出当前级别及更高级别的日志。

Category 分类:通过getLogger()获取日志记录器时可以指定一个分类名,日志输出时会带上这个名字,方便区分日志来源于哪个模块。如果不指定,默认为default

Appender 输出器:Appender决定了日志输出到哪里。log4js默认使用控制台输出,但我们也可以配置输出到文件。常用的Appender类型包括stdoutfiledateFile等。

日志卷动(Rotate):我们不可能将所有日志写入同一个文件,那会导致文件过于庞大,也不能无限制写入日志导致磁盘空间耗尽。日志卷动机制可以按照文件大小或日期自动分割日志文件,并删除过期的旧日志。

安装

执行以下命令安装log4js。

npm i log4js

本篇笔记基于log4js的6.9.1版本进行介绍。

基本使用

下面是log4js最简单的使用方式,我们直接获取日志记录器并输出日志。

import log4js from "log4js";

// 获取日志记录器实例
const logger = log4js.getLogger("index");
// 设置日志级别
logger.level = "debug";
// 输出日志
logger.debug("Some debug messages");
logger.info("Application started");
logger.warn("This is a warning");
logger.error("Something went wrong");

运行后控制台输出如下。

[2024-01-15T10:30:45.123] [DEBUG] index - Some debug messages
[2024-01-15T10:30:45.125] [INFO] index - Application started
[2024-01-15T10:30:45.126] [WARN] index - This is a warning
[2024-01-15T10:30:45.127] [ERROR] index - Something went wrong

输出内容中包含时间戳、日志级别、分类名和日志消息。这里的index就是我们指定的分类名,如果不指定会显示default

配置日志

实际项目中,我们通常需要对日志进行更详细的配置,下面是一个完整的配置示例。

import log4js from "log4js";

const log4jsConfig = {
  appenders: {
    console: {
      type: "stdout",
      layout: {
        type: "pattern",
        pattern: "%d{yyyy-MM-dd hh:mm:ss.SSS} [%p] %c - %m",
      },
    },
  },
  categories: {
    default: {
      appenders: ["console"],
      level: "info",
    },
  },
};

log4js.configure(log4jsConfig);

const logger = log4js.getLogger("app");
logger.info("Hello, log4js!");

配置对象中的主要字段说明如下:

appenders:定义日志输出器,每个输出器需要指定type和可选的layout。常用的type包括:

  • stdout:输出到标准输出
  • file:输出到文件
  • dateFile:按日期输出到文件

layout:定义日志输出格式,常用的类型有:

  • basic:纯文本格式
  • coloured:带颜色的文本格式(需要终端支持)
  • pattern:自定义格式,可使用占位符定义输出内容

categories:定义日志分类,指定每个分类使用的appender和日志级别。default是默认分类,未明确指定分类的日志记录器都会使用该配置。

pattern格式占位符

使用pattern类型的layout时,可以使用以下占位符。

占位符 说明
%d 日期时间
%p 日志级别
%c 分类名
%m 日志消息
%n 换行符
%h 主机名
%z 进程ID

file 输出到文件

file类型的Appender可以将日志输出到文件,并支持按文件大小进行卷动,下面是一个配置例子。

import log4js from "log4js";

const log4jsConfig = {
  appenders: {
    file: {
      type: "file",
      filename: "logs/app.log",
      maxLogSize: 10 * 1024 * 1024,
      backups: 5,
      compress: true,
      encoding: "utf-8",
      layout: {
        type: "basic",
      },
    },
  },
  categories: {
    default: {
      appenders: ["file"],
      level: "info",
    },
  },
};

log4js.configure(log4jsConfig);

const logger = log4js.getLogger("app");
logger.info("This message will be written to file");

配置项说明如下。

配置项 说明
filename 日志文件路径
maxLogSize 单个日志文件最大字节数
backups 保留的备份文件数量
compress 是否压缩备份文件(.gz格式)
encoding 文件编码

按照上述配置,日志文件会按以下方式卷动。

logs
  |_app.log
  |_app.log.1.gz
  |_app.log.2.gz
  |_app.log.3.gz

dateFile 按日期输出文件

dateFile类型的Appender可以按日期分割日志文件。

import log4js from "log4js";

const log4jsConfig = {
  appenders: {
    dateFile: {
      type: "dateFile",
      filename: "logs/app.log",
      pattern: "yyyy-MM-dd",
      alwaysIncludePattern: true,
      keepFileExt: true,
      numBackups: 30,
      encoding: "utf-8",
      layout: {
        type: "basic",
      },
    },
  },
  categories: {
    default: {
      appenders: ["dateFile"],
      level: "info",
    },
  },
};

log4js.configure(log4jsConfig);

const logger = log4js.getLogger("app");
logger.info("Daily log message");

配置项说明如下。

配置项 说明
pattern 日期格式
alwaysIncludePattern 是否所有文件都包含日期后缀
keepFileExt 是否保持文件扩展名在最后
numBackups 保留的日志文件天数

按照上述配置,生成的日志文件命名如下。

logs
  |_app.2024-01-13.log
  |_app.2024-01-14.log
  |_app.2024-01-15.log

多Appender配置

实际项目中,我们通常希望日志同时输出到控制台和文件,可以配置多个Appender并在categories中同时引用。

import log4js from "log4js";

const log4jsConfig = {
  appenders: {
    console: {
      type: "stdout",
      layout: {
        type: "coloured",
      },
    },
    file: {
      type: "dateFile",
      filename: "logs/app.log",
      pattern: "yyyy-MM-dd",
      alwaysIncludePattern: true,
      keepFileExt: true,
      numBackups: 30,
      layout: {
        type: "basic",
      },
    },
  },
  categories: {
    default: {
      appenders: ["console", "file"],
      level: "info",
    },
    // 可以为特定模块配置不同的日志级别
    database: {
      appenders: ["console", "file"],
      level: "debug",
    },
  },
};

log4js.configure(log4jsConfig);

// 使用默认分类
const appLogger = log4js.getLogger("app");
appLogger.info("Application started");

// 使用database分类,日志级别为debug
const dbLogger = log4js.getLogger("database");
dbLogger.debug("Database connection established");
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。