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

justdebugit edited comment on LOG4J2-2095 at 11/3/17 8:16 AM:
--------------------------------------------------------------

The question:https://stackoverflow.com/a/47087631/1446916 is me.
It is not related to LOG4J2-2031.
I want to custom disruptor queue full policy 
 *The code is worth a thousand words*
The belowing is my code:

*log4j2.component.properties*
log4j2.Concurrency=100
log4j2.AsyncQueueFullPolicy=com.myapp.ConcurrencyDiscardingPolicy

*com.myapp.ConcurrencyDiscardingPolicy*

{code:java}
public class ConcurrencyDiscardingPolicy extends DefaultAsyncQueueFullPolicy{
    private static final Logger LOGGER = StatusLogger.getLogger();

    private final Level thresholdLevel;
    private final Integer maxConcurrency;
    private final LongAdder discardCount = new LongAdder();
    private final LongAdder concurrency  = new LongAdder();


    static final String PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL = 
"log4j2.DiscardThreshold";

    static final String PROPERTY_NAME_CONCURRENCY_LEVEL = "log4j2.Concurrency";


    public ConcurrencyDiscardingPolicy() {
        this.maxConcurrency = 
Objects.requireNonNull(getMaxConcurrency(),"maxConcurrency");
        this.thresholdLevel = Objects.requireNonNull(getLevel(), 
"thresholdLevel");
    }

    @Override
    public EventRoute getRoute(final long backgroundThreadId, final Level 
level) {
        if (level.isLessSpecificThan(thresholdLevel)) {
            if (concurrency.longValue() > maxConcurrency) {
                return CONCURRENCY_DISCARD_ROUTE;
            }
        }
        return super.getRoute(backgroundThreadId, level);
    }

    public static long getDiscardCount(final AsyncQueueFullPolicy router) {
        if (router instanceof ConcurrencyDiscardingPolicy) {
            return ((ConcurrencyDiscardingPolicy) 
router).discardCount.longValue();
        }
        return 0;
    }

