我的一个网站是使用 Nitrogen 和 Cowboy 服务器。我想记录对网页的每次访问,就像 Apache 使用 access.log 一样。最好的方法是什么?
3 回答
您可以使用牛仔中间件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]}]).
尝试在 Yaws Web 服务器上使用 Nitrogen,因为它默认执行访问日志记录。
每个底层网络服务器都以不同的方式(或根本不这样做) - 这是 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()
或者,你的牛仔钩选项也可以工作。我没有和他们一起工作过,所以你自己在那里:)