如何在不使用日志库的情况下记录对 hapi 服务器的所有请求?

Posted

技术标签:

【中文标题】如何在不使用日志库的情况下记录对 hapi 服务器的所有请求?【英文标题】:How to log all requests made to a hapi server without using a logging library? 【发布时间】:2015-06-27 01:58:49 【问题描述】:

我希望看到一个漂亮的日志,其中包含有关对我的服务器的每个请求的简短信息,以在开发期间使用。我在http://hapijs.com/api#request-logs 上看过文档,但我对它的理解还不够,无法让它发挥作用。

当我创建服务器时,我应该将什么作为config 对象传递?然后我应该听事件并记录它们还是自动发生?如何记录所有请求,而不仅仅是错误?

我想避免安装日志库。

【问题讨论】:

您是否尝试过使用 http://hapijs.com/tutorials/logging 中建议的 Good 或 Bucker 之类的插件? 我见过这个,但我宁愿不引入一个新的库,除非它真的有必要。我想要一个所有请求的简单日志,就像大多数库默认做的那样。 Hapi 真的需要插件吗? Good 已弃用。 "注意:由于缺乏可用的支持资源,此模块将于 2020 年 12 月 31 日弃用。请考虑使用其他日志记录插件。" 【参考方案1】:

于是我找到了办法:

server.events.on('response', function (request) 
    console.log(request.info.remoteAddress + ': ' + request.method.toUpperCase() + ' ' + request.path + ' --> ' + request.response.statusCode);
);

日志如下所示:

127.0.0.1: GET /myEndpoint/1324134?foo=bar --> 200
127.0.0.1: GET /sgsdfgsdrh --> 404

为 Hapi v18 编辑了答案,see older versions here

【讨论】:

你应该使用Good或其他logging插件。 不不不。我已经在我不想记录库的问题中写道。我在 cmets 中对其他答案重复了这一点。我只需要一个 simple 日志记录供开发人员使用。 good 可能是对 your 问题的回答,但它不是对 my 问题的回答。 request.response.source 获取响应正文 从 hapi v17 开始,它是 server.events.on() 而不是 'server.on()` 在 Hapi v18 中,使用 request.url.pathnamerequest.path【参考方案2】:

在 v17 以上的 Hapi.js 版本中,请进行以下更改以使其正常工作:

server.events.on('response', function (request) 
    // you can use request.log or server.log it's depends
    server.log(request.info.remoteAddress + ': ' + request.method.toUpperCase() + ' ' + request.url.path + ' --> ' + request.response.statusCode);
);

日志将是:

127.0.0.1: GET /todo --> 200

【讨论】:

【参考方案3】:

最简单的方法是将good 模块与good 记者之一一起使用,例如good-file。这是一个如何使用它的示例:

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-file'),
            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);
    );
);

【讨论】:

我宁愿不为项目添加另一个库,只是为了简单地记录所有请求。 请注意,您还 can't customize the output format with good. 接受的答案比这更容易,因为您不必担心插件版本不兼容。 Good 已弃用。 "注意:由于缺乏可用的支持资源,此模块将于 2020 年 12 月 31 日弃用。请考虑使用其他日志记录插件。"

以上是关于如何在不使用日志库的情况下记录对 hapi 服务器的所有请求?的主要内容,如果未能解决你的问题,请参考以下文章

在不阻止的情况下发送批量通知电子邮件

如何在不使用支持库的情况下实现水平滑动?

如何在不禁用进一步日志记录的情况下清除 catalina.out?

如何在不使用 Python 中的外部库的情况下解析 arff 文件

(如何)我可以在不安装完整的 boost 库的情况下使用 boost::spirit X3 吗?

如何在不使用任何库的情况下在颤振中使用 bloc