Node.js 日志系统 log4js 介绍

Node.js 日志系统 log4js 介绍

关于 log4js ,此处不做过多介绍,你如果有关注过日志系统,那就应该听说过类似 log4cpplog4netlog4jlog4p 等名词。是的,log4xxx 是 Apache 提供的开源日志框架,它可以将日志信息按指定的格式、分级不同的级别输出到多种介质(控制台、文件、数据库等),并且还支持日志文件的自动备份等功能。不同的编程语言有不同的 log4xxx 版本,其中 log4js 便是 node.js 版本的,本文将从总体上介绍 log4js 的一些概念和使用方法。

最简单的使用

首先让我们来看一个最简单的使用示例,编码之前通过 npm 安装 log4js 包。

npm install log4js

通过如下方式来使用 log4js 功能:

var log4js = require('log4js');
var logger = log4js.getLogger();

logger.level = "info"; // default level is OFF - which means no logs at all.
logger.info("Log from default logger");

输出结果:

[2018-11-13T19:18:54.225] [INFO] default - Log from default logger

注意,默认的 leveloff,不会输入任何信息,info 方法会报错。除了 info 方法外,还有 errorwarn 等方法,只有启用了相应的 level 的情况下才能调用相关的方法。级别的顺序为:

加载配置项

log4js 支持两种配置方式,一种是 json 文件,另一种是 json 对象。两种方式的原理是一样的,下面以 json 对象为例来说明如何进行配置。

var log4js = require('log4js');

log4js.configure({
    appenders:{
        std: { type: "stdout", level: "all", layout:{type: "basic", } },
        file: { type: "file", filename: "log.txt", encoding: "utf-8" }
    },
    categories: {
        default: {appenders: ["std"], level: "debug"},
        custom: {appenders: ["std", "file"], level: "all"}
    }
});

var logger = log4js.getLogger("custom");
logger.warn("I will be logged both in console and log.txt");

如上代码所示,先是配置了 defaultcustom 两个日志器,后面调用了 custom 日志器来输出一条 warm 级别的日志。由于 custom 日志器引用了 stdfile 两个 appender,所以该条日志将同时被输出到 stdout(控制台) 和 log.txt(文件)。

[2018-11-13T21:12:12.682] [WARN] custom - I will be logged in log.txt

注意:调试状态下日志信息不会被输出到文件中,只有在运行状态下才会,这跟 log4js 的内部实现有关,它判断了当前的工作线程,具体可参阅文末的参考资料。

通过如上代码的演示,你应该基本了解了 log4js 的配置,我将在下一节中介绍各个配置的项的含义。

几个核心概念

如上图所示,我们已经在上一节的配置介绍中接触到这些概念。总的来说,log4jscategoryappenderlayout 三大部分构成,其中 category 是日志器实例,每个实例中可以包含多个 appender,而每个 appender 中包含一个 layoutappender 用于指定日志的输出位置(控制台、文件等),layout 用于定义日志的输出格式。

layout

layout 用于定义每条日志的输出格式,log4js 内建了如下几种类型的 layout

  • basic:输出时间戳、级别,、别,后跟格式化的日志事件数据
  • coloured (or colored):与 basic 相似,只是会根据日志的级别进行着色
  • messagePassThrough:格式化日志事件数据,不输出时间戳,级别或类别
  • dummy:仅输出日志事件数据中的第一个值,用处不大
  • pattern:按照指定的模式进行输出

我们重点来看一下 pattern 类型的 layout 是如何配置的:

log4js.configure({
    appenders: {
      std: { type: 'stdout', layout: {
          type: 'pattern',
          pattern: '%d %p %c %x{user} %m%n',
          tokens: { user: function(logEvent) { return AuthLibrary.currentUser(); }}
        }}
    },
    categories: { default: { appenders: ['srd'], level: 'info' } }
  });
  
var logger = log4js.getLogger();
logger.info('doing something.');

其中,%d%p%n 等表示的是日志系统中的变量,%d 指的是 日期时间%p 指的是 日志等级%n 指的是 换行 ;另外,%x{user} 指的是将动态令牌 user 添加到日志中。除此之外,我们还可以使用 log4js.addLayout(type, fn) 来添加自定义的 layout

appender

定义日志的输出介质,常用的 appender 有如下两种:

  • stdout 或 stderr :将日志输出到彩色控制台中,前者是默认的 appender
  • file :将日志输出到文件,可以指定单个日志文件的大小、滚动备份等

另外还有 SMTPLoggyTCPAppender

log4js.configure({
  appenders: {
    network: { type: 'tcp', host: 'log.server', port: 12701 }
  },
  categories: {
    default: { appenders: ['network'], level: 'error' }
  }
});

category

category 指的是日志器实例,我们通过 log4js.getLogger() 拿到的是 log4js 系统中默认的日志器,还可以通过指定的名称来获取配置文件中相应的日志器。一个日志系统中可以有多个 category ,每个 category 中可以有多个 appender

log4js.configure({
    appenders:{
        std: { type: "stdout", level: "all", layout:{type: "basic", } },
        file: { type: "file", filename: "log.txt", encoding: "utf-8" }
    },
    categories: {
        default: {appenders: ["std"], level: "debug"},
        custom: {appenders: ["std", "file"], level: "all"}
    }
});

var logger = log4js.getLogger("custom");
logger.warn("I will be logged both in console and log.txt");

如上代码所示,配置文件中定义了 defaultcustom 两个日志器,使用 log4js.getLogger("custom") 获取了 custom 日志器,并用它来将入日志同时输出到控制台和文件中。

参考资料

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ironyho

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值