Nodejs日志框架bunyan和log4js比较
Nodejs日志框架bunyan和log4js比较
夜深写的,有些地方没仔细写,不过还是想跟大家分享一下。
正文
写代码少不了日志框架,这里我谈一下nodejs里我接触过的两个日志框架bunyan和log4js。
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+,拥有超高人气。缺点是我觉得其过于复杂,而且输出很难看。
Nodejs日志框架bunyan和log4js比较
博客:Nodejs日志框架bunyan和log4js比较
正文
写代码少不了日志框架,这里我谈一下nodejs里我接触过的两个日志框架bunyan和log4js。
log4js
打开log4js的GitHub可以看到star数在600+,作为一个nodejs开源项目已经算不错了。log4js的基本特性包括:
- 可以在控制台中输出带颜色的日志。
- 可以设置输出等级(如info, warn, error等)。
- 可以配置输出格式。
但是,log4js的文档相对简陋,尤其是关于如何配置输出格式的部分不够详细。此外,虽然它可以为不同类别的appender设置不同的输出级别,但实际使用中感觉不太实用。
log4js的一个问题在于它不能方便地将某个日志只输出到特定的文件,而不同时在控制台输出或与其他日志混在一起。这是我后来转向bunyan的原因之一。
bunyan
bunyan是一个很有特点的日志框架,它的主要特点包括:
-
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");
-
可读性转换工具:通过安装
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提供了强大的过滤功能,例如只显示ERROR级别的日志:
$ bunyan -l error
或者只显示name为特定值的日志:
$ bunyan -c 'this.name == "something"'
bunyan的不足之处在于,默认情况下它输出的时间是UTC格式,并且没有找到配置时间格式的地方。
总结
总的来说,两个日志框架都还不错。如果没有复杂的日志需求,使用log4js完全足够。如果希望体验日志过滤功能并且对UTC格式的时间输出没有特别要求的话,可以选择bunyan。
最后再提一下winston,这是一个具有极高人气的日志框架,最大的特点是扩展性好,类似于Java的log4j,而且文档完善,star数量高达2600+。不过,它的输出格式可能不是那么美观,且对于初学者来说可能显得过于复杂。
赞+1
+1
我是被头像吸引进来的。。。╮(╯▽╰)╭
star数确实可以做参考,但是看场景,如果选node框架,我一般都看star数目和commit的勤度
但是一般的pkg,我觉得不一定是最主要的目标,有的小众包其实无依赖,简单
赞
我想问的是bunyan,怎么设置log文件的大小,就像log4js那样可以设置单个log文件的大小
https://github.com/baryon/tracer
用我写的吧,足够用
Node.js 日志框架 Bunyan 和 Log4js 比较
log4js
log4js
是一个广泛使用的 Node.js 日志框架,具有以下特点:
- Colored Console Logging: 在控制台上输出带颜色的日志。
- Output Level: 可以设置日志输出级别,如
DEBUG
,INFO
,WARN
,ERROR
等。 - Appenders: 可以配置多个 appender,每个 appender 可以有不同的输出级别。
然而,log4js
的一些缺点包括:
- 文档相对简陋,配置文件格式不易理解。
- 难以将特定日志只输出到特定文件,而不输出到控制台。
Bunyan
Bunyan
是另一个流行的日志框架,其特点包括:
-
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');
-
可读性: 虽然原始日志输出为 JSON 格式,但可以通过
bunyan
命令行工具转换为更易读的格式。$ node myapp.js | bunyan -o short
-
过滤功能: 可以根据日志级别或条件过滤日志。
$ bunyan -l error # 只显示 ERROR 级别的日志 $ bunyan -c 'this.name === "something"' # 只显示 name 为 "something" 的日志
总结
- 如果你需要简单的日志配置和输出,
log4js
可能更合适。 - 如果你希望使用 JSON 格式的日志,并且需要强大的过滤和分析功能,
Bunyan
是更好的选择。
两者各有优劣,可以根据具体需求选择合适的日志框架。