I built a solution for a similar scenario and have it running in 
approximately 50 production deployments. The product that uses it is a 
telecommunications gateway supporting up to 3000 business telephones. Some 
of these deployments support 24x7 high volume call centers. To give you an 
idea of its complexity, the solution supports up to 40 TCP and 10 UPD 
connections to external servers as well as a reliable UPD connection for 
each of the 300 phones.  This equates to approximately 3100 long running, 
supervised processes. 

The solution wraps the standard out of the box Logger with the same 
functions and levels, but adds an extra (optional) argument to the log/2, 
error/1, warn/1, info/1 and debug/1 functions. Here is how it's used:

use MyLogger

 MyLogger.info :category1,"log message"
 MyLogger.debug :category2,"some #{inspect expensive}operation"
 MyLogger.warn"always displayed when :warn level set"

The category levels can be set in the config file as well as changed at run 
time.  Messages are always converted to anonymous functions so they are 
only expanded when the appropriate category is enabled. I also support 
compile time purging of specific categories similar to how Logger works 
today. I have helpers to query, set, and clear levels. The module can be 
imported in iex to provide a simple interface for log and category control 
in remote consoles for production use. 

My production solution has around 25 categories. We use it all the time 
when trouble shooting had to reproduce issues on high traffic customer 
sites. We use it extensively with info and debug levels. When a problem is 
reported, we first review the default logs. If we cannot identify the 
problem, we enable additional categories for the areas that we think the 
problem may be in. Then we wait for the next report of the problem (or 
proactively monitor the logs). We find it very useful for either finding 
the problem, or for getting enough information to reproduce the issue in 
our lab.

We define some categories at the module (process) level and others by 
topic. Topic categories may span multiple processes to help identify cross 
cutting issues. I use an `init` category log in init callback of pretty 
well every gen_server. It logs the process's PID and other identification 
information. I have this category enabled by default. 

I have not released this as an open source package, but would be willing if 
there is an interest in the community. 

Personally, I prefer the 3rd party dependency approach over building in the 
support to Logger. This is not something that most developers will need. 
However, I believe that is an extremely useful solution for some projects. 

I look forward to hearing from anyone that may be interested in hex 
package. I may also cross post this on Elixir Forum to get additional 
feedback.

Steve

PS. The ability to control log levels on a module by module bases would 
also be easy to implement as a hex package and added to existing modules by 
simply aliasing `require MyLogger, as: Logger` and implementing the 
wrappers to the existing Logger APIs.  

On Thursday, December 7, 2017 at 2:01:40 PM UTC-5, Isaac Whitfield wrote:
>
> This is based on previous conversation in 
> https://groups.google.com/d/msg/elixir-lang-core/C5-ixZVau3U/Gkb4PyOOAQAJ, 
> but this thread proposes an actual solution which I believe will benefit 
> everyone.
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/e4d70614-cddb-49ae-8f68-d87f8b33de14%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to