Mike Wallace created COUCHDB-2968:
-------------------------------------

             Summary: couch_log doesn't use the configured backend in the 
couchdb OTP release
                 Key: COUCHDB-2968
                 URL: https://issues.apache.org/jira/browse/COUCHDB-2968
             Project: CouchDB
          Issue Type: Bug
          Components: Logging
            Reporter: Mike Wallace


When testing the couch_log backends with the OTP release generated by {{make 
dist}} I found couch_log wasn't using the couch_log_lager backend, however when 
testing with a dev/run cluster it works as expected.

To test I used the following for rel/files/sys.config:

{code}
    [
        {lager, [
            {error_logger_hwm, 1000},
            {error_logger_redirect, true},
            {handlers, [
                {lager_file_backend,
                       [{file,"/tmp/allthelogs.log"},
                        {level,debug},
                        {size,10485760},
                        {date,"$D0"},
                        {count,5}]},
                {lager_console_backend, [error, {
                    lager_default_formatter,
                    [
                        date, " ", time,
                        " [", severity, "] ",
                        node, " ", pid, " ",
                        message,
                        "\n"
                    ]
                }]}
            ]}
        ]}
    ].
{code}

In a dev/run node I can do the following in a remsh:

{code}
    $ erl -name [email protected] -remsh [email protected] -setcookie monster -hidden
    ([email protected])1> couch_log:info("A log statement", []). 
    ok
{code}

Then I can verify the log statement appears in the expected location:

{code}
    $ tail -n 5 /tmp/allthelogs.log
    2016-03-10 13:40:54.353 [notice] <0.711.0>@couch_log_lager:notice:43 Setup: 
[{<<"action">>,<<"receive_cookie">>},{<<"cookie">>,<<"monster">>}]
    2016-03-10 13:40:54.353 [notice] <0.711.0>@couch_log_lager:notice:43 
receive_cookie: 
[{<<"action">>,<<"receive_cookie">>},{<<"cookie">>,<<"monster">>}]
    2016-03-10 13:40:54.354 [notice] <0.711.0>@couch_log_lager:notice:43 
37ad126c7d 127.0.0.1 127.0.0.1:35984 POST /_cluster_setup 201 ok 1
    2016-03-10 13:40:55.172 [notice] <0.844.0>@couch_log_lager:notice:43 
7f57dc0474 127.0.0.1 127.0.0.1:15984 POST /_cluster_setup 400 ok 673
    2016-03-10 13:43:44.887 [info] <0.3844.0>@couch_log_lager:info:39 A log 
statement
{code}

But for a node running from the OTP release created by {{make dist}} nothing
appears in the log until I have explictly called couch_log_lager:

{code}
    $ erl -name [email protected] -remsh [email protected] -setcookie monster 
-hidden
    ([email protected])1> couch_log:info("A log statement", []). 
    ok
    ([email protected])2> module_loaded(couch_log_lager).
    false
    ([email protected])3> couch_log_lager:info("Another log statement", []).
    ok
    ([email protected])4> couch_log:info("One more log statement", []).
    ok
{code}

{code}
    $ tail -n 5 /tmp/allthelogs.log 
    2016-03-10 13:14:37.507 [info] <0.7.0> Application setup started on node 
'[email protected]'
    2016-03-10 13:14:37.507 [info] <0.7.0> Application snappy started on node 
'[email protected]'
    2016-03-10 13:14:37.855 [debug] <0.374.0>@lager_handler_watcher:94 Lager 
installed handler lager_backend_throttle into lager_event
    2016-03-10 13:18:52.264 [info] <0.3927.0>@couch_log_lager:info:39 Another 
log statement
    2016-03-10 13:19:00.521 [info] <0.3927.0>@couch_log_lager:info:39 One more 
log statement
{code}

Note the first log statement does not appear in /tmp/allthelogs.

I think this is a result of testing for whether the backend module is loaded
before we use it in couch_log *(1). With a dev/run node, 
{{module_loaded(couch_log_lager).}} returns {{true}} whereas with a built node 
it returns {{false}} until called explicitly.

I read up on Erlang's code server and thought I understood why - when running 
in {{interactive}} mode, the code server will load modules dynamically so if 
nothing calls couch_log_lager, it will never get loaded and couch_log will 
never use it. However what I don't understand is why it works with a dev/run 
node since that is also running in {{interactive}} mode - yet couch_log_lager is
automatically loaded.

The fix would appear to be to remove the test for module_loaded however we
should verify whether there are any negative implications if we do that.

(1) 
https://github.com/apache/couchdb-couch-log/blob/master/src/couch_log.erl#L116



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to