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类型包括stdout、file、dateFile等。
日志卷动(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");