Add ability for handlers to 'fatally' fail, so they won't attempt to
reinstall themselves later.
Also fix an issue with the INT_LOG macro not doing the right thing when
only the lager_throttle_backend was installed.
There's a nasty problem with the Erlang VM + lager when the old-style
Erlang console is used. You can use the "-oldshell" flag to explicitly
get the old-style shell. However, if the Erlang VM is started when
*not* associated with a pseudo-tty, the VM will silently use the
old-style shell (because the new-style shell requires a pty to
support command line editing, etc.). The most common way of starting
the Erlang VM without a pty is to start it via a non-interactive
SSH session.
This patch is opinionated in what to do in the case when the old-
style shell is detected. My opinion is:
1. Shout loudly to the console log (in a separate Erlang process, so
that the main lager event handler proc won't be blocked by any
problems with the old-style console). It's almost certainly
likely that you really don't want to run Erlang with the old-style
shell. But many sysadmins don't look closely at their systems'
log files, so (for example) shouting the same message 10x in a row
is legit. Reviewers: YMMV.
2. Set a SASL alarm. Again, many sysadmins' are bad at looking at
log messages. Setting a SASL alarm is another method to try to
get their attention.
To test, create a test script called `/tmp/testit.sh`, changing the
`-pz` parameter to point to the correct place for lager's `ebin`
subdirectory:
#!/bin/sh
erl -pz /Users/fritchie/b/src/lager/ebin -eval '{application:start(sasl), lager_console_backend:init([error, true]), timer:sleep(5*1000), io:format("\n\nInfo: ~p\n\n", [{{alarms, alarm_handler:get_alarms()}, {user_drv, whereis(user_drv)}}]), erlang:halt()}.'
Then run it twice, using the following:
First time: ssh -t localhost sh /tmp/testit.sh
Second time: ssh localhost sh /tmp/testit.sh
The last lines of the first time should look like:
Info: {{alarms,[]},{user_drv,<0.22.0>}}
The last lines of the second time should look like:
Info: {{alarms,
[{lager_console_backend,
"WARNING: old-style console is in use, so lager_console_backend log output to the console is disabled. Restart the VM on a pseudo-tty to ensure use of the new-style VM console."}]},
{user_drv,undefined}}
Adds transparent event stream processing and statistics.
A new 3-tuple trace is introduced as `{Key, Op, Value}`, but
for backwards compatibility `{Key, Val}` implies `=` for `Op`
and `{Key, '*'}` remains as is in the case of wildcards.
A simplified query tree module is generated which reduces
redundant selection conditions to minimize filtering overhead.
This is done via a combination of several things:
* Make the loglevel that triggers a sync configurable
* Make the delayed_write size and intervals configurable
* Make the interval at which external rotation is checked for
configurable
* Store the timestamp a lager_msg was created inside the lager_msg
To support these changes, several other things had to be modified:
* lager_msg:timestamp now returns a timestamp
* lager_msg:datetime was added to return the {date, time} of a message,
like lager_msg:timestamp used to
* The configuration syntax for file backends was changed to be of the
form {lager_file_backend, proplist()} and the old syntax was
deprecated
Additionally, the defaults for the check_interval was raised from
'always' to 1 second, and the sync_interval was changed from 2 seconds
to one second.
For persistant processes with some immutable metadata (riak vnode and
the vnode ID, for example), implement lager:md/0 and lager:md/1 for
getting/setting such metadata into the process dictionary.
Such metadata is automatically included in any lager message metadata,
so you can just set it in your init() function or whatever and not have
to worry about passing the data around and using it in every lager call.
Originally an idea that Dizzy forwarded to me from Tony Rogvall.
Basicially all the work lager does gathering metadata and stuff is
wrapped in a case statement that fails-fast if the message is definitely
not going to be logged; the severity isn't currently being consumed and
there's no traces installed.
In my simple test, logging 1 million debug messages, when the debug
level is not being consumed, goes from taking 2.99 seconds to 1.21
seconds with this change.
Also, lager pre 1.0 actually had something similar to this, but it was
removed during a refactor and never re-added.