log4js为日志等级分别创建日志文件

一、简介

log4js是一款用于node开发的日志记录库,其使用范围相当之广,在ExpressKoa系列,Hapi等框架时,相信很多人都用过该库。其由于自身的高自由度,高可扩展性深受广大Node开发者所喜欢。

在实际开发过程中,每个人会根据自己具体情况来进行日志文件的划分,简单的可以是单文件日志记录,稍微复杂一点根据时间切割日志,更复杂一些使用特定协议推送到日志清洗服务(如Logstash)。

这里只针对开发中特定的一个情况——根据日志等级进行日志切割

这样做的优点是可以在排查过程中,抓重点进行排查,如果出现了报错,那么直接去error日志文件中查看错误日志;如果程序没有按照既定的逻辑运行,那么就可以去检查一下info或者debug日志文件中的记录……

二、本文导读

本文将会带领你如何将日志文件按照日志等级(DEBUGINFOWARNERRORFATAL)来将文件进行切割。

log4js中定义的日志等级有以下几类:

  • DEBUG:调试,等级最低,一般生产环境会将该等级的日志关闭
  • INFO:信息,普通等级,最常用的系统日志收集等级,一般会将系统运行中的一些相关信息(非开发类敏感信息)设为该等级
  • WARNFBI WARNNING大家都知道,就是警告,但又不到错误
  • ERROR:报错,一般程序报错使用该等级
  • FATAL:严重,比程序报错还严重的等级,如果没做错误等级划分的话,一般FATAL都不怎么用到,都用ERROR替代了

这几类日志等级在标准输出流的效果如图:

在这里插入图片描述

.log文件中的效果如图

在这里插入图片描述

三、示例

3.1 最基础的写法

先给大家看一下最基础的用法:

const log4js = require('log4js');
const path = require('path');
const logger = log4js.getLogger();

// 设置log4js相关的配置
log4js.configure({
  /** 
   * 追加器就使用默认的default追加器,所有没有设置追加的分类(category)
   * 都会使用该追加器写入日志文件
   */
  appenders: {
    default: {
      type: 'file',
      filename: path.join(__dirname, './logs/log.log'),
    }
  },

  /**
   * 分类也使用默认的分类,所有没有找到对应定义分类的日志,都会归为default分类
   */
  categories: {
    default: {
      appenders: ['default'], // 设置追加器为default,对应上面的appenders
      level: 'debug', // 设置记录日志的最低等级为debug,也就是所有日志都要记录
    },
  },
});

logger.debug('debug');
logger.info('info');
logger.warn('warn');
logger.error('error');
logger.fatal('fatal');

记录效果就是如上面第二节所展示的图片那样。

3.2 添加logLevelFilter

log4js中的logLevelFilter是一种过滤器,过滤器是在追加器之上的一个概念。正常流程是:分类(category) -> [过滤器(filter)] -> 追加器(appender)

3.2.1 设置日志等级过滤器

添加4个日志等级过滤器——debugFilterinfoFilterwarnFiltererrorFilter

// 设置log4js相关的配置
log4js.configure({
  /** 
   * 追加器就使用默认的default追加器,所有没有设置追加的分类(category)
   * 都会使用该追加器写入日志文件
   */
  appenders: {
    default: {
      type: 'file',
      filename: path.join(__dirname, './logs/log.log'),
    },
    debugFilter: {
      type: 'logLevelFilter', // 设置type为logLevelFilter
      appender: 'debug', // 指定追加器为debug
      level: 'debug', // 设置捕获日志的最低等级
      maxLevel: 'debug', // 设置捕获日志的最高等级
    },
    infoFilter: {
      type: 'logLevelFilter',
      appender: 'info',
      level: 'info',
      maxLevel: 'info',
    },
    warnFilter: {
      type: 'logLevelFilter',
      appender: 'warn',
      level: 'warn',
      maxLevel: 'warn',
    },
    errorFilter: {
      type: 'logLevelFilter',
      appender: 'error',
      level: 'error',
      maxLevel: 'fatal',
    },
  },

  /**
   * 分类也使用默认的分类,所有没有找到对应定义分类的日志,都会归为default分类
   */
  categories: {
    default: {
      appenders: ['default'], // 设置追加器为default,对应上面的appenders
      level: 'debug', // 设置记录日志的最低等级为debug,也就是所有日志都要记录
    },
  },
});

3.2.2 设置过滤器对应的追加器

