]> review.fuel-infra Code Review - packages/trusty/rabbitmq-server.git/blob
7b3689933af5bd1e95b5488f9df4d1fabed117cd
[packages/trusty/rabbitmq-server.git] /
1 %% Copyright (c) 2011-2013 Basho Technologies, Inc.  All Rights Reserved.
2 %%
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
7 %%
8 %%   http://www.apache.org/licenses/LICENSE-2.0
9 %%
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
15 %% under the License.
16
17 %% @doc Default performance log handler for webmachine
18
19 -module(webmachine_perf_log_handler).
20
21 -behaviour(gen_event).
22
23 %% gen_event callbacks
24 -export([init/1,
25          handle_call/2,
26          handle_event/2,
27          handle_info/2,
28          terminate/2,
29          code_change/3]).
30
31 -include("webmachine_logger.hrl").
32
33 -ifdef(TEST).
34 -include_lib("eunit/include/eunit.hrl").
35 -endif.
36
37 -record(state, {hourstamp, filename, handle}).
38
39 -define(FILENAME, "perf.log").
40
41 %% ===================================================================
42 %% gen_event callbacks
43 %% ===================================================================
44
45 %% @private
46 init([BaseDir]) ->
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}}.
51
52 %% @private
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) ->
58     {ok, ok, State}.
59
60 %% @private
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),
65     {ok, NewState};
66 handle_event(_Event, State) ->
67     {ok, State}.
68
69 %% @private
70 handle_info(_Info, State) ->
71     {ok, State}.
72
73 %% @private
74 terminate(_Reason, _State) ->
75     ok.
76
77 %% @private
78 code_change(_OldVsn, State, _Extra) ->
79     {ok, State}.
80
81 %% ===================================================================
82 %% Internal functions
83 %% ===================================================================
84
85 format_req(#wm_log_data{resource_module=Mod,
86                         start_time=StartTime,
87                         method=Method,
88                         peer=Peer,
89                         path=Path,
90                         version=Version,
91                         response_code=ResponseCode,
92                         response_length=ResponseLength,
93                         end_time=EndTime,
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);
101                  _ ->
102                      ResponseCode
103              end,
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)).
110
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].