Один из моих сайтов использует азот с сервером Cowboy. Я хотел бы регистрировать каждый доступ к веб-страницам, как это делает Apache с access.log. Что было бы лучшим способом сделать это?Лучший способ регистрации доступа к веб-страницам
ответ
Вы можете использовать ковбойские 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, поскольку он выполняет регистрацию доступа по умолчанию.
Каждый базовый веб-сервер делает это по-другому (или совсем нет) - это нечто простое_модуль еще не абстрагируется.
Так что в случае с ковбой вам, вероятно, придется пристроить его самостоятельно.
Если вы используете новую сборку азота (если у вас есть файл 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)
Если вы используете более старый Азот (который имел бы site/src/nitrogen_cowboy.erl
), то вы аналогичным образом отредактируете этот файл еще раз перед вызовом wf_core:run()
.
В качестве альтернативы, ваш вариант крючков с ковбой может работать. Я не работал с ними, так что вы сами по себе есть :)
Спасибо, Это именно то, что я искал! – Maeln
Это решение, но я хотел бы продолжать использовать CowBoy, если это возможно. Я обнаружил, что один из способов зарегистрировать каждый запрос с ковбоем - это [hooks] (http://ninenines.eu/docs/en/cowboy/HEAD/guide/hooks/), но я должен использовать систему для буферизации записи Я не являюсь узким местом для всех операций ввода-вывода, создаваемых путем записи журналов? – Maeln
Единственный способ убедиться в этом - это измерить вашу систему. Но в Yaws в журнале регистрации по умолчанию есть «gen_server», открывающий файл для записи в необработанном режиме и запись вызовов, передаваемых в процесс «gen_server», который затем записывает его. Кстати, вам также придется беспокоиться о вращении журнала. –
Я посмотрю исходный код Yaws, чтобы посмотреть, как они это делают. Спасибо за указание. – Maeln