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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> wrote: >> >>> How are you creating the appender? It might work better using a config >>> file. >>> >>> >>> On 22 July 2014 02:47, Nayden Gochev <[email protected]> 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" <[email protected]> wrote: >>>> >>>>> You should specify false for additivity to prevent the automatic >>>>> inheritance. >>>>> >>>>> >>>>> On 21 July 2014 09:20, Nayden Gochev <[email protected]> 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 <[email protected]> >>>>> >>>> >>> >>> >>> -- >>> Matt Sicker <[email protected]> >>> >> >> > -- Matt Sicker <[email protected]>
