Maison > interface Web > js tutoriel > Module de traitement des journaux Node.js log4js

Module de traitement des journaux Node.js log4js

高洛峰
Libérer: 2017-01-18 13:00:54
original
1752 Les gens l'ont consulté

log4js est le meilleur module pour le traitement des journaux Node.js. Par rapport au débogage console ou TJ, il a ses avantages Surtout pour les projets Node.js mis en production, les éléments suivants sont indispensables :

Classification des journaux

Classification des journaux

Classification des journaux. placement

Cet article vous donnera une introduction complète à log4js, afin que vous puissiez utiliser log4js facilement dans votre projet. Le développement et le débogage sont faciles et vous pouvez mieux surveiller ou résoudre les problèmes en ligne.

Essayez-le

Les trois lignes de code suivantes vous montrent l'utilisation la plus simple de log4js :

// file: simplest.js
var log4js = require('log4js');
var logger = log4js.getLogger();
logger.debug("Time:", new Date());
Copier après la connexion

Vous pouvez l'obtenir en appelant .getLogger() Instance Logger de log4js. L'utilisation de cette instance est cohérente avec la console. Vous pouvez appeler .debug (il existe également .info, .error et d'autres méthodes) pour générer des journaux.

Exécutez node simplest.js, le résultat est le suivant :

$node simplest.js
[2016-08-21 00:01:24.852] [DEBUG] [default] - Time: 2016-08-20T16:01:24.852Z
Copier après la connexion

Heure : 2016-08-20T16:01:24.852Z est ce que nous souhaitez afficher, le spécificateur d'inclusion précédent [2016-08-21 00:01:24.852] [DEBUG] [par défaut] sera répertorié plus tard.

N'est-ce pas très simple à utiliser ? Eh bien, avant de plonger dans l'utilisation avancée de log4js, familiarisons-nous d'abord avec quelques concepts de log4js.

Niveau

Ce n'est pas difficile à comprendre, c'est la classification des logs. Avec la classification des journaux, log4js peut mieux afficher les journaux pour nous (les journaux de différents niveaux utilisent des couleurs différentes dans la console, par exemple, l'erreur est généralement rouge. En production, les journaux peuvent être placés de manière sélective sur le disque, par exemple, pour éviter certains). les journaux appartenant à. Des informations sensibles utilisées uniquement pour le débogage ont été divulguées.

Les journaux Log4js sont divisés en neuf niveaux. Les noms et poids de chaque niveau sont les suivants :

{
 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")
}
Copier après la connexion

Image précédente :

Node.js 日志处理模块log4js

ALL OFF Ces deux niveaux ne seront pas utilisés directement dans le code métier. Les sept autres correspondent aux sept méthodes de l'instance Logger, .trace .debug .info ... . En d’autres termes, lorsque vous appelez ces méthodes, cela équivaut à définir le niveau de ces journaux. Par conséquent, le DEBUG dans le précédent [2016-08-21 00:01:24.852] [DEBUG] [par défaut] - Heure : 2016-08-20T16:01:24.852Z est le niveau de ce journal.

Type

Un autre concept dans log4js est la catégorie. Vous pouvez définir le type d'une instance Logger pour distinguer les journaux selon une autre dimension :

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

Lors de l'obtention d'une instance Logger via getLogger, le seul paramètre qui peut être transmis est loggerCategory (tel que 'example'). Utilisez ce paramètre pour spécifier à quelle catégorie appartient l'instance Logger. C'est la même chose que le débogage de TJ :

var debug = require('debug')('worker');
 
setInterval(function(){
 debug('doing some work');
}, 1000);
Copier après la connexion

'worker' dans le débogage est également utilisé pour classer les journaux. D'accord, revenez et exécutez node set-catetory.js :

[2016-08-21 01:16:00.212] Exemple [DEBUG] - Heure : 2016-08-20T17:16:00.212Z
La seule différence par rapport au précédent [2016-08-21 00:01:24.852] [DEBUG] [par défaut] - Heure : 2016-08-20T16:01:24.852Z est que [par défaut] devient exemple .

À quoi sert la catégorie ? Elle est plus flexible que le niveau et fournit une deuxième dimension de distinction pour les journaux. Par exemple, vous pouvez définir une catégorie différente pour chaque fichier, comme dans set-catetory In . js :

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

peut être récupéré à partir du journal [2016-08-21 01:24:07.332] [DEBUG] set-catetory.js - Heure : 2016-08- 20T17:24:07.331Z On peut voir que ce journal provient du fichier set-catetory.js. Ou utilisez différentes catégories pour différents packages de nœuds, afin de pouvoir distinguer de quel module proviennent les journaux.

Appender

D'accord, maintenant le journal a des niveaux et des catégories, ce qui résout le problème de notation et de classification des journaux à l'entrée dans log4js, le problème de l'exportation des journaux (c'est-à-dire le journal. est sorti vers Where) est résolu par Appender.

Appender par défaut

Voici les paramètres d'appender par défaut dans log4js :

// log4js.js
defaultConfig = {
 appenders: [{
  type: "console"
 }]
}
Copier après la connexion

Comme vous pouvez le voir, il n'y a pas de configuration pour log4js À ce stade, les journaux sont affichés par défaut sur la console.

Définissez votre propre appender

Nous pouvons définir l'appender que nous voulons via log4js.configure.

// 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());
Copier après la connexion

Dans l'exemple ci-dessus, nous générons le journal dans un fichier, exécutons le code, log4js crée un fichier nommé default.log dans le répertoire actuel, [2016-08- 21 08:43:21.272] [DEBUG] appender personnalisé - Heure : 2016-08-21T00:43:21.272Z sortie dans ce fichier.

Les appenders fournis par log4js

Console et File sont tous deux des appenders fournis par log4js. De plus, il y a :

DateFile : le journal est généré dans un fichier et. le fichier journal peut être installé avec un modèle de date spécifique, par exemple, sortie vers default-2016-08-21.log aujourd'hui et default-2016-08-22.log demain
SMTP : sortie du journal par e-mail <🎜 ; >Mailgun : via Mailgun L'API génère des journaux vers Mailgun ;
levelFilter peut filtrer par niveau
et d'autres appenders, vous pouvez voir la liste complète ici.

Node.js 日志处理模块log4js

Niveaux et catégories de filtre

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

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

运行,在 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(&#39;log4js&#39;);
log4js.configure({
 appenders: [{
  type: &#39;console&#39;,
  layout: {
   type: &#39;pattern&#39;,
   pattern: &#39;[%r] [%[%5.5p%]] - %m%n&#39;
  }
 }]
})
var logger = log4js.getLogger(&#39;layout-pattern&#39;);
logger.debug("Time:", new Date());
Copier après la connexion

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

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

1Node.js 日志处理模块log4js

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

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

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

   

看看我们做了哪些事情:

配置了一个 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中文网!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal