1 %% Copyright (c) 2011-2013 Basho Technologies, Inc. All Rights Reserved.
3 %% This file is provided to you under the Apache License,
4 %% Version 2.0 (the "License"); you may not use this file
5 %% except in compliance with the License. You may obtain
6 %% a copy of the License at
8 %% http://www.apache.org/licenses/LICENSE-2.0
10 %% Unless required by applicable law or agreed to in writing,
11 %% software distributed under the License is distributed on an
12 %% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
13 %% KIND, either express or implied. See the License for the
14 %% specific language governing permissions and limitations
17 %% @doc Default performance log handler for webmachine
19 -module(webmachine_perf_log_handler).
21 -behaviour(gen_event).
23 %% gen_event callbacks
31 -include("webmachine_logger.hrl").
34 -include_lib("eunit/include/eunit.hrl").
37 -record(state, {hourstamp, filename, handle}).
39 -define(FILENAME, "perf.log").
41 %% ===================================================================
42 %% gen_event callbacks
43 %% ===================================================================
47 webmachine_log:defer_refresh(?MODULE),
48 FileName = filename:join(BaseDir, ?FILENAME),
49 {Handle, DateHour} = webmachine_log:log_open(FileName),
50 {ok, #state{filename=FileName, handle=Handle, hourstamp=DateHour}}.
53 handle_call({_Label, MRef, get_modules}, State) ->
54 {ok, {MRef, [?MODULE]}, State};
55 handle_call({refresh, Time}, State) ->
56 {ok, ok, webmachine_log:maybe_rotate(?MODULE, Time, State)};
57 handle_call(_Request, State) ->
61 handle_event({log_access, LogData}, State) ->
62 NewState = webmachine_log:maybe_rotate(?MODULE, os:timestamp(), State),
63 Msg = format_req(LogData),
64 webmachine_log:log_write(NewState#state.handle, Msg),
66 handle_event(_Event, State) ->
70 handle_info(_Info, State) ->
74 terminate(_Reason, _State) ->
78 code_change(_OldVsn, State, _Extra) ->
81 %% ===================================================================
83 %% ===================================================================
85 format_req(#wm_log_data{resource_module=Mod,
91 response_code=ResponseCode,
92 response_length=ResponseLength,
94 finish_time=FinishTime}) ->
95 Time = webmachine_log:fmtnow(),
96 Status = case ResponseCode of
97 {Code, _ReasonPhrase} when is_integer(Code) ->
98 integer_to_list(Code);
99 _ when is_integer(ResponseCode) ->
100 integer_to_list(ResponseCode);
104 Length = integer_to_list(ResponseLength),
105 TTPD = webmachine_util:now_diff_milliseconds(EndTime, StartTime),
106 TTPS = webmachine_util:now_diff_milliseconds(FinishTime, EndTime),
107 fmt_plog(Time, Peer, atom_to_list(Method), Path, Version,
108 Status, Length, atom_to_list(Mod), integer_to_list(TTPD),
109 integer_to_list(TTPS)).
111 fmt_plog(Time, Ip, Method, Path, {VM,Vm}, Status, Length, Mod, TTPD, TTPS) ->
112 [webmachine_log:fmt_ip(Ip), " - ", [$\s], Time, [$\s, $"], Method, " ", Path,
113 " HTTP/", integer_to_list(VM), ".", integer_to_list(Vm), [$",$\s],
114 Status, [$\s], Length, " " , Mod, " ", TTPD, " ", TTPS, $\n].