2014-11-27 6 views

ответ

8

Вы можете использовать ковбойские 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]}]). 
1

Вместо этого попробуйте использовать азот поверх веб-сервера Yaws, поскольку он выполняет регистрацию доступа по умолчанию.

+0

Это решение, но я хотел бы продолжать использовать CowBoy, если это возможно. Я обнаружил, что один из способов зарегистрировать каждый запрос с ковбоем - это [hooks] (http://ninenines.eu/docs/en/cowboy/HEAD/guide/hooks/), но я должен использовать систему для буферизации записи Я не являюсь узким местом для всех операций ввода-вывода, создаваемых путем записи журналов? – Maeln

+1

Единственный способ убедиться в этом - это измерить вашу систему. Но в Yaws в журнале регистрации по умолчанию есть «gen_server», открывающий файл для записи в необработанном режиме и запись вызовов, передаваемых в процесс «gen_server», который затем записывает его. Кстати, вам также придется беспокоиться о вращении журнала. –

+0

Я посмотрю исходный код Yaws, чтобы посмотреть, как они это делают. Спасибо за указание. – Maeln

1

Каждый базовый веб-сервер делает это по-другому (или совсем нет) - это нечто простое_модуль еще не абстрагируется.

Так что в случае с ковбой вам, вероятно, придется пристроить его самостоятельно.

Если вы используете новую сборку азота (если у вас есть файл 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().

В качестве альтернативы, ваш вариант крючков с ковбой может работать. Я не работал с ними, так что вы сами по себе есть :)

+0

Спасибо, Это именно то, что я искал! – Maeln