[
https://issues.apache.org/jira/browse/LOG4J2-1397?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15321679#comment-15321679
]
Remko Popma commented on LOG4J2-1397:
-------------------------------------
The byte buffer should not be used by two threads simultaneously. This is a
valid concern and needs to be addressed either in the application or in the
logging framework.
How about doing this in the application:
* Pre-allocate a set of ByteBuffers in the application
* How many to pre-allocate? I would say one for each slot in the Log4j
AsyncLogger RingBuffer. By default this is 256*1024, which may be a lot for
your purposes. Let's say you change this to 32,768. Then also pre-allocate
32,768 ByteBuffers. The AsyncLogger RingBuffer size is a power of 2. Use the
same size for your pre-allocated array to allow you have a long counter that is
incremented indefinitely and get the current slot by masking the counter by
length-1.
* How large should each pre-allocated ByteBuffer be? That depends on the size
(max size) of the messages you are processing.
When you receive a message, obtain the next ByteBuffer from the pre-allocated
set, copy the data into it and log that pre-allocated ByteBuffer.
{code}
final static int COUNT = 32768; // use same size as Async Logger RingBuffer!
final static int MASK = COUNT - 1
ByteBuffer[] preAllocated = preAllocate(COUNT);
long counter = 0;
private void onMessage(ByteBuffer msg) {
if (messageLog.isInfoEnabled()) {
ByteBuffer copy = preAllocated[MASK & (counter++)];
copy.clear();
copy.put(buffer);
buffer.rewind();
copy.flip();
// messageLog.info("Message on {}: IN {}", connection, copy); // do not log
as text
messageLog.info(copy);
}
}
{code}
> Support ByteBufferLayout
> ------------------------
>
> Key: LOG4J2-1397
> URL: https://issues.apache.org/jira/browse/LOG4J2-1397
> Project: Log4j 2
> Issue Type: New Feature
> Components: Layouts
> Affects Versions: 2.6
> Reporter: Remko Popma
>
> As requested by Kirk Pepperdine on the Mechanical Sympathy [mailing
> list|https://groups.google.com/d/msg/mechanical-sympathy/klefjRqlpQE/-1WF59IGAwAJ]:
> Support a new Layout that takes ObjectMessages containing a ByteBuffer
> payload and write them to the appender without modification.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]