diff options
-rw-r--r-- | deps/rabbitmq_web_dispatch/src/webmachine_log.erl | 44 | ||||
-rw-r--r-- | deps/rabbitmq_web_dispatch/src/webmachine_log_handler.erl | 7 | ||||
-rw-r--r-- | deps/rabbitmq_web_dispatch/src/webmachine_logger.hrl | 3 |
3 files changed, 52 insertions, 2 deletions
diff --git a/deps/rabbitmq_web_dispatch/src/webmachine_log.erl b/deps/rabbitmq_web_dispatch/src/webmachine_log.erl index 73f67b9c2f..81b27a8b50 100644 --- a/deps/rabbitmq_web_dispatch/src/webmachine_log.erl +++ b/deps/rabbitmq_web_dispatch/src/webmachine_log.erl @@ -18,6 +18,7 @@ -module(webmachine_log). +-include_lib("kernel/include/logger.hrl"). -include("webmachine_logger.hrl"). -export([add_handler/2, @@ -126,6 +127,7 @@ fmtnow() -> %% @doc Notify registered log event handler of an access event. -spec log_access(tuple()) -> ok. log_access({_, _, _}=LogData) -> + log_to_erlang_logger(LogData), gen_event:sync_notify(?EVENT_LOGGER, {log_access, LogData}). %% @doc Close a log file. @@ -237,3 +239,45 @@ zone(Val) when Val < 0 -> io_lib:format("-~4..0w", [trunc(abs(Val))]); zone(Val) when Val >= 0 -> io_lib:format("+~4..0w", [trunc(abs(Val))]). + +log_to_erlang_logger({Status, Body, Req} = LogData) -> + User = webmachine_log_handler:user_from_req(Req), + + %% From the request. + Method = cowboy_req:method(Req), + Path = cowboy_req:path(Req), + Version = cowboy_req:version(Req), + Peer = case cowboy_req:peer(Req) of + {Peer0, _Port} -> Peer0; + Other -> Other + end, + Referer = cowboy_req:header(<<"referer">>, Req, <<>>), + UserAgent = cowboy_req:header(<<"user-agent">>, Req, <<>>), + + %% From the response. + Length = case Body of + {sendfile, _, L, _} -> L; + _ -> iolist_size(Body) + end, + + FormatStr = "~s", + Msg = webmachine_log_handler:format_req(LogData), + Meta = #{domain => ?RMQLOG_DOMAIN_HTTP_ACCESS_LOG, + http_status => Status, + http_user => User, + http_req_method => Method, + http_req_path => Path, + http_req_version => Version, + http_req_peer => fmt_ip(Peer), + http_req_referer => Referer, + http_req_user_agent => UserAgent, + http_resp_content_length => Length}, + case is_http_error(Status) of + false -> ?LOG_INFO(FormatStr, [Msg], Meta); + true -> ?LOG_ERROR(FormatStr, [Msg], Meta) + end. + +is_http_error(Status) when Status >= 400 andalso Status < 600 -> + true; +is_http_error(_) -> + false. diff --git a/deps/rabbitmq_web_dispatch/src/webmachine_log_handler.erl b/deps/rabbitmq_web_dispatch/src/webmachine_log_handler.erl index e19b247d73..e291b6ad0f 100644 --- a/deps/rabbitmq_web_dispatch/src/webmachine_log_handler.erl +++ b/deps/rabbitmq_web_dispatch/src/webmachine_log_handler.erl @@ -20,6 +20,9 @@ -behaviour(gen_event). +-export([format_req/1, + user_from_req/1]). + %% gen_event callbacks -export([init/1, handle_call/2, @@ -61,7 +64,7 @@ handle_call(_Request, State) -> handle_event({log_access, LogData}, State) -> NewState = webmachine_log:maybe_rotate(?MODULE, os:timestamp(), State), Msg = format_req(LogData), - webmachine_log:log_write(NewState#state.handle, Msg), + webmachine_log:log_write(NewState#state.handle, [Msg, $\n]), {ok, NewState}; handle_event(_Event, State) -> {ok, State}. @@ -112,7 +115,7 @@ fmt_alog(Time, Ip, User, Method, Path, Version, [webmachine_log:fmt_ip(Ip), " - ", User, [$\s], Time, [$\s, $"], Method, " ", Path, " ", atom_to_list(Version), [$",$\s], Status, [$\s], Length, [$\s,$"], Referrer, - [$",$\s,$"], UserAgent, [$",$\n]]. + [$",$\s,$"], UserAgent, $"]. user_from_req(Req) -> try cowboy_req:parse_header(<<"authorization">>, Req) of diff --git a/deps/rabbitmq_web_dispatch/src/webmachine_logger.hrl b/deps/rabbitmq_web_dispatch/src/webmachine_logger.hrl index c07068ae6a..f869989a3c 100644 --- a/deps/rabbitmq_web_dispatch/src/webmachine_logger.hrl +++ b/deps/rabbitmq_web_dispatch/src/webmachine_logger.hrl @@ -14,3 +14,6 @@ -type wm_log_data() :: #wm_log_data{}. -define(EVENT_LOGGER, webmachine_log_event). + +-include_lib("rabbit_common/include/logging.hrl"). +-define(RMQLOG_DOMAIN_HTTP_ACCESS_LOG, ?DEFINE_RMQLOG_DOMAIN(http_access_log)). |