Вы можете использовать фреймворк sasl для создания собственного обработчика событий.
Подробное объяснение приведено в книге «Manning.Erlang и Otp в действии, часть 2, глава 7, стр. 170 (возможно, отличается для разных версий)», ведение журнала и обработка событий способом erlang / otp
Для реального кода, пожалуйста, прочитайте http://couchdb.apache.org/downloads.html файл исходного кода couchdb "couch_log.erl" и "couch_event_sup.erl", первый файл - обработчик событий, второй файл - модуль обертывания gen_server для "couch_log"
Следующие коды цитируются из файла "couch_log.erl" для объяснения
-behaviour(gen_event). %<======event handler OTP module behaviour
init([]) ->
% read config and register for configuration changes
% just stop if one of the config settings change. couch_server_sup
% will restart us and then we will pick up the new settings.
ok = couch_config:register(
fun("log", "file") ->
?MODULE:stop();
("log", "level") ->
?MODULE:stop();
("log", "include_sasl") ->
?MODULE:stop()
end),
Filename = couch_config:get("log", "file", "couchdb.log"),
Level = level_integer(list_to_atom(couch_config:get("log", "level", "info"))),
Sasl = list_to_atom(couch_config:get("log", "include_sasl", "true")),
case ets:info(?MODULE) of
undefined -> ets:new(?MODULE, [named_table]);
_ -> ok
end,
ets:insert(?MODULE, {level, Level}),
case file:open(Filename, [append]) of %<<========open customzied file for logging
{ok, Fd} ->
{ok, {Fd, Level, Sasl}}; <<=========save the log file deviceIO into module state
{error, eacces} ->
{stop, {file_permission_error, Filename}};
Error ->
{stop, Error}
end.
debug(Format, Args) ->
{ConsoleMsg, FileMsg} = get_log_messages(self(), debug, Format, Args),
gen_event:sync_notify(error_logger, {couch_debug, ConsoleMsg, FileMsg}). <=====generate customized logging message
handle_event({couch_debug, ConMsg, FileMsg}, {Fd, LogLevel, _Sasl}=State) <====handle the message
when LogLevel =< ?LEVEL_DEBUG ->
log(Fd, ConMsg, FileMsg),
{ok, State};
log(Fd, Pid, Level, Format, Args) ->
Msg = io_lib:format(Format, Args),
ok = io:format("[~s] [~p] ~s~n", [Level, Pid, Msg]), % dump to console too
Msg2 = re:replace(lists:flatten(Msg),"\\r\\n|\\r|\\n", "\r\n",
[global, {return, list}]),
ok = io:format(Fd, "[~s] [~s] [~p] ~s\r~n", [httpd_util:rfc1123_date(), Level, Pid, Msg2]).
log(Fd, ConsoleMsg, FileMsg) ->
ok = io:put_chars(ConsoleMsg),
ok = io:put_chars(Fd, FileMsg). <=====write the log into file