Nodejs日志框架bunyan和log4js比较

Nodejs日志框架bunyan和log4js比较

博客:Nodejs日志框架bunyan和log4js比较

夜深写的,有些地方没仔细写,不过还是想跟大家分享一下。

正文


写代码少不了日志框架,这里我谈一下nodejs里我接触过的两个日志框架bunyanlog4js

log4js

打开log4js的github可以看到star数在600+,作为一个nodejs开源项目已经算不错了。在看一下log4js的特性,coloured console logging、可以设置输出等级,这两个是日志框架必备功能。可以配置输出格式是一个加分项,遗憾的是文档写的太简陋,没有找到具体如何配置。除此之外还算有特点的功能就是可以给不同类别的appender设置不同的输出级别,但是我研究了一下发现这个功能很不实用。具体为什么不实用大家可以自行研究。

log4js有一个问题是没办法将某个日志只输出到特定的文件,不在console里输出,并且不和其他日志混在一起。这也是我后来转用bunyan的一个原因。

bunyan

bunyan是一个很有特点的日志框架,它除了可以让不同类别的日志输出到不同的地方外,还有一个特点就是输出的日志是json格式的,比如:

$ node myapp.js
{"name":"myapp","hostname":"myhost","pid":34572,"level":30,"msg":"start","time":"2013-01-04T07:47:25.814Z","v":0}
{"name":"myapp","hostname":"myhost","pid":34572,"widget_type":"wuzzle","level":30,"msg":"creating a wuzzle","time":"2013-01-04T07:47:25.815Z","v":0}
{"name":"myapp","hostname":"myhost","pid":34572,"widget_type":"wuzzle","level":40,"msg":"This wuzzle is woosey.","time":"2013-01-04T07:47:25.815Z","v":0}
{"name":"myapp","hostname":"myhost","pid":34572,"level":30,"msg":"done","time":"2013-01-04T07:47:25.816Z","v":0}

开始你会觉得这种格式可读性很差,没关系,通过npm install -g bunyan,你安装了一个bunyan命令,这个命令就是一个读取日志文件的客户端,用这个命令可以将json格式的日志变为可读的,你只需要在启动时加上额外的命令即可:

$ node myapp.js  | bunyan -o short
07:46:42.707Z  INFO myapp: start
07:46:42.709Z  INFO myapp: creating a wuzzle (widget_type=wuzzle)
07:46:42.709Z  WARN myapp: This wuzzle is woosey. (widget_type=wuzzle)
07:46:42.709Z  INFO myapp: done

怎样,是不是又恢复了清爽。bunyan除了可以format控制台的日志输出,也同样可以查看日志文件,在命令后跟文件名即可。bunyan最实用的功能是过滤功能,譬如bunyan -l error,就只显示ERROR级别的日志,这在排查错误时在成千上万行日志里找信息非常有帮助。而bunyan -c 'this.name == “something”'将只会显示name为something的日志。

bunyan存在的不足是其时间输出默认为UTC而且我没有找到地方可以配置,也没有地方自定义输出pattern。

总结

总的来说两个日志框架都还不错,如果没有复杂需求用log4js完全够了,如果想体验下日志过滤功能并对UTC格式的时间输出没有强迫症的也可以选择bunyan。

最后再提一下winston,这家伙我也考虑了很久,其最大特点是扩展性好,类似于java的log4j,而且文档完善,star在2600+,拥有超高人气。缺点是我觉得其过于复杂,而且输出很难看。


9 回复

Nodejs日志框架bunyan和log4js比较

博客:Nodejs日志框架bunyan和log4js比较


正文

写代码少不了日志框架,这里我谈一下nodejs里我接触过的两个日志框架bunyanlog4js


log4js

打开log4js的GitHub可以看到star数在600+,作为一个nodejs开源项目已经算不错了。log4js的基本特性包括:

  • 可以在控制台中输出带颜色的日志。
  • 可以设置输出等级(如info, warn, error等)。
  • 可以配置输出格式。

但是,log4js的文档相对简陋,尤其是关于如何配置输出格式的部分不够详细。此外,虽然它可以为不同类别的appender设置不同的输出级别,但实际使用中感觉不太实用。

log4js的一个问题在于它不能方便地将某个日志只输出到特定的文件,而不同时在控制台输出或与其他日志混在一起。这是我后来转向bunyan的原因之一。


