summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2012-01-17 14:26:01 +0000
committerRobert Newson <rnewson@apache.org>2012-01-17 14:26:01 +0000
commit3b63f8daf00eb51328f5d0e32134ac24e6fd7aee (patch)
tree0e95bab8a6cfdf935fc4bddbb89fc3105ec4872f
parent8d83b39a061eb12956aa9574b27044a423bbcb93 (diff)
downloadcouchdb-3b63f8daf00eb51328f5d0e32134ac24e6fd7aee.tar.gz
COUCHDB-1380 Revert "Better logger performance"
This reverts commit 9f2398faef3936a844caffbaf3eef8675383ccfd which switched couch_log to use disk_log. Unfortunately that module performs positioned writes which prevents the usual logrotation strategy from working correctly.
-rw-r--r--src/couchdb/couch_log.erl56
-rwxr-xr-xtest/etap/172-os-daemon-errors.t1
2 files changed, 23 insertions, 34 deletions
diff --git a/src/couchdb/couch_log.erl b/src/couchdb/couch_log.erl
index 1b05f4db6..8e24cab5e 100644
--- a/src/couchdb/couch_log.erl
+++ b/src/couchdb/couch_log.erl
@@ -27,29 +27,23 @@
-define(LEVEL_INFO, 2).
-define(LEVEL_DEBUG, 1).
--define(DISK_LOGGER, couch_disk_logger).
-
-record(state, {
+ fd,
level,
sasl
}).
debug(Format, Args) ->
{ConsoleMsg, FileMsg} = get_log_messages(self(), debug, Format, Args),
- ok = disk_log:balog(?DISK_LOGGER, FileMsg),
- gen_event:sync_notify(error_logger, {couch_debug, ConsoleMsg}).
+ gen_event:sync_notify(error_logger, {couch_debug, ConsoleMsg, FileMsg}).
info(Format, Args) ->
{ConsoleMsg, FileMsg} = get_log_messages(self(), info, Format, Args),
- ok = disk_log:balog(?DISK_LOGGER, FileMsg),
- gen_event:sync_notify(error_logger, {couch_info, ConsoleMsg}).
+ gen_event:sync_notify(error_logger, {couch_info, ConsoleMsg, FileMsg}).
error(Format, Args) ->
{ConsoleMsg, FileMsg} = get_log_messages(self(), error, Format, Args),
- % Synchronous logging for error messages only. We want to reduce the
- % chances of missing any if server is killed.
- ok = disk_log:blog(?DISK_LOGGER, FileMsg),
- gen_event:sync_notify(error_logger, {couch_error, ConsoleMsg}).
+ gen_event:sync_notify(error_logger, {couch_error, ConsoleMsg, FileMsg}).
level_integer(error) -> ?LEVEL_ERROR;
@@ -92,13 +86,11 @@ init([]) ->
end,
ets:insert(?MODULE, {level, Level}),
- DiskLogOptions = [
- {file, Filename}, {name, ?DISK_LOGGER},
- {format, external}, {type, halt}, {notify, true}
- ],
- case disk_log:open(DiskLogOptions) of
- {ok, ?DISK_LOGGER} ->
- {ok, #state{level = Level, sasl = Sasl}};
+ case file:open(Filename, [append]) of
+ {ok, Fd} ->
+ {ok, #state{fd = Fd, level = Level, sasl = Sasl}};
+ {error, eacces} ->
+ {stop, {file_permission_error, Filename}};
Error ->
{stop, Error}
end.
@@ -125,26 +117,24 @@ get_level_integer() ->
set_level_integer(Int) ->
gen_event:call(error_logger, couch_log, {set_level_integer, Int}).
-handle_event({couch_error, ConMsg}, State) ->
- ok = io:put_chars(ConMsg),
+handle_event({couch_error, ConMsg, FileMsg}, State) ->
+ log(State, ConMsg, FileMsg),
{ok, State};
-handle_event({couch_info, ConMsg}, #state{level = LogLevel} = State)
+handle_event({couch_info, ConMsg, FileMsg}, #state{level = LogLevel} = State)
when LogLevel =< ?LEVEL_INFO ->
- ok = io:put_chars(ConMsg),
+ log(State, ConMsg, FileMsg),
{ok, State};
-handle_event({couch_debug, ConMsg}, #state{level = LogLevel} = State)
+handle_event({couch_debug, ConMsg, FileMsg}, #state{level = LogLevel} = State)
when LogLevel =< ?LEVEL_DEBUG ->
- ok = io:put_chars(ConMsg),
+ log(State, ConMsg, FileMsg),
{ok, State};
handle_event({error_report, _, {Pid, _, _}}=Event, #state{sasl = true} = St) ->
{ConMsg, FileMsg} = get_log_messages(Pid, error, "~p", [Event]),
- ok = disk_log:blog(?DISK_LOGGER, FileMsg),
- ok = io:put_chars(ConMsg),
+ log(St, ConMsg, FileMsg),
{ok, St};
handle_event({error, _, {Pid, Format, Args}}, #state{sasl = true} = State) ->
{ConMsg, FileMsg} = get_log_messages(Pid, error, Format, Args),
- ok = disk_log:blog(?DISK_LOGGER, FileMsg),
- ok = io:put_chars(ConMsg),
+ log(State, ConMsg, FileMsg),
{ok, State};
handle_event(_Event, State) ->
{ok, State}.
@@ -153,18 +143,18 @@ handle_call({set_level_integer, NewLevel}, State) ->
ets:insert(?MODULE, {level, NewLevel}),
{ok, ok, State#state{level = NewLevel}}.
-handle_info({disk_log, _Node, _Log, {error_status, Status}}, _State) ->
- io:format("Disk logger error: ~p~n", [Status]),
- % couch_event_sup will restart us.
- remove_handler;
handle_info(_Info, State) ->
{ok, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
-terminate(_Arg, _State) ->
- ok = disk_log:close(?DISK_LOGGER).
+terminate(_Arg, #state{fd = Fd}) ->
+ file:close(Fd).
+
+log(#state{fd = Fd}, ConsoleMsg, FileMsg) ->
+ ok = io:put_chars(ConsoleMsg),
+ ok = io:put_chars(Fd, FileMsg).
get_log_messages(Pid, Level, Format, Args) ->
ConsoleMsg = unicode:characters_to_binary(io_lib:format(
diff --git a/test/etap/172-os-daemon-errors.t b/test/etap/172-os-daemon-errors.t
index 39bdfee00..bde5c6ffb 100755
--- a/test/etap/172-os-daemon-errors.t
+++ b/test/etap/172-os-daemon-errors.t
@@ -56,7 +56,6 @@ main(_) ->
test() ->
couch_config:start_link(config_files()),
- couch_log:start_link(),
couch_os_daemons:start_link(),
etap:diag("Daemon not executable."),