Heim  >  Artikel  >  Web-Frontend  >  Node.js Protokollverarbeitungsmodul log4js

Node.js Protokollverarbeitungsmodul log4js

高洛峰
高洛峰Original
2017-01-18 13:00:541718Durchsuche

log4js ist das beste Modul für die Protokollverarbeitung von Node.js. Im Vergleich zum Konsolen- oder TJ-Debugging hat es seine Vorteile, insbesondere für Node.js-Projekte, die in Produktion gehen. Folgendes ist unverzichtbar:

Protokollklassifizierung

Protokollklassifizierung

Protokoll Platzierung

Dieser Artikel gibt Ihnen eine umfassende Einführung in log4js, damit Sie log4js problemlos in Ihrem Projekt verwenden können und Sie Probleme online besser überwachen oder beheben können.

Probieren Sie es aus

Die folgenden drei Codezeilen zeigen Ihnen die einfachste Verwendung von log4js:

// file: simplest.js
var log4js = require('log4js');
var logger = log4js.getLogger();
logger.debug("Time:", new Date());

Sie können es telefonisch erhalten .getLogger() Logger-Instanz von log4js Die Verwendung dieser Instanz stimmt mit der Konsole überein. Sie können .debug (es gibt auch .info, .error und andere Methoden) aufrufen, um Protokolle auszugeben.

Führen Sie node simplest.js aus. Die Ausgabe lautet wie folgt:

