Maison > interface Web > js tutoriel > Méthode de Morgan du composant de journal par défaut express

Méthode de Morgan du composant de journal par défaut express

亚连
Libérer: 2018-05-26 15:17:43
original
1637 Les gens l'ont consulté

Morgan est le middleware de journalisation par défaut d'Express. Cet article présente principalement la méthode du composant de journalisation par défaut d'Express, Morgan. Je vais maintenant le partager avec vous et lui donner une référence.

Aperçu du chapitre

Morgan est le middleware de journalisation par défaut d'Express et peut également être séparé d'Express et utilisé comme node.js composant de journalisation À utiliser seul. Cet article va du superficiel au profond, et le contenu comprend principalement :

  1. Exemples d'introduction à l'utilisation de Morgan

  2. Comment enregistrer les journaux dans des fichiers locaux

  3. Instructions et exemples d'utilisation de l'API principale

  4. Utilisation avancée : 1. Fractionnement des journaux 2. Écrire les journaux dans la base de données

  5. Analyse du code source : format de journal de Morgan et précompilation

Exemple de démarrage

Tout d'abord, initialisez le projet.

npm install express morgan
Copier après la connexion

Ensuite, ajoutez le code suivant dans basic.js.

var express = require('express');
var app = express();
var morgan = require('morgan');

app.use(morgan('short'));
app.use(function(req, res, next){
 res.send('ok');
});

app.listen(3000);
Copier après la connexion

node basic.jsExécutez le programme et accédez à http://127.0.0.1:3000 dans le navigateur Le journal d'impression est le suivant<🎜. >

➜ 2016.12.11-advanced-morgan git:(master) ✗ node basic.js

::ffff:127.0.0.1 - GET / HTTP/1.1 304 - - 3.019 ms
::ffff: 127.0.0.1 - GET /favicon.ico HTTP/1.1 200 2 - 0,984 ms

Imprimer le journal dans un fichier local

morgan prend en charge les éléments de configuration du flux , qui peut être transmis Il est utilisé pour obtenir l'effet des journaux d'atterrissage. Le code est le suivant :

