Kill org-mode in favor of markdown, update docs and defaults
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..0f7c124
--- /dev/null
+++ b/README.md
@@ -0,0 +1,404 @@
+Overview
+--------
+Lager (as in the beer) is a logging framework for Erlang. Its purpose is
+to provide a more traditional way to perform logging in an erlang application
+that plays nicely with traditional UNIX logging tools like logrotate and
+syslog.
+
+ [Travis-CI](http://travis-ci.org/basho/lager) :: ![Travis-CI](https://secure.travis-ci.org/basho/lager.png)
+
+Features
+--------
+* Finer grained log levels (debug, info, notice, warning, error, critical,
+ alert, emergency)
+* Logger calls are transformed using a parse transform to allow capturing
+ Module/Function/Line/Pid information
+* When no handler is consuming a log level (eg. debug) no event is even sent
+ to the log handler
+* Supports multiple backends, including console and file.
+* Rewrites common OTP error messages into more readable messages
+* Support for pretty printing records encountered at compile time
+* Tolerant in the face of large or many log messages, won't out of memory the node
+* Supports internal time and date based rotation, as well as external rotation tools
+* Syslog style log level comparison flags
+* Colored terminal output (requires R16+)
+
+Usage
+-----
+To use lager in your application, you need to define it as a rebar dep or have
+some other way of including it in erlang's path. You can then add the
+following option to the erlang compiler flags
+
+```erlang
+{parse_transform, lager_transform}
+```
+
+Alternately, you can add it to the module you wish to compile with logging
+enabled:
+
+```erlang
+-compile([{parse_transform, lager_transform}]).
+```
+
+Before logging any messages, you'll need to start the lager application. The
+lager module's start function takes care of loading and starting any dependencies
+lager requires.
+
+```erlang
+lager:start().
+```
+
+You can also start lager on startup with a switch to `erl`:
+
+```erlang
+erl -pa path/to/lager/ebin -s lager
+```
+
+Once you have built your code with lager and started the lager application,
+you can then generate log messages by doing the following:
+
+```erlang
+lager:error("Some message")
+```
+
+ Or:
+
+```erlang
+lager:warning("Some message with a term: ~p", [Term])
+```
+
+The general form is lager:Severity() where Severity is one of the log levels
+mentioned above.
+
+Configuration
+-------------
+To configure lager's backends, you use an application variable (probably in
+your app.config):
+
+```erlang
+{lager, [
+ {handlers, [
+ {lager_console_backend, info},
+ {lager_file_backend, [{file, "error.log"}, {level, error}]},
+ {lager_file_backend, [{file, "console.log"}, {level, info}]}
+ ]}
+ ]}
+]}.
+```
+
+The available configuration options for each backend are listed in their
+module's documentation.
+
+Custom Formatting
+-----------------
+All loggers have a default formatting that can be overriden. A formatter is any module that
+exports format(#lager_log_message{},Config#any()). It is specified as part of the configuration
+for the backend:
+
+```erlang
+{lager, [
+ {handlers, [
+ {lager_console_backend, [info, {lager_default_formatter, [time," [",severity,"] ", message, "\n"]}},
+ {lager_file_backend, [{name, "error.log"}, {level, error}, {formatter, lager_default_formatter},
+ {formatter_config, [date, " ", time," [",severity,"] ",pid, " ", message, "\n"]}]},
+ {lager_file_backend, [{name, "console.log"}, {level, info}]}
+ ]}
+ ]}
+]}.
+```
+
+Included is lager_default_formatter. This provides a generic, default formatting for log messages using a "semi-iolist"
+as configuration. Any iolist allowed elements in the configuration are printed verbatim. Atoms in the configuration
+are treated as metadata properties and extracted from the log message.
+The metadata properties date,time, message, and severity will always exist.
+The properties pid, file, line, module, function, and node will always exist if the parser transform is used.
+
+```
+["Foo"] -> "Foo", regardless of message content.
+[message] -> The content of the logged message, alone.
+[{pid,"Unknown Pid"}] -> "<?.?.?>" if pid is in the metadata, "Unknown Pid" if not.
+[{pid, ["My pid is ", pid], "Unknown Pid"}] -> if pid is in the metadata print "My pid is <?.?.?>", otherwise print "Unknown Pid"
+```
+
+Optionally, a tuple of {atom(),semi-iolist()}
+can be used. The atom will look up the property, but if not found it will use the semi-iolist() instead. These fallbacks
+can be nested or refer to other properties.
+
+```
+[{pid,"Unknown Pid"}] -> "<?.?.?>" if pid is in the metadata, "Unknown Pid" if not.
+[{server,[$(,{pid,"Unknown Server"},$)]}}] -> user provided server metadata, otherwise "(<?.?.?>)", otherwise "(Unknown Server)"
+```
+
+Error logger integration
+------------------------
+Lager is also supplied with a error_logger handler module that translates
+traditional erlang error messages into a friendlier format and sends them into
+lager itself to be treated like a regular lager log call. To disable this, set
+the lager application variable `error_logger_redirect' to `false'.
+
+The error_logger handler will also log more complete error messages (protected
+with use of trunc_io) to a "crash log" which can be referred to for further
+information. The location of the crash log can be specified by the crash_log
+application variable. If undefined it is not written at all.
+
+Messages in the crash log are subject to a maximum message size which can be
+specified via the crash_log_msg_size application variable.
+
+Overload Protection
+-------------------
+
+Prior to lager 2.0, the gen_event at the core of lager operated purely in
+synchronous mode. Asynchronous mode is faster, but has no protection against
+message queue overload. In lager 2.0, the gen_event takes a hybrid approach. it
+polls its own mailbox size and toggles the messaging between synchronous and
+asynchronous depending on mailbox size.
+
+```erlang
+{async_threshold, 20}
+```
+
+This will use async messaging until the mailbox exceeds 20 messages, at which
+point synchronous messaging will be used.
+
+If you wish to disable this behaviour, simply set it to 'undefined'. It defaults
+to a low number to prevent the mailbox growing rapidly beyond the limit and causing
+problems. In general, lager should process messages as fast as they come in, so getting
+20 behind should be relatively exceptional anyway.
+
+If you want to limit the number of messages per second allowed from error_logger,
+which is a good idea if you want to weather a flood of messages when lots of
+related processes crash, you can set a limit:
+
+```erlang
+{error_logger_hwm, 50}
+```
+
+It is probably best to keep this number small.
+
+Runtime loglevel changes
+------------------------
+You can change the log level of any lager backend at runtime by doing the
+following:
+
+```erlang
+lager:set_loglevel(lager_console_backend, debug).
+```
+
+ Or, for the backend with multiple handles (files, mainly):
+
+```erlang
+lager:set_loglevel(lager_file_backend, "console.log", debug).
+```
+
+Lager keeps track of the minium log level being used by any backend and
+supresses generation of messages lower than that level. This means that debug
+log messages, when no backend is consuming debug messages, are effectively
+free. A simple benchmark of doing 1 million debug log messages while the
+minimum threshold was above that takes less than half a second.
+
+Syslog style loglevel comparison flags
+--------------------------------------
+In addition to the regular log level names, you can also do finer grained masking
+of what you want to log:
+
+```
+info - info and higher (>= is implicit)
+=debug - only the debug level
+!=info - everything but the info level
+<=notice - notice and below
+<warning - anything less than warning
+```
+
+These can be used anywhere a loglevel is supplied, although they need to be either
+a quoted atom or a string.
+
+Internal log rotation
+---------------------
+Lager can rotate its own logs or have it done via an external process. To
+use internal rotation, use the 'size', 'date' and 'count' values in the file
+backend's config:
+
+```erlang
+[{name, "error.log"}, {level, error}, {size, 10485760}, {date, "$D0"}, {count, 5}]
+```
+
+This tells lager to log error and above messages to "error.log" and to
+rotate the file at midnight or when it reaches 10mb, whichever comes first
+and to keep 5 rotated logs, in addition to the current one. Setting the
+count to 0 does not disable rotation, it instead rotates the file and keeps
+no previous versions around. To disable rotation set the size to 0 and the
+date to "".
+
+The "$D0" syntax is taken from the syntax newsyslog uses in newsyslog.conf.
+The relevant extract follows:
+
+```
+Day, week and month time format: The lead-in character
+for day, week and month specification is a `$'-sign.
+The particular format of day, week and month
+specification is: [Dhh], [Ww[Dhh]] and [Mdd[Dhh]],
+respectively. Optional time fields default to
+midnight. The ranges for day and hour specifications
+are:
+
+ hh hours, range 0 ... 23
+ w day of week, range 0 ... 6, 0 = Sunday
+ dd day of month, range 1 ... 31, or the
+ letter L or l to specify the last day of
+ the month.
+
+Some examples:
+ $D0 rotate every night at midnight
+ $D23 rotate every day at 23:00 hr
+ $W0D23 rotate every week on Sunday at 23:00 hr
+ $W5D16 rotate every week on Friday at 16:00 hr
+ $M1D0 rotate on the first day of every month at
+ midnight (i.e., the start of the day)
+ $M5D6 rotate on every 5th day of the month at
+ 6:00 hr
+```
+
+To configure the crash log rotation, the following application variables are
+used:
+* crash_log_size
+* crash_log_date
+* crash_log_count
+
+See the .app.src file for further details.
+
+Syslog Support
+--------------
+Lager syslog output is provided as a separate application;
+[lager_syslog](https://github.com/basho/lager_syslog). It is packaged as a
+separate application so Lager itself doesn't have an indirect dependancy on a
+port driver. Please see the lager_syslog README for configuration information.
+
+Older Backends
+--------------
+Lager 2.0 changed the backend API, there are various 3rd party backends for
+lager available, but they may not have been updated to the new API. As they
+are updated, links to them can be re-added here.
+
+Record Pretty Printing
+----------------------
+Lager's parse transform will keep track of any record definitions it encounters
+and store them in the module's attributes. You can then, at runtime, print any
+record a module compiled with the lager parse transform knows about by using the
+lager:pr/2 function, which takes the record and the module that knows about the record:
+
+```erlang
+lager:info("My state is ~p", [lager:pr(State, ?MODULE)])
+```
+
+Often, ?MODULE is sufficent, but you can obviously substitute that for a literal module name.
+lager:pr also works from the shell.
+
+Colored terminal output
+-----------------------
+If you have erlang R16 or higher, you can tell lager's console backend to be colored. Simply
+add
+
+```erlang
+{colored, true}
+```
+
+To lager's application environment config. If you don't like the default colors, they are]
+also configurable, see the app.src file for more details.
+
+Tracing
+-------
+Lager supports basic support for redirecting log messages based on log message
+attributes. Lager automatically captures the pid, module, function and line at the
+log message callsite. However, you can add any additional attributes you wish:
+
+```erlang
+lager:warning([{request, RequestID},{vhost, Vhost}], "Permission denied to ~s", [User])
+```
+
+Then, in addition to the default trace attributes, you'll be able to trace
+based on request or vhost:
+
+```erlang
+lager:trace_file("logs/example.com.error", [{vhost, "example.com"}], error)
+```
+
+To persist metadata for the life of a process, you can use lager:md/1 to store metadata
+in the process dictionary:
+
+```erlang
+lager:md([{zone, forbidden}])
+```
+
+Note that lager:md will *only* accept a list of key/value pairs keyed by atoms.
+
+You can also omit the final argument, and the loglevel will default to
+'debug'.
+
+Tracing to the console is similar:
+
+```erlang
+lager:trace_console([{request, 117}])
+```
+
+In the above example, the loglevel is omitted, but it can be specified as the
+second argument if desired.
+
+You can also specify multiple expressions in a filter, or use the '*' atom as
+a wildcard to match any message that has that attribute, regardless of its
+value.
+
+Tracing to an existing logfile is also supported, if you wanted to log
+warnings from a particular module to the default error.log:
+
+```erlang
+lager:trace_file("log/error.log", [{module, mymodule}], warning)
+```
+
+To view the active log backends and traces, you can use the lager:status()
+function. To clear all active traces, you can use lager:clear_all_traces().
+
+To delete a specific trace, store a handle for the trace when you create it,
+that you later pass to lager:stop_trace/1:
+
+```erlang
+{ok, Trace} = lager:trace_file("log/error.log", [{module, mymodule}]),
+...
+lager:stop_trace(Trace)
+```
+
+Tracing to a pid is somewhat of a special case, since a pid is not a
+data-type that serializes well. To trace by pid, use the pid as a string:
+
+```erlang
+lager:trace_console([{pid, "<0.410.0>"}])
+```
+
+As of lager 2.0, you can also use a 3 tuple while tracing, where the second
+element is a comparison operator. The currently supported comparison operators
+are:
+
+* '<' - less than
+* '=' - equal to
+* '>' - greater than
+
+```erlang
+lager:trace_console([{request, '>' 117}, {request, '<' 120}])
+```
+
+Using '=' is equivalent to the 2-tuple form.
+
+Setting the truncation limit at compile-time
+--------------------------------------------
+Lager defaults to truncating messages at 4096 bytes, you can alter this by
+using the {lager_truncation_size, X} option. In rebar, you can add it to
+erl_opts:
+
+```erlang
+{erl_opts, [{parse_transform, lager_transform}, {lager_truncation_size, 1024}]}.
+```
+
+You can also pass it to erlc, if you prefer:
+
+```
+erlc -pa lager/ebin +'{parse_transform, lager_transform}' +'{lager_truncation_size, 1024}' file.erl
+```
diff --git a/README.org b/README.org
deleted file mode 100644
index ad7aff3..0000000
--- a/README.org
+++ /dev/null
@@ -1,298 +0,0 @@
-* Overview
- Lager (as in the beer) is a logging framework for Erlang. Its purpose is
- to provide a more traditional way to perform logging in an erlang application
- that plays nicely with traditional UNIX logging tools like logrotate and
- syslog. You can view the Lager EDocs [[http://basho.github.com/lager/][here]].
-
- [[http://travis-ci.org/basho/lager][Travis-CI]] :: [[https://secure.travis-ci.org/basho/lager.png]]
-
-* Features
- - Finer grained log levels (debug, info, notice, warning, error, critical,
- alert, emergency)
- - Logger calls are transformed using a parse transform to allow capturing
- Module/Function/Line/Pid information
- - When no handler is consuming a log level (eg. debug) no event is even sent
- to the log handler
- - Supports multiple backends, including console and file. More are planned.
-
-* Usage
- To use lager in your application, you need to define it as a rebar dep or have
- some other way of including it in erlang's path. You can then add the
- following option to the erlang compiler flags
-
-#+BEGIN_EXAMPLE
- {parse_transform, lager_transform}
-#+END_EXAMPLE
-
- Alternately, you can add it to the module you wish to compile with logging
- enabled:
-
-#+BEGIN_EXAMPLE
- -compile([{parse_transform, lager_transform}]).
-#+END_EXAMPLE
-
- Before logging any messages, you'll need to start the lager application. The
- lager module's start function takes care of loading and starting any dependencies
- lager requires.
-
-#+BEGIN_EXAMPLE
- lager:start().
-#+END_EXAMPLE
-
- Once you have built your code with lager and started the lager application,
- you can then generate log messages by doing the following:
-
-#+BEGIN_EXAMPLE
- lager:error("Some message")
-#+END_EXAMPLE
-
- Or:
-
-#+BEGIN_EXAMPLE
- lager:warning("Some message with a term: ~p", [Term])
-#+END_EXAMPLE
-
- The general form is lager:Severity() where Severity is one of the log levels
- mentioned above.
-
-* Configuration
- To configure lager's backends, you use an application variable (probably in
- your app.config):
-
-#+BEGIN_EXAMPLE
- {lager, [
- {handlers, [
- {lager_console_backend, info},
- {lager_file_backend, [
- {"error.log", error, 10485760, "$D0", 5},
- {"console.log", info, 10485760, "$D0", 5}
- ]}
- ]}
- ]}.
-#+END_EXAMPLE
-
- The available configuration options for each backend are listed in their
- module's documentation.
-
-* Custom Formatting
- All loggers have a default formatting that can be overriden. A formatter is any module that
- exports format(#lager_log_message{},Config#any()). It is specified as part of the configuration
- for the backend:
-
-#+BEGIN_EXAMPLE
- {lager, [
- {handlers, [
- {lager_console_backend, [info, {lager_default_formatter, [time," [",severity,"] ", message, "\n"]}},
- {lager_file_backend, [
- [{"error.log", error, 10485760, "$D0", 5,{lager_default_formatter,[date, " ", time," [",severity,"] ",pid, " ", message, "\n"]}],
- {"console.log", info, 10485760, "$D0", 5}
- ]}
- ]}
- ]}.
-#+END_EXAMPLE
-
- Included is lager_default_formatter. This provides a generic, default formatting for log messages using a "semi-iolist"
- as configuration. Any iolist allowed elements in the configuration are printed verbatim. Atoms in the configuration
- are treated as metadata properties and extracted from the log message.
- The metadata properties date,time, message, and severity will always exist.
- The properties pid, file, line, module, function, and node will always exist if the parser transform is used.
-
-#+BEGIN_EXAMPLE
- ["Foo"] -> "Foo", regardless of message content.
- [message] -> The content of the logged message, alone.
- [{pid,"Unknown Pid"}] -> "<?.?.?>" if pid is in the metadata, "Unknown Pid" if not.
- [{pid, ["My pid is ", pid], "Unknown Pid"}] -> if pid is in the metadata print "My pid is <?.?.?>", otherwise print "Unknown Pid"
-#+END_EXAMPLE
-
- Optionally, a tuple of {atom(),semi-iolist()}
- can be used. The atom will look up the property, but if not found it will use the semi-iolist() instead. These fallbacks
- can be nested or refer to other properties.
-
-#+BEGIN_EXAMPLE
- [{pid,"Unknown Pid"}] -> "<?.?.?>" if pid is in the metadata, "Unknown Pid" if not.
- [{server,[$(,{pid,"Unknown Server"},$)]}}] -> user provided server metadata, otherwise "(<?.?.?>)", otherwise "(Unknown Server)"
-#+END_EXAMPLE
-
-* Error logger integration
- Lager is also supplied with a error_logger handler module that translates
- traditional erlang error messages into a friendlier format and sends them into
- lager itself to be treated like a regular lager log call. To disable this, set
- the lager application variable `error_logger_redirect' to `false'.
-
- The error_logger handler will also log more complete error messages (protected
- with use of trunc_io) to a "crash log" which can be referred to for further
- information. The location of the crash log can be specified by the crash_log
- application variable. If undefined it is not written at all.
-
- Messages in the crash log are subject to a maximum message size which can be
- specified via the crash_log_msg_size application variable.
-
-* Runtime loglevel changes
- You can change the log level of any lager backend at runtime by doing the
- following:
-
-#+BEGIN_EXAMPLE
- lager:set_loglevel(lager_console_backend, debug).
-#+END_EXAMPLE
-
- Or, for the backend with multiple handles (files, mainly):
-
-#+BEGIN_EXAMPLE
- lager:set_loglevel(lager_file_backend, "console.log", debug).
-#+END_EXAMPLE
-
- Lager keeps track of the minium log level being used by any backend and
- supresses generation of messages lower than that level. This means that debug
- log messages, when no backend is consuming debug messages, are effectively
- free. A simple benchmark of doing 1 million debug log messages while the
- minimum threshold was above that takes less than half a second.
-
-* Internal log rotation
- Lager can rotate its own logs or have it done via an external process. To
- use internal rotation, use the last 3 values in the file backend's
- configuration tuple. For example
-
-#+BEGIN_EXAMPLE
- {"error.log", error, 10485760, "$D0", 5}
-#+END_EXAMPLE
-
- This tells lager to log error and above messages to "error.log" and to
- rotate the file at midnight or when it reaches 10mb, whichever comes first
- and to keep 5 rotated logs, in addition to the current one. Setting the
- count to 0 does not disable rotation, it instead rotates the file and keeps
- no previous versions around. To disable rotation set the size to 0 and the
- date to "".
-
- The "$D0" syntax is taken from the syntax newsyslog uses in newsyslog.conf.
- The relevant extract follows:
-
-#+BEGIN_EXAMPLE
- Day, week and month time format: The lead-in character
- for day, week and month specification is a `$'-sign.
- The particular format of day, week and month
- specification is: [Dhh], [Ww[Dhh]] and [Mdd[Dhh]],
- respectively. Optional time fields default to
- midnight. The ranges for day and hour specifications
- are:
-
- hh hours, range 0 ... 23
- w day of week, range 0 ... 6, 0 = Sunday
- dd day of month, range 1 ... 31, or the
- letter L or l to specify the last day of
- the month.
-
- Some examples:
- $D0 rotate every night at midnight
- $D23 rotate every day at 23:00 hr
- $W0D23 rotate every week on Sunday at 23:00 hr
- $W5D16 rotate every week on Friday at 16:00 hr
- $M1D0 rotate on the first day of every month at
- midnight (i.e., the start of the day)
- $M5D6 rotate on every 5th day of the month at
- 6:00 hr
-#+END_EXAMPLE
-
- To configure the crash log rotation, the following application variables are
- used:
- - crash_log_size
- - crash_log_date
- - crash_log_count
-
- See the .app.src file for further details.
-
-* Syslog Support
- Lager syslog output is provided as a separate application;
- [[https://github.com/basho/lager_syslog][lager_syslog]]. It is packaged as a
- separate application so Lager itself doesn't have an indirect dependancy on a
- port driver. Please see the lager_syslog README for configuration information.
-
-* AMQP Support
- Jon Brisbin has written a lager backend to send lager messages into AMQP, so
- you can aggregate logs from a cluster into a central point. You can find it
- under the [[https://github.com/jbrisbin/lager_amqp_backend][lager_amqp_backend]]
- project on github.
-
-* Loggly Support
- The team at [[https://www.kivra.com][KIVRA]] has written a lager backend to send
- lager messages into [[http://www.loggly.com][Loggly]]. You can find it
- under the [[https://github.com/kivra/lager_loggly][lager_loggly]]
- project on github.
-
-* SMTP Support
- Ivan Blinkov has written a lager backend to send lager messages to email via SMTP,
- so you can get informed about critical errors in production immediately. You can
- find it under the [[https://github.com/blinkov/lager_smtp][lager_smtp]] project
- on github.
-
-* Tracing
- Lager supports basic support for redirecting log messages based on log message
- attributes. Lager automatically captures the pid, module, function and line at the
- log message callsite. However, you can add any additional attributes you wish:
-
-#+BEGIN_EXAMPLE
- lager:warning([{request, RequestID},{vhost, Vhost}], "Permission denied to ~s", [User])
-#+END_EXAMPLE
-
- Then, in addition to the default trace attributes, you'll be able to trace
- based on request or vhost:
-
-#+BEGIN_EXAMPLE
- lager:trace_file("logs/example.com.error", [{vhost, "example.com"}], error)
-#+END_EXAMPLE
-
- You can also omit the final argument, and the loglevel will default to
- 'debug'.
-
- Tracing to the console is similar:
-
-#+BEGIN_EXAMPLE
- lager:trace_console([{request, 117}])
-#+END_EXAMPLE
-
- In the above example, the loglevel is omitted, but it can be specified as the
- second argument if desired.
-
- You can also specify multiple expressions in a filter, or use the '*' atom as
- a wildcard to match any message that has that attribute, regardless of its
- value.
-
- Tracing to an existing logfile is also supported, if you wanted to log
- warnings from a particular module to the default error.log:
-
-#+BEGIN_EXAMPLE
- lager:trace_file("log/error.log", [{module, mymodule}], warning)
-#+END_EXAMPLE
-
- To view the active log backends and traces, you can use the lager:status()
- function. To clear all active traces, you can use lager:clear_all_traces().
-
- To delete a specific trace, store a handle for the trace when you create it,
- that you later pass to lager:stop_trace/1:
-
-#+BEGIN_EXAMPLE
- {ok, Trace} = lager:trace_file("log/error.log", [{module, mymodule}]),
- ...
- lager:stop_trace(Trace)
-#+END_EXAMPLE
-
- Tracing to a pid is somewhat of a special case, since a pid is not a
- data-type that serializes well. To trace by pid, use the pid as a string:
-
-#+BEGIN_EXAMPLE
- lager:trace_console([{pid, "<0.410.0>"}])
-#+END_EXAMPLE
-
-* Setting the truncation limit at compile-time
- Lager defaults to truncating messages at 4096 bytes, you can alter this by
- using the {lager_truncation_size, X} option. In rebar, you can add it to
- erl_opts:
-
-#+BEGIN_EXAMPLE
- {erl_opts, [{parse_transform, lager_transform}, {lager_truncation_size, 1024}]}.
-#+END_EXAMPLE
-
- You can also pass it to erlc, if you prefer:
-
-#+BEGIN_EXAMPLE
- erlc -pa lager/ebin +'{parse_transform, lager_transform}' +'{lager_truncation_size, 1024}' file.erl
-#+END_EXAMPLE
diff --git a/src/lager.app.src b/src/lager.app.src
index 76a9228..450e537 100644
--- a/src/lager.app.src
+++ b/src/lager.app.src
@@ -49,6 +49,10 @@
%% current one - default is 0
{crash_log_count, 5},
%% Whether to redirect error_logger messages into lager - defaults to true
- {error_logger_redirect, true}
+ {error_logger_redirect, true},
+ %% How many messages per second to allow from error_logger before we start dropping them
+ {error_logger_hwm, 50},
+ %% How big the gen_event mailbox can get before it is switched into sync mode
+ {async_threshold, 20}
]}
]}.
diff --git a/src/lager_app.erl b/src/lager_app.erl
index 99ecd4f..d177ceb 100644
--- a/src/lager_app.erl
+++ b/src/lager_app.erl
@@ -39,6 +39,8 @@
case application:get_env(lager, async_threshold) of
undefined ->
ok;
+ {ok, undefined} ->
+ undefined;
{ok, Threshold} when is_integer(Threshold), Threshold >= 0 ->
_ = supervisor:start_child(lager_handler_watcher_sup, [lager_event, lager_backend_throttle, Threshold]),
ok;
@@ -64,6 +66,8 @@
lager:update_loglevel_config(),
HighWaterMark = case application:get_env(lager, error_logger_hwm) of
+ {ok, undefined} ->
+ undefined;
{ok, HwmVal} when is_integer(HwmVal), HwmVal > 0 ->
HwmVal;
{ok, BadVal} ->
diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl
index a46f50f..b8a3411 100644
--- a/src/lager_file_backend.erl
+++ b/src/lager_file_backend.erl
@@ -457,6 +457,7 @@
application:load(lager),
application:set_env(lager, handlers, [{lager_test_backend, info}]),
application:set_env(lager, error_logger_redirect, false),
+ application:set_env(lager, async_threshold, undefined),
application:start(lager)
end,
fun(_) ->