aboutsummaryrefslogtreecommitdiffstats
path: root/lib/inets/src/http_server/httpd_log.erl
blob: 4b0f49d5602cb7f1f73093c38d7d87993a3633ef (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
%%
%% %CopyrightBegin%
%% 
%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
%% 
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%% 
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%% 
%% %CopyrightEnd%
%%
%%
-module(httpd_log).

-include("httpd.hrl").

-export([access_entry/8, error_entry/5, error_report_entry/5, 
	 security_entry/5]).

%%%=========================================================================
%%%  Internal Application API 
%%%=========================================================================
access_entry(Log, NoLog, Info, RFC931, AuthUser, Date, StatusCode, Bytes) ->
    ConfigDB = Info#mod.config_db,
    case httpd_util:lookup(ConfigDB, Log) of
	undefined ->
	    NoLog;
	LogRef ->
	    {_, RemoteHost}
		= (Info#mod.init_data)#init_data.peername,
	    RequestLine = Info#mod.request_line,
	    Headers =  Info#mod.parsed_header,
	    Entry = do_access_entry(ConfigDB, Headers, RequestLine, 
				    RemoteHost, RFC931, AuthUser,
				    Date, StatusCode, Bytes),
	    {LogRef, Entry}
    end.

error_entry(Log, NoLog, Info, Date, Reason) ->
    ConfigDB = Info#mod.config_db,
    case httpd_util:lookup(ConfigDB, Log) of
	undefined ->
	    NoLog;
	LogRef ->
	    {_, RemoteHost} =
		(Info#mod.init_data)#init_data.peername,
	    URI = Info#mod.request_uri,
	    Entry = do_error_entry(ConfigDB, RemoteHost, URI, Date, Reason), 
	    {LogRef, Entry}
    end.

error_report_entry(Log, NoLog, ConfigDb, Date, ErrorStr) ->
    case httpd_util:lookup(ConfigDb, Log) of
	undefined ->
	    NoLog;
	LogRef ->
	     Entry = io_lib:format("[~s], ~s~n", [Date, ErrorStr]),
	     {LogRef, Entry}
     end.

security_entry(Log, NoLog, #mod{config_db = ConfigDb}, Date, Reason) ->
    case httpd_util:lookup(ConfigDb, Log) of
	undefined ->
	    NoLog;
	LogRef ->
	    Entry = io_lib:format("[~s] ~s~n", [Date, Reason]),
	    {LogRef, Entry}
    end.

%%%========================================================================
%%% Internal functions
%%%========================================================================
do_access_entry(ConfigDB, Headers, RequestLine,
	     RemoteHost, RFC931, AuthUser, Date, StatusCode,
	     Bytes) ->
    case httpd_util:lookup(ConfigDB, log_format, common) of
	common ->
	    lists:flatten(io_lib:format("~s ~s ~s [~s] \"~s\" ~w ~w~n",
			  [RemoteHost, RFC931, AuthUser, Date,
			   RequestLine, 
			   StatusCode, Bytes]));
	combined ->
	    Referer = 
		proplists:get_value("referer", Headers, "-"),
	    UserAgent = 
		proplists:get_value("user-agent", 
				    Headers, "-"),
	    io_lib:format("~s ~s ~s [~s] \"~s\" ~w ~w ~s ~s~n",
			  [RemoteHost, RFC931, AuthUser, Date,
			   RequestLine, StatusCode, Bytes, 
			   Referer, UserAgent])
    end.


do_error_entry(ConfigDB, RemoteHost, undefined, Date, Reason) ->
     case httpd_util:lookup(ConfigDB, error_log_format, pretty) of
	pretty ->
	   io_lib:format("[~s] server crash for ~s, reason: ~n~p~n~n", 
			 [Date, RemoteHost, Reason]);
	compact ->
	   io_lib:format("[~s] server crash for ~s, reason: ~w~n", 
			 [Date, RemoteHost, Reason])
	     
    end;
    
do_error_entry(ConfigDB, RemoteHost, URI, Date, Reason) ->
    case httpd_util:lookup(ConfigDB, error_log_format, pretty) of
	pretty ->
	   io_lib:format("[~s] access to ~s failed for ~s, reason: ~n~p~n",
			 [Date, URI, RemoteHost, Reason]);
	compact ->
	   io_lib:format( "[~s] access to ~s failed for ~s, reason: ~w~n", 
			 [Date, URI, RemoteHost, Reason])	     
    end.