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