如何在hapi.js服务器上编写Apache访问日志

我只是对hapijs而言是一个新手,并且做了一个简单的服务器。 现在我想有一个像写access.log的apache。 什么是最好的方法来做到这一点?

我可以只使用hapijs服务器来做到这一点,还是我应该更好地尝试整合winston来做到这一点? 如果第二个是更好的,你知道如何整合它。

最简单的方法就是使用good-apache-log记者的good模块。 这里是一个如何使用它的例子:

 var Hapi = require('hapi'); var Good = require('good'); var server = new Hapi.Server(); server.connection({ port: 8080 }); server.route({ method: 'GET', path: '/', handler: function (request, reply) { reply('Hello, world!'); } }); server.route({ method: 'GET', path: '/{name}', handler: function (request, reply) { reply('Hello, ' + encodeURIComponent(request.params.name) + '!'); } }); server.register({ register: Good, options: { reporters: [{ reporter: require('good-apache-log'), events: { response: '*', log: '*' }, config: { path: '/var/log/hapi', rotate: 'daily' } }] } }, function (err) { if (err) { throw err; // something bad happened loading the plugin } server.start(function () { server.log('info', 'Server running at: ' + server.info.uri); }); }); 

要获得与Apache访问日志相似的内容,您可以使用Good和Good-File记者并logging所有response事件:

 var Hapi = require('hapi'); var server = new Hapi.Server(); server.connection({ port: 4000 }); var options = { reporters: [ { reporter: require('good-file'), events: { response: '*' }, config: 'access.log' // The file to log to } ] }; server.register([ { register: require('good'), options: options } ], function (err) { if (err) { throw err; } server.start(function (err) { if (err) { throw err; } console.log('Server started!'); }); }); 

它将为文件的每个请求logging大量数据,但可以使用configuration选项对其进行过滤:

404响应的示例日志项目:

 { "event":"response", "timestamp":1438690799059, "id":"1438690799059:Matts-iMac.local:12134:icxbcqzv:10000", "instance":"http://Matts-iMac.local:4000", "labels":[ ], "method":"get", "path":"/;jkdghkjsdgf", "query":{ }, "responseTime":19, "statusCode":404, "pid":12134, "source":{ "remoteAddress":"127.0.0.1", "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36" }, "log":[ { "request":"1438690799059:Matts-iMac.local:12134:icxbcqzv:10000", "timestamp":1438690799063, "tags":[ "received" ], "data":{ "id":"1438690799059:Matts-iMac.local:12134:icxbcqzv:10000", "method":"get", "url":"/;jkdghkjsdgf", "agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36" }, "internal":true }, { "request":"1438690799059:Matts-iMac.local:12134:icxbcqzv:10000", "timestamp":1438690799067, "tags":[ "handler", "error" ], "data":{ "msec":0.7662460058927536, "error":"Not Found", "data":{ "data":null, "isBoom":true, "isServer":false, "output":{ "statusCode":404, "payload":{ "statusCode":404, "error":"Not Found" }, "headers":{ "content-type":"application/json; charset=utf-8", "cache-control":"no-cache", "content-encoding":"gzip", "vary":"accept-encoding" } }, "message":"Not Found" } }, "internal":true }, { "request":"1438690799059:Matts-iMac.local:12134:icxbcqzv:10000", "timestamp":1438690799078, "tags":[ "response" ], "internal":true } ] }