$node simplest.js
[2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852Z

Zeit: 2016-08-20T16:01:24.852Z ist was wir ausgeben möchten, wird der vorherige Include-Spezifizierer [2016-08-21 00:01:24.852] [DEBUG] [Standard] später aufgelistet.

Ist die Verwendung nicht sehr einfach? Bevor wir uns mit der erweiterten Verwendung von log4js befassen, machen wir uns zunächst mit einigen Konzepten in log4js vertraut.

Ebene

Das ist nicht schwer zu verstehen, es ist die Klassifizierung von Protokollen. Mit der Protokollklassifizierung kann log4js Protokolle für uns besser anzeigen (Protokolle verschiedener Ebenen verwenden beispielsweise unterschiedliche Farben in der Konsole. In der Produktion können Protokolle beispielsweise selektiv auf der Festplatte platziert werden, um einige zu vermeiden). Vertrauliche Informationen, die nur zum Debuggen verwendet werden, wurden durchgesickert.

Log4js-Protokolle sind in neun Ebenen unterteilt. Die Namen und Gewichte jeder Ebene sind wie folgt:

{
 ALL: new Level(Number.MIN_VALUE, "ALL"),
 TRACE: new Level(5000, "TRACE"),
 DEBUG: new Level(10000, "DEBUG"),
 INFO: new Level(20000, "INFO"),
 WARN: new Level(30000, "WARN"),
 ERROR: new Level(40000, "ERROR"),
 FATAL: new Level(50000, "FATAL"),
 MARK: new Level(9007199254740992, "MARK"), // 2^53
 OFF: new Level(Number.MAX_VALUE, "OFF")
}

Vorheriges Bild:

Node.js 日志处理模块log4js

ALLES AUS Diese beiden Ebenen werden nicht direkt im Geschäftscode verwendet. Die restlichen sieben entsprechen den sieben Methoden der Logger-Instanz .trace .debug .info ... . Mit anderen Worten: Wenn Sie diese Methoden aufrufen, entspricht dies dem Festlegen der Ebene für diese Protokolle. Daher ist der DEBUG im vorherigen [2016-08-21 00:01:24.852] [DEBUG] [Standard] - Zeit: 2016-08-20T16:01:24.852Z die Ebene dieses Protokolls.

Typ

Ein weiteres Konzept in log4js ist die Kategorie. Sie können den Typ einer Logger-Instanz festlegen, um Protokolle nach einer anderen Dimension zu unterscheiden:

// file: set-catetory.js
var log4js = require('log4js');
var logger = log4js.getLogger('example');
logger.debug("Time:", new Date());

Wenn Sie eine Logger-Instanz über getLogger abrufen, ist der einzige Parameter, der übergeben werden kann, loggerCategory (z. B. „example“). Verwenden Sie diesen Parameter, um anzugeben, zu welcher Kategorie die Logger-Instanz gehört. Dies ist dasselbe wie das Debuggen von TJ:

var debug = require('debug')('worker');
 
setInterval(function(){
 debug('doing some work');
}, 1000);

„worker“ im Debug wird auch zum Klassifizieren von Protokollen verwendet. Okay, komm zurück und führe node set-catetory.js aus:

[2016-08-21 01:16:00.212] [DEBUG] Beispiel – Zeit: 2016-08-20T17:16:00.212Z
Der einzige Unterschied zum vorherigen [2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852Z besteht darin, dass [default] zu example wird.

Wozu dient die Kategorie? Sie ist flexibler als die Ebene und bietet eine zweite Unterscheidungsdimension für Protokolle. Beispielsweise können Sie für jede Datei eine andere Kategorie festlegen, z. B. in „set-catetory“. js:

// file: set-catetory.js
var log4js = require('log4js');
var logger = log4js.getLogger('set-catetory.js');
logger.debug("Time:", new Date());

kann aus dem Protokoll abgerufen werden [2016-08-21 01:24:07.332] [DEBUG] set-catetory.js – Zeit: 2016-08- 20T17:24:07.331Z Es ist ersichtlich, dass dieses Protokoll aus der Datei set-catetory.js stammt. Oder verwenden Sie unterschiedliche Kategorien für unterschiedliche Knotenpakete, damit Sie unterscheiden können, von welchem ​​Modul die Protokolle stammen.

Appender

Okay, jetzt hat das Protokoll Ebenen und Kategorien, was das Problem der Einstufung und Klassifizierung von Protokollen am Eingang in log4js löst, das Problem des Protokollexports (d. h. des Protokolls). wird nach Where ausgegeben) wird von Appender gelöst.

Standard-Appender

Die folgenden Standard-Appender-Einstellungen in log4js sind:

// log4js.js
defaultConfig = {
 appenders: [{
  type: "console"
 }]
}

Wie Sie sehen können, gibt es keine Konfiguration für log4js Zu diesem Zeitpunkt werden die Protokolle standardmäßig an die Konsole ausgegeben.

Legen Sie Ihren eigenen Appender fest

Wir können den gewünschten Appender über log4js.configure festlegen.

// file: custom-appender.js
var log4js = require('log4js');
log4js.configure({
 appenders: [{
  type: 'file',
  filename: 'default.log'
 }]
})
var logger = log4js.getLogger('custom-appender');
logger.debug("Time:", new Date());

Im obigen Beispiel geben wir das Protokoll in eine Datei aus, führen den Code aus und log4js erstellt eine Datei mit dem Namen default.log im aktuellen Verzeichnis, [2016-08 - 21 08:43:21.272] [DEBUG] custom-appender - Zeit: 2016-08-21T00:43:21.272Z Ausgabe in diese Datei.

Die von log4js bereitgestellten Appender

Console und File sind beide von log4js bereitgestellte Appender. Darüber hinaus gibt es:

DateFile: Das Protokoll wird in eine Datei ausgegeben, und die Protokolldatei kann installiert werden. Spezifisches Datumsmuster, z. B. heute Ausgabe an default-2016-08-21, Ausgabe morgen an default-2016-08-22.log;
Mailgun: Die API gibt Protokolle an Mailgun aus.
levelFilter kann nach Ebene
filtern. Die vollständige Liste finden Sie hier.

Node.js 日志处理模块log4js

Filterstufen und Kategorien

我们可以调整 appender 的配置,对日志的级别和类别进行过滤:

// file: level-and-category.js
var log4js = require('log4js');
log4js.configure({
 appenders: [{
  type: 'logLevelFilter',
  level: 'DEBUG',
  category: 'category1',
  appender: {
   type: 'file',
   filename: 'default.log'
  }
 }]
})
var logger1 = log4js.getLogger('category1');
var logger2 = log4js.getLogger('category2');
logger1.debug("Time:", new Date());
logger1.trace("Time:", new Date());
logger2.debug("Time:", new Date());

运行,在 default.log 中增加了一条日志:

[2016-08-21 10:08:21.630] [DEBUG] category1 - Time: 2016-08-21T02:08:21.629Z
来看一下代码:

使用 logLevelFilter 和 level 来对日志的级别进行过滤,所有权重大于或者等于 DEBUG 的日志将会输出。这也是之前提到的日志级别权重的意义;
通过 category 来选择要输出日志的类别, category2 下面的日志被过滤掉了,该配置也接受一个数组,例如 ['category1', 'category2'] ,这样配置两个类别的日志都将输出到文件中。

Layout

Layout 是 log4js 提供的高级功能,通过 layout 我们可以自定义每一条输出日志的格式。log4js 内置了四中类型的格式:

messagePassThrough:仅仅输出日志的内容;
basic:在日志的内容前面会加上时间、日志的级别和类别,通常日志的默认 layout;
colored/coloured:在 basic 的基础上给日志加上颜色,appender Console 默认使用的就是这个 layout;
pattern:这是一种特殊类型,可以通过它来定义任何你想要的格式。
一个 pattern 的例子:

// file: layout-pattern.js
var log4js = require('log4js');
log4js.configure({
 appenders: [{
  type: 'console',
  layout: {
   type: 'pattern',
   pattern: '[%r] [%[%5.5p%]] - %m%n'
  }
 }]
})
var logger = log4js.getLogger('layout-pattern');
logger.debug("Time:", new Date());

%r %p $m $n 是 log4js 内置的包含说明符,可以借此来输出一些 meta 的信息,更多细节,可以参考 log4js 的 文档 。

一张图再来说明一下,Logger、Appender 和 Layout 的定位。

1Node.js 日志处理模块log4js

实战:输出 Node 应用的 ACCESS 日志 access.log

为了方便查问题,在生产环境中往往会记录应用请求进出的日志。那使用 log4js 怎么实现呢,直接上代码:

// file: server.js
var log4js = require('log4js');
var express = require('express');
 
log4js.configure({
 appenders: [{
  type: 'DateFile',
  filename: 'access.log',
  pattern: '-yyyy-MM-dd.log',
  alwaysIncludePattern: true,
  category: 'access'
 }]
});
 
var app = express();
app.use(log4js.connectLogger(log4js.getLogger('access'), { level: log4js.levels.INFO }));
app.get('/', function(req,res) {
 res.send('前端外刊评论');
});
app.listen(5000);

   

看看我们做了哪些事情:

配置了一个 appender,从日志中选出类别为 access 的日志,输出到一个滚动的文件中;
log4js.getLogger('access') 获取一个类别为 access 的 Logger 实例,传递给 log4js.connectLogger 中间件,这个中间件收集访问信息,通过这个实例打出。
启动服务器,访问 http://localhost:5000,你会发现目录中多了一个名为 access.log-2016-08-21.log 的文件,里面有两条日志:

[2016-08-21 14:34:04.752] [INFO] access - ::1 - - "GET / HTTP/1.1" 200 18 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
[2016-08-21 14:34:05.002] [INFO] access - ::1 - - "GET /favicon.ico HTTP/1.1" 404 24 "http://localhost:5000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"

通过 log4js 日志的分类和appender功能,我们把访问日志输出到了一个滚动更新的文件之中。

总结

本文为大家全面地介绍了 log4js 的用法,与 console 或者简单的日志工具相比,log4js 使用起来更复杂,当然功能更强大,适合生产级应用的使用。如果大家有兴趣的话,请留言告诉外刊君,接下来可能为大家介绍如何在 Node 应用中做配置管理。

更多Node.js 日志处理模块log4js相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn