2

我的一个网站是使用 Nitrogen 和 Cowboy 服务器。我想记录对网页的每次访问,就像 Apache 使用 access.log 一样。最好的方法是什么?

4

3 回答 3

9

您可以使用牛仔中间件https://ninenines.eu/docs/en/cowboy/1.0/guide/middlewares/

只需创建一个简单的日志模块:

-module(app_web_log).
-behaviour(cowboy_middleware).

-export([execute/2]).

execute(Req, Env) ->
    {{Peer, _}, Req2} = cowboy_req:peer(Req),
    {Method, Req3} = cowboy_req:method(Req2),
    {Path, Req4} = cowboy_req:path(Req3),
    error_logger:info_msg("~p: [~p]: ~p ~p", [calendar:universal_time(), Peer, Method, Path]),
    {ok, Req4, Env}.

并将其添加到中间件列表中:

    {ok, _} = cowboy:start_http(http, 100, [{port, 8080}], [
            {env, [{dispatch, Dispatch}]},
            {middlewares, [cowboy_router, app_web_log, cowboy_handler]}]).
于 2014-12-02T21:22:42.007 回答
1

尝试在 Yaws Web 服务器上使用 Nitrogen,因为它默认执行访问日志记录。

于 2014-11-28T14:49:45.477 回答
1

每个底层网络服务器都以不同的方式(或根本不这样做) - 这是 simple_bridge 尚未抽象的东西。

所以在牛仔的情况下,你可能不得不自己装配它。

如果您使用的是更新版本的 Nitrogen(如果您有文件site/src/nitrogen_main_handler.erl),那么您可以编辑该文件以手动记录自己。例如,使用 erlang 的错误处理程序,您可以添加一些简单的内容,例如:

log_request() ->
    error_logger:info_msg("~p: [~p]: ~p", [{date(), time()}, wf:peer_ip(), wf:url()]).

run() ->
    handlers(),
    log_request(), %% <--- insert before wf_core:run()
    wf_core:run().

然后可以通过配置 error_logger 写入磁盘来处理日志发生的任何事情(http://erldocs.com/17.0/kernel/error_logger.html?i=13&search=error_logger#logfile/1

如果您使用较旧的 Nitrogen(应该有),那么您将在调用site/src/nitrogen_cowboy.erl之前再次编辑该文件。wf_core:run()

或者,你的牛仔钩选项也可以工作。我没有和他们一起工作过,所以你自己在那里:)

于 2014-12-02T02:10:35.197 回答