log4js 日志库

Java中有一个比较流行的日志库Log4J,而Node.js中的log4js就是仿照它设计的,如果熟悉Java我们会对其中的配置十分亲切。

相关概念

Level 日志级别log4js有9个日志级别,ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、MARK、OFF,第一个表示所有日志都输出,最后一个表示所有日志都不输出,其余按顺序级别越来越高,具体输出时会按照输出同级别或更高级别的规则输出。

Categorylog4js中获取logger对象时可以给它起一个分类名(Category),日志输出时会带上这个名字,方便区分该条日志属于哪个模块。如果不指定该名,默认为default

Appenderlog4js默认会向控制台输出内容,这是因为框架内部默认使用输出到控制台的Appender,如果需要向文件输出就需要手动指定一个file的Appender,除此之外log4js还内置了其它类型的Appender供我们使用,具体可以参考文档。

日志卷动(rotate):我们不可能将所有的日志输出到1个文件中,那可能造成日志文件过于庞大而无法打开,我们也不能无限制的写入日志(毕竟应用服务器的磁盘空间的有限的),而是应该配置一个自动删除老日志内容的机制,这种机制在日志框架中就叫做Rotate(卷动)。一般日志框架都支持按照文件大小和日期来卷动日志文件。

log4js安装

我们在项目中执行以下命令安装log4js模块:

npm install --save log4js

我这里使用的版本的6.9.0

log4js简单使用

下面代码演示了log4js的简单使用方式,这里我们没有加入什么额外的配置参数,保持日志框架的默认配置并输出了一些内容。

var log4js = require("log4js");
// 获取日志记录器实例
var logger = log4js.getLogger("index");
// 设置日志记录器日志级别
logger.level = "debug";
// 输出日志信息
logger.debug("Some debug messages");

代码中,我们输出了日志信息到控制台。具体输出内容如下:

[2023-03-08T15:13:54.508] [DEBUG] index - Some debug messages

这里获取日志记录器时我们指定了一个名字index,如果未指定默认会显示default

log4js配置

这里我们简单介绍如何对log4js输出的内容进行配置,下面代码是一个配置例子。

const log4js = require('log4js');

const log4jsConfig = {
    replaceConsole: true,
    appenders: {
        out: {
            type: 'stdout',
            layout: {
                type: 'pattern',
                pattern: '{"date":"%d","level":"%p","category":"%c","host":"%h","pid":"%z","data":"%m"}'
            }
        }
    },
    categories: {
        default: {
            appenders: ['out'],
            level: 'info'
        }
    }
};

log4js.configure(log4jsConfig);
const logger = log4js.getLogger();
logger.info('Hello, log4js!');

我们主要关注代码中的log4jsConfig对象,replaceConsole表示覆盖掉框架默认配置;appenders中指定了配置哪些Appender,例子中我们使用了stdout,它会向标准输出写日志,此外常用的还有filedatefile等。layout指定日志的输出格式,常用的有:

  • basic:纯文本方式输出日志。
  • coloured:相比basic还增加了不同级别日志的颜色,但这里注意带颜色的日志需要控制台支持,否则可能造成乱码等情况。
  • pattern:该方式可以手动指定日志的格式,log4js默认的输出格式是Java风格的,对于其它风格或是结构化日志(JSON格式)等,可以使用该项手动编写日志格式。

categories指定了不同日志记录器使用的Appender和日志级别,default表示所有未特殊指定的日志记录器使用该配置输出。

file 输出日志文件

file类型的Appender可以将日志输出到文件,它可以指定输出的最大文件大小、配置按日志文件个数卷动、指定是否压缩等。

const log4jsConfig = {
    replaceConsole: true,
    appenders: {
        file: {
            type: 'file',
            filename: 'logs/node-app.log',
            layout: {
                type: 'basic'
            },
            maxLogSize: 1024 * 1024 * 1024,
            backups: 3,
            encoding: 'utf-8',
            compress: true
        }
    },
    categories: {
        default: {
            appenders: ['file'],
            level: 'info'
        }
    }
};
  • filename:指定输出的日志文件名,可以带有路径
  • maxLogSize:指定单个日志文件的最大文件大小,单位为字节
  • backups:指定达到多少个文件后开始卷动(超出的文件将被删除)
  • encoding:日志文件的文本编码
  • compress:分卷的日志是否压缩,默认以.gz格式压缩

按照如上配置最终会以类似下列的形式卷动日志文件:

logs
  |_node-app.log
  |_node-app.log.1.gz
  |_node-app.log.2.gz
  |_node-app.log.3.gz

datefile 输出带日期的日志文件

前面的file是按日志文件尺寸卷动的,datefile则可以按日期卷动,下面是一个配置例子。

const log4jsConfig = {
    replaceConsole: true,
    appenders: {
        datefile: {
            type: 'datefile',
            filename: 'logs/node-app.log',
            pattern: 'yyyy-MM-dd',
            alwaysIncludePattern: true,
            layout: {
                type: 'basic'
            },
            keepFileExt: true,
            numBackups: 3,
            encoding: 'utf-8'
        }
    },
    categories: {
        default: {
            appenders: ['datefile'],
            level: 'info'
        }
    }
};
  • alwaysIncludePattern:配置是否所有的日志文件都带有日志,设置为false时卷动前的日志文件不会带上日期
  • keepFileExt:保持日志文件的文件名,如果不配置该项可能会造成我们的日志文件名变成node-app.log.2023-03-08,由于文件名改变了,这可能造成某些日志收集系统的不兼容
  • numBackups:日志文件卷动时,保留的最大日志份数

其余配置前面已经介绍过了,这里就不重复赘述了。

以下配置会输出如下格式文件名的日志文件:

logs
  |_node-app.2023-03-06.log
  |_node-app.2023-03-07.log
  |_node-app.2023-03-08.log
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。