%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2008-2011. 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.