[
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)