diff options
author | benoitc <bchesneau@gmail.com> | 2014-02-12 01:56:39 +0100 |
---|---|---|
committer | benoitc <bchesneau@gmail.com> | 2014-02-12 01:56:39 +0100 |
commit | 0bc0f70eb6de096e13479569d4a0a88eaa6a8be9 (patch) | |
tree | f6afbecb0b9bb517557fc0db655a932501739dbd | |
parent | 0163e23276e636c43ea754efb424b43ee8462395 (diff) | |
download | couchdb-0bc0f70eb6de096e13479569d4a0a88eaa6a8be9.tar.gz |
couch_log: make sure that the the log file can be set in the ini
For some reason noone noticed until now, but changing the log file was
only possible in the app.config until now. This change fix this by doing
the following:
- when couch_log starts it check if the log file handler has already
been started using the app.config. If not it start a new handler
- when the filename change after a config update using the API, the old
file handler is shutdown and a new one is started with the new config.
-rw-r--r-- | apps/couch/src/couch_log.erl | 77 | ||||
-rw-r--r-- | etc/couchdb/app.config | 11 |
2 files changed, 77 insertions, 11 deletions
diff --git a/apps/couch/src/couch_log.erl b/apps/couch/src/couch_log.erl index 82158f6ed..787f25a11 100644 --- a/apps/couch/src/couch_log.erl +++ b/apps/couch/src/couch_log.erl @@ -144,6 +144,9 @@ init([]) -> Sasl = couch_config:get("log", "include_sasl", "true") =:= "true", LevelByModule = couch_config:get("log_level_by_module"), + %% maybe start the log file backend + maybe_start_logfile_backend(Filename, ALevel), + %% initialise the ets table if needed case ets:info(?MODULE) of undefined -> ets:new(?MODULE, [named_table]); @@ -172,7 +175,7 @@ handle_call({set_level_integer, Module, NewLevel}, _From, State) -> ets:insert(?MODULE, {Module, NewLevel}), {ok, ok, State#state{level = NewLevel}}. -handle_cast(config_update, State) -> +handle_cast(config_update, #state{log_file=OldFilename}=State) -> Filename = log_file(), ALevel = list_to_atom(couch_config:get("log", "level", "info")), Level = level_integer(ALevel), @@ -180,6 +183,12 @@ handle_cast(config_update, State) -> %% set default module ets:insert(?MODULE, {level, Level}), + %% should we restart the file backend with a new config? + if OldFilename =/= Filename -> + restart_logfile_backend(OldFilename, Filename, ALevel); + true -> ok + end, + %% set log level set_loglevel(Filename, ALevel), @@ -246,6 +255,50 @@ read(Bytes, Offset) -> ok = file:close(Fd), Chunk. + +maybe_start_logfile_backend(Filename, Level) -> + Started = case application:get_env(lager, handlers) of + undefined -> false; + {ok, Handlers} -> + LogFiles = lists:foldl(fun + ({lager_file_backend, Config}, Acc) -> + [hfile(Config) | Acc]; + (_, Acc) -> + Acc + end, [], Handlers), + lists:member(Filename, LogFiles) + end, + + case Started of + true -> ok; + false -> + Config = [{file, Filename}, + {level, Level}, + {formatter, lager_default_formatter}, + {formatter_config, + ["[", time, "] [", pid, "] [", severity, "] ", + message, "\n"]}], + HandlerId = {lager_file_backend, Filename}, + {ok, _} = supervisor:start_child(lager_handler_watcher_sup, + [lager_event, HandlerId, Config]) + end. + + +restart_logfile_backend(OldFilename, Filename, Level) -> + ok = gen_event:delete_handler(lager_event, {lager_file_backend, + OldFilename}, []), + + %% restart a new handler + Config = [{file, Filename}, + {level, Level}, + {formatter, lager_default_formatter}, + {formatter_config, + ["[", time, "] [", pid, "] [", severity, "] ", message, "\n"]}], + HandlerId = {lager_file_backend, Filename}, + {ok, _} = supervisor:start_child(lager_handler_watcher_sup, + [lager_event, HandlerId, Config]), + ok. + set_loglevel(Filename, ALevel) -> %% set default log level lager:set_loglevel(lager_console_backend, ALevel), @@ -260,10 +313,30 @@ set_loglevel(Filename, ALevel) -> end, Handlers) end. - log_file() -> DefaultLogFile = case application:get_env(couch, log_file) of undefined -> "couchdb.log"; FName -> FName end, couch_config:get("log", "file", DefaultLogFile). + +hfile({FileName, LogLevel}) when is_list(FileName), is_atom(LogLevel) -> + %% backwards compatability hack + FileName; +hfile({FileName, LogLevel, _Size, _Date, _Count}) + when is_list(FileName), is_atom(LogLevel) -> + %% backwards compatability hack + FileName; +hfile([{FileName, LogLevel, _Size, _Date, _Count}, {Formatter, _FormatterConfig}]) + when is_list(FileName), is_atom(LogLevel), is_atom(Formatter) -> + %% backwards compatability hack + FileName; +hfile([LogFile,{Formatter}]) -> + %% backwards compatability hack + hfile([LogFile,{Formatter,[]}]); +hfile([{FileName, LogLevel}, {Formatter, _FormatterConfig}]) + when is_list(FileName), is_atom(LogLevel), is_atom(Formatter) -> + %% backwards compatability hack + FileName; +hfile(LogFileConfig) when is_list(LogFileConfig) -> + proplists:get_value(file, LogFileConfig). diff --git a/etc/couchdb/app.config b/etc/couchdb/app.config index b6d247c7a..1db33ecad 100644 --- a/etc/couchdb/app.config +++ b/etc/couchdb/app.config @@ -8,7 +8,7 @@ "{{platform_etc_dir}}/couch.ini", "{{platform_etc_dir}}/local.ini" ]}, - {log_file, "{{platform_log_dir}}/couchdb.log"} + {log_file, "{{platform_log_dir}}/couch.log"} ]}, @@ -16,14 +16,7 @@ {lager_console_backend, [info, {lager_default_formatter, ["[", pid, "] [", severity, "] ", - message, "\n"]}]}, - - {lager_file_backend, [{file, "{{platform_log_dir}}/couchdb.log"}, - {level, info}, - {formatter, lager_default_formatter}, - {formatter_config, - ["[", time, "] [", pid, "] [", severity, "] ", - message, "\n"]}]} + message, "\n"]}]} ]}]}, %% os_mon config |