// 设置log4js相关的配置
log4js.configure({
  /** 
   * 追加器就使用默认的default追加器,所有没有设置追加的分类(category)
   * 都会使用该追加器写入日志文件
   */
  appenders: {
    default: {
      type: 'file',
      filename: path.join(__dirname, './logs/log.log'),
    },

    /**
     * 指定debug追加器
     */
    debug: {
      type: 'file', // 日志文件类型
      filename: path.join(__dirname, './logs/debug.log'), // 日志路径+名称
    },
    debugFilter: {
      type: 'logLevelFilter', // 设置type为logLevelFilter
      appender: 'debug', // 指定追加器为debug
      level: 'debug', // 设置捕获日志的最低等级
      maxLevel: 'debug', // 设置捕获日志的最高等级
    },
    
    /**
     * 指定info追加器
     */
    info: {
      type: 'file',
      filename: path.join(__dirname, './logs/info.log'),
    },
    infoFilter: {
      type: 'logLevelFilter',
      appender: 'info',
      level: 'info',
      maxLevel: 'info',
    },
    
    /**
     * 指定warn追加器
     */
    warn: {
      type: 'file',
      filename: path.join(__dirname, './logs/warn.log'),
    },
    warnFilter: {
      type: 'logLevelFilter',
      appender: 'warn',
      level: 'warn',
      maxLevel: 'warn',
    },

    /**
     * 指定error追加器
     */
    error: {
      type: 'file',
      filename: path.join(__dirname, './logs/error.log'),
    },
    errorFilter: {
      type: 'logLevelFilter',
      appender: 'error',
      level: 'error',
      maxLevel: 'fatal',
    },
  },

  /**
   * 分类也使用默认的分类,所有没有找到对应定义分类的日志,都会归为default分类
   */
  categories: {
    default: {
      appenders: ['default'], // 设置追加器为default,对应上面的appenders
      level: 'debug', // 设置记录日志的最低等级为debug,也就是所有日志都要记录
    },
  },
});

3.2.3 在分类中设置对应的过滤器

追加器过滤器已经设置好了,就差在分类中设置对应的“追加器”了。如果保持之前的代码不变,他只能将日志推送到default追加器中。

这里如果直接推送到目的追加器是无法根据对应等级进行日志划分的,所以应该先推送到对应的过滤器中。

相关代码如下:

// 设置log4js相关的配置
log4js.configure({
  /** 
   * 追加器就使用默认的default追加器,所有没有设置追加的分类(category)
   * 都会使用该追加器写入日志文件
   */
  appenders: {
    default: {
      type: 'file',
      filename: path.join(__dirname, './logs/log.log'),
    },

    /**
     * 指定debug追加器
     */
    debug: {
      type: 'file', // 日志文件类型
      filename: path.join(__dirname, './logs/debug.log'), // 日志路径+名称
    },
    debugFilter: {
      type: 'logLevelFilter', // 设置type为logLevelFilter
      appender: 'debug', // 指定追加器为debug
      level: 'debug', // 设置捕获日志的最低等级
      maxLevel: 'debug', // 设置捕获日志的最高等级
    },
    
    /**
     * 指定info追加器
     */
    info: {
      type: 'file',
      filename: path.join(__dirname, './logs/info.log'),
    },
    infoFilter: {
      type: 'logLevelFilter',
      appender: 'info',
      level: 'info',
      maxLevel: 'info',
    },
    
    /**
     * 指定warn追加器
     */
    warn: {
      type: 'file',
      filename: path.join(__dirname, './logs/warn.log'),
    },
    warnFilter: {
      type: 'logLevelFilter',
      appender: 'warn',
      level: 'warn',
      maxLevel: 'warn',
    },

    /**
     * 指定error追加器
     */
    error: {
      type: 'file',
      filename: path.join(__dirname, './logs/error.log'),
    },
    errorFilter: {
      type: 'logLevelFilter',
      appender: 'error',
      level: 'error',
      maxLevel: 'fatal',
    },
  },

  /**
   * 分类也使用默认的分类,所有没有找到对应定义分类的日志,都会归为default分类
   */
  categories: {
    default: {
      appenders: ['debugFilter', 'infoFilter', 'warnFilter', 'errorFilter'], // 设置追加器为上面设置的filter,对应上面的各个过滤器
      level: 'debug', // 设置记录日志的最低等级为debug,也就是所有日志都要记录
    },
  },
});

四、测试

再次使用刚才的代码,测试一下是否对日志进行了基于等级的切割。

logger.debug('debug');
logger.info('info');
logger.warn('warn');
logger.error('error');
logger.fatal('fatal');

可以看到日志文件夹中日志文件变为了如下所示:

在这里插入图片描述
依次打开每个文件,查看是否对应等级的日志就只写入了对应等级的日志文件中。

五、相关资料

六、结语

本文到此就结束了,说了这么多,也仅仅只是讲了log4js中的一个小小的特性,权当我是抛砖引玉吧,哈哈哈哈哈,log4js的灵活性与功能性还不仅仅限于此,更多更棒的用法还有待和大家继续讨论研究!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值