bunyan

bunyan是一个很有特点的日志框架,它的主要特点包括:

  1. JSON格式的日志:bunyan输出的日志是JSON格式的,例如:

    const bunyan = require('bunyan');
    const log = bunyan.createLogger({ name: 'myapp' });
    
    log.info("start");
    log.info("creating a wuzzle", { widget_type: "wuzzle" });
    log.warn("This wuzzle is woosey.", { widget_type: "wuzzle" });
    log.info("done");
    
  2. 可读性转换工具:通过安装bunyan命令行工具,你可以轻松地将JSON格式的日志转化为可读格式:

    $ node myapp.js | bunyan -o short
    

    输出结果会变成:

    07:46:42.707Z  INFO myapp: start
    07:46:42.709Z  INFO myapp: creating a wuzzle (widget_type=wuzzle)
    07:46:42.709Z  WARN myapp: This wuzzle is woosey. (widget_type=wuzzle)
    07:46:42.709Z  INFO myapp: done
    
  3. 强大的过滤功能:bunyan提供了强大的过滤功能,例如只显示ERROR级别的日志:

    $ bunyan -l error
    

    或者只显示name为特定值的日志:

    $ bunyan -c 'this.name == "something"'
    

bunyan的不足之处在于,默认情况下它输出的时间是UTC格式,并且没有找到配置时间格式的地方。


总结

总的来说,两个日志框架都还不错。如果没有复杂的日志需求,使用log4js完全足够。如果希望体验日志过滤功能并且对UTC格式的时间输出没有特别要求的话,可以选择bunyan。

最后再提一下winston,这是一个具有极高人气的日志框架,最大的特点是扩展性好,类似于Java的log4j,而且文档完善,star数量高达2600+。不过,它的输出格式可能不是那么美观,且对于初学者来说可能显得过于复杂。


+1

我是被头像吸引进来的。。。╮(╯▽╰)╭

star数确实可以做参考,但是看场景,如果选node框架,我一般都看star数目和commit的勤度

但是一般的pkg,我觉得不一定是最主要的目标,有的小众包其实无依赖,简单

我想问的是bunyan,怎么设置log文件的大小,就像log4js那样可以设置单个log文件的大小

Node.js 日志框架 Bunyan 和 Log4js 比较

log4js

log4js 是一个广泛使用的 Node.js 日志框架,具有以下特点:

  1. Colored Console Logging: 在控制台上输出带颜色的日志。
  2. Output Level: 可以设置日志输出级别,如 DEBUG, INFO, WARN, ERROR 等。
  3. Appenders: 可以配置多个 appender,每个 appender 可以有不同的输出级别。

然而,log4js 的一些缺点包括:

  • 文档相对简陋,配置文件格式不易理解。
  • 难以将特定日志只输出到特定文件,而不输出到控制台。

Bunyan

Bunyan 是另一个流行的日志框架,其特点包括:

  1. JSON 格式输出: 日志输出为 JSON 格式,便于后续处理和分析。

    const bunyan = require('bunyan');
    
    const log = bunyan.createLogger({
        name: 'myapp',
        streams: [
            {
                level: 'info',
                stream: process.stdout, // 输出到控制台
            },
            {
                type: 'rotating-file',
                path: 'logs/app.log', // 输出到文件
                period: '1d', // 每天生成一个新的日志文件
                count: 7, // 保留最近7天的日志
            }
        ]
    });
    
    log.info('Starting the application');
    log.warn('This is a warning message');
    
  2. 可读性: 虽然原始日志输出为 JSON 格式,但可以通过 bunyan 命令行工具转换为更易读的格式。

    $ node myapp.js | bunyan -o short
    
  3. 过滤功能: 可以根据日志级别或条件过滤日志。

    $ bunyan -l error  # 只显示 ERROR 级别的日志
    $ bunyan -c 'this.name === "something"'  # 只显示 name 为 "something" 的日志
    

总结

  • 如果你需要简单的日志配置和输出,log4js 可能更合适。
  • 如果你希望使用 JSON 格式的日志,并且需要强大的过滤和分析功能,Bunyan 是更好的选择。

两者各有优劣,可以根据具体需求选择合适的日志框架。

回到顶部