私の Web サイトの 1 つは、Cowboy サーバーで Nitrogen を使用しています。Apache が access.log で行うように、Web ページへのすべてのアクセスをログに記録したいと考えています。それを行う最良の方法は何ですか?
3 に答える
カウボーイ ミドルウェアを使用できますhttps://ninenes.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]}]).
基礎となる各 Web サーバーは異なる方法で (またはまったく) 処理を行います。これは、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()
.
または、カウボーイのフック オプションも同様に機能します。私は彼らと一緒に仕事をしたことがないので、あなたは自分でそこにいます:)
代わりに Yaws Web サーバー上で Nitrogen を使用してみてください。これは、デフォルトでアクセス ログを実行するためです。