Лучший способ зарегистрировать доступ к веб-страницам
Один из моих сайтов использует азот с сервером 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]}]).
Вместо этого попробуйте использовать Nitrogen поверх веб-сервера Yaws, так как он по умолчанию ведет протоколирование доступа.
Каждый базовый веб-сервер делает это по-своему (или не делает это вообще) - это то, что simple_bridge еще не абстрагировал.
Так что в случае с ковбоем, вам, вероятно, придется подстроить это самостоятельно.
Если вы используете более новую сборку азота (если у вас есть файл 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)
Если вы используете более старый азот (который будет иметь site/src/nitrogen_cowboy.erl
), то вы аналогичным образом отредактируете этот файл, еще раз до wf_core:run()
вызов.
В качестве альтернативы, ваш вариант крючков с ковбоем может также работать. Я с ними не работал, так что ты там сам по себе:)