Gary, your examples are great and would be a good addition to the Introduction 
page.

Ralph

> On Sep 1, 2015, at 3:47 PM, Gary Gregory <garydgreg...@gmail.com> wrote:
> 
> On Tue, Sep 1, 2015 at 3:26 PM, Nicholas Duane <nic...@msn.com 
> <mailto:nic...@msn.com>> wrote:
> 
>> I was re-reading this and thought I should respond.  You mentioned that
>> levels are used to indicate the importance of what you logged.  The logger
>> helps you with "what is it that I'm trying to tell" the audience, if I have
>> that correct.  Which I kind of agree.  The logger, in my mind, indicates
>> the "area" of code which is sourcing the events.  In your example you have
>> an authentication module which has its own logger.  All events (hopefully
>> using the terms events is ok) logged from that logger has to do with
>> authentication.
> 
> 
> Yes, a "log event" is the right general term, which we happen to use
> internally with the interface org.apache.logging.log4j.core.LogEvent.
> 
> The authentication module uses its logger to log events at different
>> levels.
> 
> 
> Right, for example, from the auth Logger:
> 
> INFO - User Alice logged in.
> WARN  - User Bob entered an invalid password.
> ERROR - User Bob entered an invalid password three times and is now locked
> out.
> 
> Then from a different part of the app, the email agent Logger, for example:
> 
> DEBUG: Read account for Bob from database connection jdbc://...
> INFO - Emailed user Bob that his account might be under attack because
> three login attempts were rejected.
> ERROR - Email bounced back to al...@example.com <mailto:al...@example.com>; 
> subject: foo.
> 
> So you can imagine that for different loggers, the meaning of what is
> normal vs. an error can be very different.
> 
> Gary
> 
> So in my scenario, the authentication module might want to log a "Business"
>> event.  In reality this probably would not happen as the business events
>> would most likely be sourced from LOB application code.  However, each
>> component of LOB application code might have its own logger and if it needs
>> to log a business event it should do so from its logger.
>> 
>> I did look at markers and it would seem if I used them for these business
>> events I would still be logging the business events at some level and would
>> include a marker.  This seems odd to me as the level would seem pointless
>> and thus picking one would be arbitrary.
>> 
>> Someone had mentioned using the EventLogger.  I still have to look into
>> that, but that sounds like a single logger which I initially thought was
>> not required and instead the advice would be to log via whatever logger
>> you're using for your other events.  However, maybe the EventLogger will
>> work.
>> 
>> Thanks,
>> Nick
>> 
>> 
>>> Date: Mon, 31 Aug 2015 15:16:49 -0700
>>> Subject: Re: approach for defining loggers
>>> From: garydgreg...@gmail.com
>>> To: log4j-user@logging.apache.org
>>> 
>>> On Mon, Aug 31, 2015 at 3:07 PM, Nicholas Duane <nic...@msn.com> wrote:
>>> 
>>>> All sounds reasonable to me.  I'm not sure any of the statements you
>> made
>>>> go against anything I have stated.  Please let me know if you think
>>>> otherwise.
>>>> 
>>>> In your authentication module, you log all levels through its logger,
>>>> right?
>>> 
>>> 
>>> Yes.
>>> 
>>> 
>>>> You don't use separate loggers to log different levels do you?
>>>> 
>>> 
>>> No separate loggers per levels.
>>> 
>>> Gary
>>> 
>>> 
>>>> 
>>>> Thanks,
>>>> Nick
>>>> 
>>>>> Date: Mon, 31 Aug 2015 15:02:09 -0700
>>>>> Subject: Re: approach for defining loggers
>>>>> From: garydgreg...@gmail.com
>>>>> To: log4j-user@logging.apache.org
>>>>> 
>>>>> I think of levels as "how important is this" and "who needs to know
>>>> this".
>>>>> Some of the art of logging is deciding who you audience is. To help
>> your
>>>>> development team chase down a bug, you want to make sure that the app
>>>> logs
>>>>> interesting events at the DEBUG and TRACE level. This is different
>> that
>>>>> "what it is I am telling this audience", which is where I use
>> loggers. To
>>>>> tell who comes in and out of the system, I have logging in the
>>>>> authentication module. To tell what kind of SQL goes to the
>> database, I
>>>>> have DEBUG logging in my DB interface code.
>>>>> 
>>>>> I think that once you start chasing down issues and bugs, and writing
>>>> code
>>>>> to help you do that, then it might become more obvious, as to what
>> to do.
>>>>> 
>>>>> Gary
>>>>> 
>>>>> On Mon, Aug 31, 2015 at 2:51 PM, Nicholas Duane <nic...@msn.com>
>> wrote:
>>>>> 
>>>>>> I did look through a bit of documentation on markers:
>>>>>> 
>>>>>> https://logging.apache.org/log4j/2.0/manual/markers.html
>>>>>> 
>>>>>> 
>>>> 
>> http://stackoverflow.com/questions/16813032/what-is-markers-in-java-logging-frameworks-and-that-is-a-reason-to-use-them
>>>>>> 
>>>>>> My initial impression is that I don't want to use markers.  What
>> I'd
>>>> like
>>>>>> to be able to say is:
>>>>>> 
>>>>>> "log the way you have been logging in the past.  You don't need to
>> know
>>>>>> about any special loggers.  Use your own.  Here is a new level for
>> our
>>>> new
>>>>>> type of "event".  Use that to log this new event."
>>>>>> 
>>>>>> I guess I'm not understanding your vernacular in terms of levels.
>> In
>>>> my
>>>>>> mind the different levels also define different "types" of
>> events.  For
>>>>>> instance, DEBUG and less specific I would see as tracing type
>> events
>>>> which
>>>>>> are non-functional in nature.  They are purely for understanding
>> the
>>>> call
>>>>>> flow, or for performance gathering, or detailed diagnosis.  Those
>>>> could be
>>>>>> turned off totally without having much impact on system management.
>>>> The
>>>>>> same can't be said for FATAL to INFO.  These levels should always
>> be
>>>> on so
>>>>>> that you can properly manage the system.
>>>>>> 
>>>>>> Thanks,
>>>>>> Nick
>>>>>> 
>>>>>>> Date: Mon, 31 Aug 2015 08:37:25 -0700
>>>>>>> Subject: Re: approach for defining loggers
>>>>>>> From: garydgreg...@gmail.com
>>>>>>> To: log4j-user@logging.apache.org
>>>>>>> 
>>>>>>> Hi Nick,
>>>>>>> 
>>>>>>> Creating a single new level is seldom the right solution IMO.
>> It's
>>>> not
>>>>>> like
>>>>>>> you are missing a level of granularity (we have custom level
>> examples
>>>>>> that
>>>>>>> demonstrate that, like a VERBOSE level that sits between INFO and
>>>> DEBUG).
>>>>>>> It sounds like you need to use _hierarchical_ loggers and/or
>> markers.
>>>>>>> 
>>>>>>> The fact that the level is called BUSINESS is also a hint that a
>>>> level is
>>>>>>> not quite right because it does not fit in the Level vernacular
>>>> (INFO,
>>>>>>> WARN, and so on).
>>>>>>> 
>>>>>>> If you needed a different set of levels, that would be another
>> story
>>>>>> (like
>>>>>>> the DEFCON levels example).
>>>>>>> 
>>>>>>> Gary
>>>>>>> 
>>>>>>> On Mon, Aug 31, 2015 at 8:10 AM, Nicholas Duane <nic...@msn.com>
>>>> wrote:
>>>>>>> 
>>>>>>>> Thanks for the feedback.  I will look into Markers and MDC.
>>>>>>>> 
>>>>>>>> With respect to using a separate logger, it would seem I would
>>>> lose the
>>>>>>>> information about what application code, eg. the class logger,
>> is
>>>>>> sourcing
>>>>>>>> the event.  We would like to have this information.  On top of
>>>> that, it
>>>>>>>> seems odd, maybe to me only, that for this new level we have
>> our
>>>> own
>>>>>>>> logger.  It seemed reasonable to me that this new event we
>> want to
>>>>>> capture
>>>>>>>> is just a new level.  Just like a DEBUG event is different
>> from an
>>>> INFO
>>>>>>>> event.  If I define a BUSINESS level why would that not follow
>> the
>>>> same
>>>>>>>> design as the current levels?  You wouldn't suggest having
>>>> different
>>>>>>>> loggers for TRACE DEBUG INFO WARN ERROR FATAL, would you?  I
>> think
>>>> one
>>>>>> of
>>>>>>>> the reasons someone on our side is suggesting I have separate
>>>> loggers
>>>>>> is
>>>>>>>> that they think the overhead of filtering at the appender is
>> going
>>>> to
>>>>>> have
>>>>>>>> a noticeable impact.  Our plan, at least the one I have now in
>> my
>>>>>> head, is
>>>>>>>> that we'll have some number of appenders in the root.  We'll
>> then
>>>>>> filter x
>>>>>>>> < INFO events to a tracing appender, INFO <= x <= FATAL to a
>>>> logging
>>>>>>>> appender, and our custom level will go to another appender.
>>>> Thoughts?
>>>>>>>> 
>>>>>>>> Thanks,
>>>>>>>> Nick
>>>>>>>> 
>>>>>>>>> Subject: Re: approach for defining loggers
>>>>>>>>> From: ralph.go...@dslextreme.com
>>>>>>>>> Date: Sat, 29 Aug 2015 20:59:36 -0700
>>>>>>>>> To: log4j-user@logging.apache.org
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> On Aug 29, 2015, at 7:44 PM, Nicholas Duane <
>> nic...@msn.com>
>>>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>> I'm curious if there is a prescribed approach to defining
>>>> loggers.
>>>>>>>> Let me state what my assumption is.  I assume that normally if
>> some
>>>>>> piece
>>>>>>>> of code wants to log events/messages that it should create a
>>>> logger for
>>>>>>>> itself.  I guess a reasonable name to use is the class name
>>>> itself.  In
>>>>>>>> terms of logger configuration I would expect that no loggers
>> are
>>>>>> specified
>>>>>>>> in the log4j configuration UNLESS is needs settings other than
>> the
>>>>>>>> default.  The root logger would specify the default settings,
>> eg.
>>>>>> level and
>>>>>>>> appenders.  If some piece of code tied to a logger needs to
>> enable
>>>>>> tracing
>>>>>>>> in order to debug an issue then you would add that logger to
>> the
>>>>>>>> configuration and set the level less specific for that
>> logger.  Is
>>>>>> this a
>>>>>>>> typical and reasonable approach?
>>>>>>>>> 
>>>>>>>>> What you describe here is the common convention. It is a
>>>> reasonable
>>>>>>>> approach.
>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> I asked because we have the need for a new type of event.
>> To
>>>> have
>>>>>>>> this event flow to where we want it to flow the plan is to
>> have a
>>>>>> custom
>>>>>>>> level and have all events at that level captured by a specific
>>>>>> appender.
>>>>>>>> My assumption was that for existing applications we'd just
>> need to
>>>> add
>>>>>> our
>>>>>>>> appender to the root and add our custom level.  The app would
>> need
>>>> to
>>>>>> be
>>>>>>>> modified to log our new event at the custom level.  However,
>>>> someone
>>>>>>>> suggested that we could also create a separate logger for this
>>>> event.
>>>>>> My
>>>>>>>> thinking is that while we don't ever want to turn off logging
>> of
>>>> this
>>>>>>>> event, loggers represent "event sources", e.g the code raising
>> the
>>>>>> events
>>>>>>>> and thus having multiple different pieces of code use the same
>>>> logger
>>>>>>>> wouldn't allow you to turn on/off logging from those different
>>>>>> sections of
>>>>>>>> code independently.  I think the current configuration includes
>>>> all the
>>>>>>>> loggers.  Normally I would expect there to be many, on the
>> order of
>>>>>> 10's or
>>>>>>>> 100's, loggers within an application.  However, in the case I
>> was
>>>> given
>>>>>>>> there were only a handful because I think this handful is
>> shared.
>>>> So
>>>>>> as I
>>>>>>>> mentioned, this doesn't sound like an ideal design as you have
>> less
>>>>>>>> granularity on what you can turn on/off.
>>>>>>>>> 
>>>>>>>>> You have a few options. Using a CustomLevel would not be the
>>>> option I
>>>>>>>> would choose.  Creating a custom Logger will certainly work and
>>>> makes
>>>>>>>> routing the message to the appropriate appender rather easy.
>>>> Another
>>>>>>>> approach is to use Markers.  Markers are somewhat hierarchical
>> so
>>>> you
>>>>>> can
>>>>>>>> use them for a variety of purposes.  If you look at how Log4j
>>>> handles
>>>>>> event
>>>>>>>> logging it actually does both - it specifies EventLogger as the
>>>> name
>>>>>> of the
>>>>>>>> logger to use and it uses Markers to identify the kind of
>> event.
>>>>>>>>> 
>>>>>>>>> A third option is to use the MDC or Logger properties. If
>> you do
>>>> that
>>>>>>>> then you can have information included in the actual logging
>> event
>>>>>> that can
>>>>>>>> affect how it is routed. I also built a system that uses the
>>>> RFC5424
>>>>>> format
>>>>>>>> so that the event could have lots of key/value pairs to
>> identify
>>>> the
>>>>>> events.
>>>>>>>>> 
>>>>>>>>> Unfortunately, without knowing more details I don’t know
>> that I
>>>> can
>>>>>> give
>>>>>>>> you a better idea on how I would implement it.
>>>>>>>>> 
>>>>>>>>> Ralph
>>>>>>>>> 
>>>>>>>>> 
>>>> ---------------------------------------------------------------------
>>>>>>>>> To unsubscribe, e-mail:
>>>> log4j-user-unsubscr...@logging.apache.org
>>>>>>>>> For additional commands, e-mail:
>>>> log4j-user-h...@logging.apache.org
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>>>>>>> Java Persistence with Hibernate, Second Edition
>>>>>>> <http://www.manning.com/bauer3/>
>>>>>>> JUnit in Action, Second Edition <
>> http://www.manning.com/tahchiev/>
>>>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>>>> Blog: http://garygregory.wordpress.com
>>>>>>> Home: http://garygregory.com/
>>>>>>> Tweet! http://twitter.com/GaryGregory
>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> --
>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>>>>> Java Persistence with Hibernate, Second Edition
>>>>> <http://www.manning.com/bauer3/>
>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>> Blog: http://garygregory.wordpress.com
>>>>> Home: http://garygregory.com/
>>>>> Tweet! http://twitter.com/GaryGregory
>>>> 
>>>> 
>>> 
>>> 
>>> 
>>> --
>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
>>> Java Persistence with Hibernate, Second Edition
>>> <http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>> 
>> 
> 
> 
> 
> -- 
> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | 
> ggreg...@apache.org <mailto:ggreg...@apache.org>
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/ <http://www.manning.com/bauer3/>>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/ 
> <http://www.manning.com/tahchiev/>>
> Spring Batch in Action <http://www.manning.com/templier/ 
> <http://www.manning.com/templier/>>
> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/>
> Home: http://garygregory.com/ <http://garygregory.com/>
> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>

Reply via email to