    private Level getLevel(){
        final PropertiesUtil util = PropertiesUtil.getProperties();
        final String level = 
util.getStringProperty(PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL, 
Level.INFO.name());
        final Level thresholdLevel = Level.toLevel(level, Level.INFO);
        LOGGER.debug("Creating custom 
DiscardingAsyncQueueFullPolicy(discardThreshold:{})", thresholdLevel);
        return thresholdLevel;
    }

    private Integer getMaxConcurrency(){
        final PropertiesUtil util = PropertiesUtil.getProperties();
        final Integer maxConcurrency = 
util.getIntegerProperty(PROPERTY_NAME_CONCURRENCY_LEVEL, 10);
        LOGGER.debug("Creating custom 
DiscardingAsyncQueueFullPolicy(maxConcurrency:{})", maxConcurrency);
        return maxConcurrency;
    }

    public Level getThresholdLevel() {
        return thresholdLevel;
    }


    public class  ConcurrencyDiscard extends EventRoute {
      
       static final ConcurrencyDiscard CONCURRENCY_DISCARD_ROUTE = new 
ConcurrencyDiscard();

       
      
       private  ConcurrencyDiscard() {}

        @Override
        public void logMessage(AsyncLogger asyncLogger, String fqcn, Level 
level, Marker marker, Message message, Throwable thrown) {
            if (concurrency.longValue() > maxConcurrency){
                
EventRoute.DISCARD.logMessage(asyncLogger,fqcn,level,marker,message,thrown);
            }
            concurrency.add(1);
            
EventRoute.SYNCHRONOUS.logMessage(asyncLogger,fqcn,level,marker,message,thrown);
            concurrency.decrement();
        }

        @Override
        public void logMessage(AsyncLoggerConfig asyncLoggerConfig, LogEvent 
event) {
            if (concurrency.longValue() > maxConcurrency){
                EventRoute.DISCARD.logMessage(asyncLoggerConfig,event);
            }
            concurrency.add(1);
            EventRoute.SYNCHRONOUS.logMessage(asyncLoggerConfig,event);
            concurrency.decrement();
        }

        @Override
        public void logMessage(AsyncAppender asyncAppender, LogEvent coreEvent) 
{
            if (concurrency.longValue() > maxConcurrency){
                EventRoute.DISCARD.logMessage(asyncAppender,coreEvent);
            }
            concurrency.add(1);
            EventRoute.SYNCHRONOUS.logMessage(asyncAppender,coreEvent);
            concurrency.decrement();
        }
    }
}
{code}

The code 
{code:java}
public class  ConcurrencyDiscard extends EventRoute
{code}
does not compile because EventRoute is an enum,it is not supported to be 
extended




was (Author: justdebugit):
The question:https://stackoverflow.com/a/47087631/1446916 is me.
It is not related to LOG4J2-2031.
I want to custom disruptor queue full policy 
 *The code is worth a thousand words*
The belowing is my code:

*log4j2.component.properties*
log4j2.Concurrency=100
log4j2.AsyncQueueFullPolicy=com.myapp.ConcurrencyDiscardingPolicy

*com.myapp.ConcurrencyDiscardingPolicy*

{code:java}
public class ConcurrencyDiscardingPolicy extends DefaultAsyncQueueFullPolicy{
    private static final Logger LOGGER = StatusLogger.getLogger();

    private final Level thresholdLevel;
    private final Integer maxConcurrency;
    private final LongAdder discardCount = new LongAdder();
    private final LongAdder concurrency  = new LongAdder();


    static final String PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL = 
"log4j2.DiscardThreshold";

    static final String PROPERTY_NAME_CONCURRENCY_LEVEL = "log4j2.Concurrency";

    /**
     * Constructs a router that will discard events {@linkplain 
Level#isLessSpecificThan(Level) equal or less specific}
     * than the specified threshold level when the queue is full.
     *
     */
    public ConcurrencyDiscardingPolicy() {
        this.maxConcurrency = 
Objects.requireNonNull(getMaxConcurrency(),"maxConcurrency");
        this.thresholdLevel = Objects.requireNonNull(getLevel(), 
"thresholdLevel");
    }

    @Override
    public EventRoute getRoute(final long backgroundThreadId, final Level 
level) {
        if (level.isLessSpecificThan(thresholdLevel)) {
            if (concurrency.longValue() > maxConcurrency) {
                return CONCURRENCY_DISCARD_ROUTE;
            }
        }
        return super.getRoute(backgroundThreadId, level);
    }

    public static long getDiscardCount(final AsyncQueueFullPolicy router) {
        if (router instanceof ConcurrencyDiscardingPolicy) {
            return ((ConcurrencyDiscardingPolicy) 
router).discardCount.longValue();
        }
        return 0;
    }

    private Level getLevel(){
        final PropertiesUtil util = PropertiesUtil.getProperties();
        final String level = 
util.getStringProperty(PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL, 
Level.INFO.name());
        final Level thresholdLevel = Level.toLevel(level, Level.INFO);
        LOGGER.debug("Creating custom 
DiscardingAsyncQueueFullPolicy(discardThreshold:{})", thresholdLevel);
        return thresholdLevel;
    }

    private Integer getMaxConcurrency(){
        final PropertiesUtil util = PropertiesUtil.getProperties();
        final Integer maxConcurrency = 
util.getIntegerProperty(PROPERTY_NAME_CONCURRENCY_LEVEL, 10);
        LOGGER.debug("Creating custom 
DiscardingAsyncQueueFullPolicy(maxConcurrency:{})", maxConcurrency);
        return maxConcurrency;
    }

    public Level getThresholdLevel() {
        return thresholdLevel;
    }


    public class  ConcurrencyDiscard extends EventRoute {
      
       static final ConcurrencyDiscard CONCURRENCY_DISCARD_ROUTE = new 
ConcurrencyDiscard();

       
      
       private  ConcurrencyDiscard() {}

        @Override
        public void logMessage(AsyncLogger asyncLogger, String fqcn, Level 
level, Marker marker, Message message, Throwable thrown) {
            if (concurrency.longValue() > maxConcurrency){
                
EventRoute.DISCARD.logMessage(asyncLogger,fqcn,level,marker,message,thrown);
            }
            concurrency.add(1);
            
EventRoute.SYNCHRONOUS.logMessage(asyncLogger,fqcn,level,marker,message,thrown);
            concurrency.decrement();
        }

        @Override
        public void logMessage(AsyncLoggerConfig asyncLoggerConfig, LogEvent 
event) {
            if (concurrency.longValue() > maxConcurrency){
                EventRoute.DISCARD.logMessage(asyncLoggerConfig,event);
            }
            concurrency.add(1);
            EventRoute.SYNCHRONOUS.logMessage(asyncLoggerConfig,event);
            concurrency.decrement();
        }

        @Override
        public void logMessage(AsyncAppender asyncAppender, LogEvent coreEvent) 
{
            if (concurrency.longValue() > maxConcurrency){
                EventRoute.DISCARD.logMessage(asyncAppender,coreEvent);
            }
            concurrency.add(1);
            EventRoute.SYNCHRONOUS.logMessage(asyncAppender,coreEvent);
            concurrency.decrement();
        }
    }
}
{code}

The code 
{code:java}
public class  ConcurrencyDiscard extends EventRoute
{code}
does not compile because EventRoute is an enum,it is not supported to be 
extended



> org.apache.logging.log4j.core.async.EventRoute not Support Extend
> -----------------------------------------------------------------
>
>                 Key: LOG4J2-2095
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2095
>             Project: Log4j 2
>          Issue Type: Improvement
>          Components: Appenders
>    Affects Versions: 2.9.1
>            Reporter: justdebugit
>            Priority: Major
>
> org.apache.logging.log4j.core.async.EventRoute not Support Extend,YOU MUST 
> only
> use   ENQUEUE/SYNCHRONOUS/DISCARD



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to