var express = require(&#39;express&#39;);
var app = express();
var morgan = require(&#39;morgan&#39;);
var fs = require(&#39;fs&#39;);
var path = require(&#39;path&#39;);
var accessLogStream = fs.createWriteStream(path.join(__dirname, &#39;access.log&#39;), {flags: &#39;a&#39;});
app.use(morgan(&#39;short&#39;, {stream: accessLogStream}));
app.use(function(req, res, next){
 res.send(&#39;ok&#39;);
});
app.listen(3000);
Copier après la connexion

Explication de l'utilisation<🎜. >
API de base


morgan a très peu d'API. La plus fréquemment utilisée est morgan(), qui renvoie un middleware de journalisation express.


morgan(format, options)
Copier après la connexion

La description du paramètre est la suivante :


    format : facultatif, morgan et Plusieurs formats de journaux sont définis, chaque format a un nom correspondant, tel que combiné, court, etc. La valeur par défaut est par défaut. Les différences entre les différents formats peuvent être trouvées ici. Ce qui suit explique comment personnaliser le format du journal.
  1. options : facultatives, éléments de configuration, y compris le flux (couramment utilisé), le saut et l'immédiat.
  2. stream : configuration du flux de sortie du journal, la valeur par défaut est process.stdout.
  3. ignorer : si vous souhaitez ignorer la journalisation, veuillez vous référer à ici pour l'utilisation.
  4. immédiat : valeur booléenne, la valeur par défaut est false. Lorsque vrai, le journal sera enregistré dès que la demande est reçue ; si faux, le journal sera enregistré après le retour de la demande.

Format de journal personnalisé


Comprenez d'abord les deux concepts de Morgan : le format et le jeton. Très simple :


    format : format du journal, qui est essentiellement une chaîne représentant le format du journal, tel que : méthode :url :status :res[content-length] - : temps de réponse ms.
  1. Jeton : les composants de format, tels que :method et :url ci-dessus, sont ce qu'on appelle des jetons.
  2. Après avoir compris la différence entre le format et le jeton, vous pouvez jeter un œil aux API clés concernant la personnalisation des formats de journaux dans Morgan.


morgan.format(name, format); // 自定义日志格式
morgan.token(name, fn); // 自定义token
Copier après la connexion

Format personnalisé


C'est très simple, premier passage morgan.format () Définissez le format de journal nommé joke, puis appelez-le via morgan('joke').


var express = require(&#39;express&#39;);
var app = express();
var morgan = require(&#39;morgan&#39;);
morgan.format(&#39;joke&#39;, &#39;[joke] :method :url :status&#39;);
app.use(morgan(&#39;joke&#39;));
app.use(function(req, res, next){
 res.send(&#39;ok&#39;);
});
app.listen(3000);
Copier après la connexion

Jetons un coup d'œil aux résultats en cours

➜ 2016.12.11-advanced-morgan git:(master ) ✗ nœud morgan.format.js

[blague] GET / 304

[blague] GET /favicon.ico 200

jeton personnalisé


Le code est le suivant, personnalisez le jeton via morgan.token(), puis ajoutez le jeton personnalisé au format personnalisé.

var express = require(&#39;express&#39;);
var app = express();
var morgan = require(&#39;morgan&#39;);
// 自定义token
morgan.token(&#39;from&#39;, function(req, res){
 return req.query.from || &#39;-&#39;;
});
// 自定义format,其中包含自定义的token
morgan.format(&#39;joke&#39;, &#39;[joke] :method :url :status :from&#39;);

// 使用自定义的format
app.use(morgan(&#39;joke&#39;));
app.use(function(req, res, next){
 res.send(&#39;ok&#39;);
});
app.listen(3000);
Copier après la connexion

Exécutez le programme et visitez http://127.0.0.1:3000/hello?from=app et

dans le navigateur http. ://127.0.0.1:3000/hello?from=pc

➜ 2016.12.11-advanced-morgan git:(master) ✗ node morgan.token.js

[blague] GET /hello?from=app 200 app

[blague] GET /favicon.ico 304 -
[blague] GET /hello?from=pc 200 pc
[blague] GET /favicon.ico 304 -

Utilisation avancée

Découpe de bûches


Une candidature en ligne, si tous les journaux sont stockés dans le même fichier local, le fichier deviendra très volumineux avec le temps, ce qui affectera les performances et sera peu pratique à visualiser. À ce stade, vous devez utiliser la segmentation des journaux.


Avec le plug-in file-stream-rotator, le fractionnement des bûches peut être facilement réalisé. À l’exception du code de configuration lié à file-stream-rotator, le reste est similaire à l’exemple précédent, je n’entrerai donc pas dans les détails ici.

var FileStreamRotator = require(&#39;file-stream-rotator&#39;)
var express = require(&#39;express&#39;)
var fs = require(&#39;fs&#39;)
var morgan = require(&#39;morgan&#39;)
var path = require(&#39;path&#39;)

var app = express()
var logDirectory = path.join(__dirname, &#39;log&#39;)

// ensure log directory exists
fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory)

// create a rotating write stream
var accessLogStream = FileStreamRotator.getStream({
 date_format: &#39;YYYYMMDD&#39;,
 filename: path.join(logDirectory, &#39;access-%DATE%.log&#39;),
 frequency: &#39;daily&#39;,
 verbose: false
})

// setup the logger
app.use(morgan(&#39;combined&#39;, {stream: accessLogStream}))

app.get(&#39;/&#39;, function (req, res) {
 res.send(&#39;hello, world!&#39;)
})
Copier après la connexion

Le journal est écrit dans la base de données


Parfois, nous avons un tel besoin , écrit le journal d'accès à la base de données. Cette exigence est courante dans les systèmes de journalisation qui nécessitent des statistiques de requête en temps réel.

在morgan里该如何实现呢?从文档上,并没有看到适合的扩展接口。于是查阅了下morgan的源码,发现实现起来非常简单。

回顾下之前日志写入本地文件的例子,最关键的两行代码如下。通过stream指定日志的输出流。

var accessLogStream = fs.createWriteStream(path.join(__dirname, &#39;access.log&#39;), {flags: &#39;a&#39;});
app.use(morgan(&#39;short&#39;, {stream: accessLogStream}));
Copier après la connexion

在morgan内部,大致实现是这样的(简化后)。

// opt为配置文件
var stream = opts.stream || process.stdout;
var logString = createLogString(); // 伪代码,根据format、token的定义,生成日志
stream.write(logString);
Copier après la connexion

于是,可以用比较取巧的方式来实现目的:声明一个带write方法的对象,并作为stream配置传入。

var express = require(&#39;express&#39;);
var app = express();
var morgan = require(&#39;morgan&#39;);

// 带write方法的对象
var dbStream = {
 write: function(line){
 saveToDatabase(line); // 伪代码,保存到数据库
 }
};

// 将 dbStream 作为 stream 配置项的值
app.use(morgan(&#39;short&#39;, {stream: dbStream}));
app.use(function(req, res, next){
 res.send(&#39;ok&#39;);
});

app.listen(3000);
Copier après la connexion

深入剖析

morgan的代码非常简洁,从设计上来说,morgan的生命周期包含:

token定义 --> 日志格式定义 -> 日志格式预编译 --> 请求达到/返回 --> 写日志

其中,token定义、日志格式定义前面已经讲到,这里就只讲下 日志格式预编译 的细节。

跟模板引擎预编译一样,日志格式预编译,也是为了提升性能。源码如下,最关键的代码就是compile(fmt)。

 function getFormatFunction (name) {
 // lookup format
 var fmt = morgan[name] || name || morgan.default

 // return compiled format
 return typeof fmt !== &#39;function&#39;
 ? compile(fmt)
 : fmt
}
Copier après la connexion

compile()方法的实现细节这里不赘述,着重看下compile(fmt)返回的内容:

var morgan = require(&#39;morgan&#39;);
var format = morgan[&#39;tiny&#39;];
var fn = morgan.compile(format);

console.log(fn.toString());
Copier après la connexion

运行上面程序,输出内容如下,其中tokens其实就是morgan。

function anonymous(tokens, req, res
/**/) {
 return ""
 + (tokens["method"](req, res, undefined) || "-") + " "
 + (tokens["url"](req, res, undefined) || "-") + " "
 + (tokens["status"](req, res, undefined) || "-") + " "
 + (tokens["res"](req, res, "content-length") || "-") + " - "
 + (tokens["response-time"](req, res, undefined) || "-") + " ms";
}
Copier après la connexion

看下morgan.token()的定义,就很清晰了

function token (name, fn) {
 morgan[name] = fn
 return this
}
Copier après la connexion

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

ajax请求之返回数据的顺序问题分析

解决ajax返回验证的时候总是弹出error错误的方法

防止重复发送Ajax请求的解决方案

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

É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