[ 
https://issues.apache.org/jira/browse/LOG4J2-2918?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17199537#comment-17199537
 ] 

Geng Yuanzhe edited comment on LOG4J2-2918 at 9/21/20, 5:21 PM:
----------------------------------------------------------------

[~dennysfredericci]

You can try the following code to implement your requirements, without 
modifying AsyncLoggerConfig (Because I don't think it is a problem, Log4j2 
never guarantees that the filter will be called only once when log).

As described in link 
[https://logging.apache.org/log4j/2.x/manual/filters.html], filters may be 
configured in one of four locations.

{color:#ff8b00}1. Context-wide Filters {color}

with the following code, we can get Logger Filter: 5

 
{code:java}
public static void main(String[] args) throws InterruptedException {
    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    Configuration config = ctx.getConfiguration();
    LoggerFilter loggerFilter = new LoggerFilter();
    config.addFilter(loggerFilter);    // add filter to configuration, 
context-wide
    
    log.info("Just a random log... 1");
    log.info("Just a random log... 2");
    log.info("Just a random log... 3");
    log.info("Just a random log... 4");
    log.info("Just a random log... 5");    Thread.sleep(1000);
    System.out.printf("Logger Filter: %s %n", loggerFilter.getCounter());
}
public static class LoggerFilter extends AbstractFilter {    
    private final AtomicLong counter = new AtomicLong();          
    @Override
    public Result filter(LogEvent event) {
        counter.incrementAndGet();
        return Result.NEUTRAL;
    }    

    // need overwrite this method
    @Override
    public Result filter(org.apache.logging.log4j.core.Logger logger, Level 
level, Marker marker, Object msg, Throwable t){
        counter.incrementAndGet();
        return Result.NEUTRAL;
    }    public AtomicLong getCounter() {
        return counter;
    }
}{code}
 

 

{color:#ff8b00}2. Logger Filters  (your case, AsyncLogger not work){color}

{color:#ff8b00}3. Appender Filters{color}

With the following code, we can get Logger Filter: 5

 
{code:java}
public static void main(String[] args) throws InterruptedException {

    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    LoggerFilter loggerFilter = new LoggerFilter();

    ConsoleAppender consoleAppender = (ConsoleAppender) 
((org.apache.logging.log4j.core.Logger) log).getAppenders().get("Console");
    consoleAppender.addFilter(loggerFilter);

    log.info("Just a random log... 1");
    log.info("Just a random log... 2");
    log.info("Just a random log... 3");
    log.info("Just a random log... 4");
    log.info("Just a random log... 5");

    Thread.sleep(1000);
    System.out.printf("Logger Filter: %s %n", loggerFilter.getCounter());
}{code}
 

{color:#ff8b00}4. Appender Reference  (haven't try){color}

 

[~rgoers] [~mattsicker]  If I make a mistake, please let me know


was (Author: gengyuanzhe):
[~dennysfredericci]

You can try the following code to implement your requirements, without 
modifying AsyncLoggerConfig (Because I don't think it is a problem, Log4j2 
never guarantees that the filter will be called only once when log).

As described in link 
[https://logging.apache.org/log4j/2.x/manual/filters.html], filters may be 
configured in one of four locations.

{color:#ff8b00}1. Context-wide Filters {color}

with the following code, we can get Logger Filter: 5

 
{code:java}
public static void main(String[] args) throws InterruptedException {
    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    Configuration config = ctx.getConfiguration();
    LoggerFilter loggerFilter = new LoggerFilter();
    config.addFilter(loggerFilter);    // add filter to configuration, 
context-wide
    
    log.info("Just a random log... 1");
    log.info("Just a random log... 2");
    log.info("Just a random log... 3");
    log.info("Just a random log... 4");
    log.info("Just a random log... 5");    Thread.sleep(1000);
    System.out.printf("Logger Filter: %s %n", loggerFilter.getCounter());
}
public static class LoggerFilter extends AbstractFilter {    
    private final AtomicLong counter = new AtomicLong();          
    @Override
    public Result filter(LogEvent event) {
        counter.incrementAndGet();
        return Result.NEUTRAL;
    }    

    // need overwrite this method
    @Override
    public Result filter(org.apache.logging.log4j.core.Logger logger, Level 
level, Marker marker, Object msg, Throwable t){
        counter.incrementAndGet();
        return Result.NEUTRAL;
    }    public AtomicLong getCounter() {
        return counter;
    }
}{code}
 

 

{color:#ff8b00}2. Logger Filters  (your case, AsyncLogger not work){color}

{color:#ff8b00}3. Appender Filters{color}

With the following code, we can get Logger Filter: 5

 
{code:java}
public static void main(String[] args) throws InterruptedException {

    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    LoggerFilter loggerFilter = new LoggerFilter();

    ConsoleAppender consoleAppender = (ConsoleAppender) 
((org.apache.logging.log4j.core.Logger) log).getAppenders().get("Console");
    consoleAppender.addFilter(loggerFilter);

    log.info("Just a random log... 1");
    log.info("Just a random log... 2");
    log.info("Just a random log... 3");
    log.info("Just a random log... 4");
    log.info("Just a random log... 5");

    Thread.sleep(1000);
    System.out.printf("Logger Filter: %s %n", loggerFilter.getCounter());
}{code}
 

{color:#ff8b00}4. Appender Reference{color}

 

[~rgoers] [~mattsicker]  If I make a mistake, please let me know

> NPE on reconfigure method call with async configuration
> -------------------------------------------------------
>
>                 Key: LOG4J2-2918
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2918
>             Project: Log4j 2
>          Issue Type: Bug
>    Affects Versions: 2.13.3
>            Reporter: Dennys Fredericci
>            Priority: Major
>
> I am getting the error below trying to reconfigure log4j programmatically.
>  
> {code:java}
> 2020-08-24 10:10:18,163 main ERROR Could not register mbeans 
> java.lang.NullPointerException at 
> org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor.createRingBufferAdmin(AsyncLoggerConfigDisruptor.java:417)
>  at 
> org.apache.logging.log4j.core.async.AsyncLoggerConfig.createRingBufferAdmin(AsyncLoggerConfig.java:199)
>  at 
> org.apache.logging.log4j.core.jmx.Server.registerLoggerConfigs(Server.java:366)
>  at 
> org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:186)
>  at 
> org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:141)
>  at 
> org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:629)
>  at 
> org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:712)
>  at 
> org.apache.logging.log4j.core.config.Configurator.reconfigure(Configurator.java:239)
>  at br.com.fredericci.Main.main(Main.java:28)
> {code}
>  
> Seems the same or similar problem described here:
> https://issues.apache.org/jira/browse/LOG4J2-807
> Here is the project which reproduces this issue:
> [https://github.com/dennysfredericci/log4j2-filter-spike]



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to