logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matt Sicker <boa...@gmail.com>
Subject Re: Adding a logger with custom appender pragmatically, without using the ROOT appends for this logger, is this possible?
Date Wed, 23 Jul 2014 17:01:18 GMT
Ah, good point.


On 23 July 2014 11:51, Ralph Goers <ralph.goers@dslextreme.com> wrote:

> Well, you can say that about everything in core.  Clearly there is some
> stuff in core that we are going to carefully consider the impact to users
> before we allow it to change. And saying “not supported” is much different
> that saying “we may not maintain binary compatibility”.
>
> Ralph
>
> On Jul 23, 2014, at 8:56 AM, Matt Sicker <boards@gmail.com> wrote:
>
> I say not supported because that API is subject to change in 2.x releases
> since it's not log4j-api.
>
>
> On 23 July 2014 10:46, Ralph Goers <ralph.goers@dslextreme.com> wrote:
>
>> Matt,
>>
>> That isn’t quite true.  What he is trying to do should work.  We just
>> want to find a better way to do it.
>>
>> As for the code below, I don’t see the source for LogStreamAppender, but
>> it is never being started which will ultimately cause problems.
>>
>> Note also that if the LoggerConfig existed and had additivity = true the
>> code below will not be changing that to false.
>>
>> Can you create a Jira issue and attach a sample project that demonstrates
>> the problem?
>>
>> Ralph
>>
>> On Jul 23, 2014, at 8:30 AM, Matt Sicker <boards@gmail.com> wrote:
>>
>> Programmatic configuration is not yet supported which is the biggest
>> issue here. The only "supported" way of doing it would be through creating
>> a hierarchy of Node objects that directly correspond to a parsed tree of an
>> XML or JSON config file.
>>
>>
>> On 23 July 2014 06:40, Remko Popma <remko.popma@gmail.com> wrote:
>>
>>> One thing you can try is in your log4j2.xml, add a threshold filter that
>>> accepts INFO to the console appender. For an example, see
>>> http://logging.apache.org/log4j/2.x/manual/filters.html#ThresholdFilter
>>>
>>> Sent from my iPhone
>>>
>>> On 2014/07/23, at 16:27, Nayden Gochev <gochev@gmail.com> wrote:
>>>
>>> Matt,
>>> so you are right.. if I do a XML configuration and make additivity=
>>> false and register my logger with appenderRef there.. everything works as
>>> expected.. the ROOT appenders are not used.
>>>  However.. when I do it via code ( the one I send in the previous mail )
>>> the root appenders are working...
>>> Do I do something wrong abotu creation ?
>>> or is there some difference in how updateLoggers(cfg) works compared to
>>> after parsing the log4j2.xml and again updating loggers ?
>>>
>>> Thanks,
>>> Nayden
>>>
>>>
>>> On Wed, Jul 23, 2014 at 9:55 AM, Nayden Gochev <gochev@gmail.com> wrote:
>>>
>>>> Hello Matt,
>>>> the problem is that I want to create the appender and the logger
>>>> together via code.
>>>> So the appender or the logger are not mentioned in the log4j2.xml file
>>>>
>>>> I am creating the appender via the createAppender factory method but in
>>>> the code.
>>>> Full code for enable the logger + appender I use is this :
>>>> if (enable) {
>>>>             final LoggerContext ctx = (LoggerContext)
>>>> LogManager.getContext(false);
>>>>             Configuration cfg = ctx.getConfiguration();
>>>>             if (cfg instanceof XmlConfiguration) {
>>>>                 //add appender if not added
>>>>                 Appender appender =
>>>> cfg.getAppender(LogStreamAppender.NAME);
>>>>                 if (appender == null) {
>>>>                     appender
>>>> = LogStreamAppender.createAppender(LogStreamAppender.NAME, "%highlight{%d
>>>> [%t] %-5level: %msg%n%throwable}", "false", null);
>>>>                     cfg.addAppender(appender);
>>>>                 }
>>>>                 //add logger if not added
>>>>                 LoggerConfig logger = ((XmlConfiguration)
>>>> cfg).getLogger(loggerName);
>>>>                 if (logger == null) {
>>>>                     logger = new LoggerConfig(loggerName, Level.DEBUG,
>>>> false);
>>>>                     cfg.addLogger(loggerName, logger);
>>>>                 } else {
>>>>                     logger.setLevel(Level.DEBUG);
>>>>                 }
>>>>                 logger.addAppender(appender, Level.DEBUG, null);
>>>>                 ctx.updateLoggers(cfg);
>>>>             }
>>>>         }
>>>>
>>>> The problem is that indeed this LogStreamAppender is receiving
>>>> everything correctly. However in the log4j2.xml I have several other
>>>> appenders added at the ROOT log.
>>>> <Appenders>
>>>> <Console name="CONSOLE" target="SYSTEM_OUT">
>>>> <PatternLayout pattern="%highlight{%d [%t] %-5level: %msg%n%throwable}"
>>>> />
>>>>  </Console>
>>>> .....
>>>> </Appenders>
>>>> <Root level="info">
>>>> <AppenderRef ref="CONSOLE"/>
>>>>
>>>>  ....
>>>> </Root>
>>>>
>>>> All of which .. start automatically receive my Stream log ... which is
>>>> what I don't want to happen :(
>>>> So even if I pass additivity to false... the root appenders (which were
>>>> info but are now as it looks are debug for this package (loggerName)) are
>>>> still receiving the messages
>>>>
>>>> Regards,
>>>> Nayden
>>>>
>>>>
>>>>
>>>> On Tue, Jul 22, 2014 at 10:35 PM, Matt Sicker <boards@gmail.com> wrote:
>>>>
>>>>> How are you creating the appender? It might work better using a config
>>>>> file.
>>>>>
>>>>>
>>>>> On 22 July 2014 02:47, Nayden Gochev <gochev@gmail.com> wrote:
>>>>>
>>>>>> Hello Matt,
>>>>>>
>>>>>> this sounds great however it doesn't work.
>>>>>>
>>>>>> Maybe it is a bug ?
>>>>>>
>>>>>> what I do is :
>>>>>>
>>>>>>  final LoggerContext ctx = (LoggerContext)
>>>>>> LogManager.getContext(false);
>>>>>>
>>>>>>             Configuration cfg = ctx.getConfiguration();
>>>>>>
>>>>>>             if (cfg instanceof XmlConfiguration) {
>>>>>>
>>>>>>                 //add logger if not added
>>>>>>
>>>>>>                 LoggerConfig logger = ((XmlConfiguration)
>>>>>> cfg).getLogger(loggerName);
>>>>>>
>>>>>>                 if (logger == null) {
>>>>>>
>>>>>>                     logger = new LoggerConfig(loggerName,
>>>>>> Level.DEBUG, false); //here this false is for the additive
>>>>>>
>>>>>>                     cfg.addLogger(loggerName, logger);
>>>>>>
>>>>>>                 } else { //change the level leave it as it is
>>>>>>
>>>>>>                     logger.setLevel(Level.DEBUG);
>>>>>>
>>>>>>                 }
>>>>>>
>>>>>>                 logger.addAppender(newAppender, Level.DEBUG, null);
>>>>>>
>>>>>>                 ctx.updateLoggers(cfg);
>>>>>>
>>>>>> }
>>>>>>
>>>>>>
>>>>>> Still .. all root loggers also receive the log message(s) together
>>>>>> with this new appender that is passed here.
>>>>>>
>>>>>> I am using 2.0 final
>>>>>>
>>>>>>
>>>>>> On Jul 21, 2014 5:32 PM, "Matt Sicker" <boards@gmail.com> wrote:
>>>>>>
>>>>>>> You should specify false for additivity to prevent the automatic
>>>>>>> inheritance.
>>>>>>>
>>>>>>>
>>>>>>> On 21 July 2014 09:20, Nayden Gochev <gochev@gmail.com>
wrote:
>>>>>>>
>>>>>>>> In short:
>>>>>>>> I am trying to add a custom appender + logger for some package
for
>>>>>>>> example "org.test"
>>>>>>>> However the root appenders (appender refs) are always added
as well
>>>>>>>> automatically.. so even if I have a root appender(s) with
level INFO
>>>>>>>> defined in the log4j2.xml,
>>>>>>>> ones I add a logger with level DEBUG.. with a new appender
(only 1)
>>>>>>>> .. the 2 root appenders that I have defined in the XML automatically
starts
>>>>>>>> receiving this DEBUG messages as well.
>>>>>>>>
>>>>>>>> Is it possible somehow to REMOVE this ROOT appends.. from
my newly
>>>>>>>> created logger ?
>>>>>>>> newLoggerConfig.getAppenderRefs().clear(); doesn't work of
course :)
>>>>>>>>
>>>>>>>> Thanks for the help,
>>>>>>>> much appreciated.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Matt Sicker <boards@gmail.com>
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Matt Sicker <boards@gmail.com>
>>>>>
>>>>
>>>>
>>>
>>
>>
>> --
>> Matt Sicker <boards@gmail.com>
>>
>>
>>
>
>
> --
> Matt Sicker <boards@gmail.com>
>
>
>


-- 
Matt Sicker <boards@gmail.com>

Mime
View raw message