[logback-user] Logging encoded google protocol buffers with logback rolling file appender
DaveJohnston
dave.johnston at me.com
Fri Aug 24 17:29:56 CEST 2012
I ended up creating a very simple encoder based on the LayoutWrappingEncoder
(although without the Layout)
I then replaced the PatternEncoder that I had used with my logger with this
ProtocolBuffer.
When I call myLogger.info("", MyProtocolBufferObj);
It logs the MyProtocolBufferObj in its serialized form. Just what I wanted,
cheers.
public class ProtocolBufferEncoder extends EncoderBase<ILoggingEvent> {
public void doEncode(ILoggingEvent event) throws IOException {
// Get the data
//
Object[] data = event.getArgumentArray();
// We should only have one argument, which is the
// protocol buffer - I'm sure there maybe better
// ways to do this - I think the ILoggingEvent is unique
// to logback - so not sure how this plays with slf4j
//
//
if (data.length == 1) {
// If the data is a Message
//
if (data[0] instanceof Message) {
Message message = (Message) data[0];
// Create and write a 4 byte header indicating the size of
// the message
//
byte[] header = getMessageHeader(message.getSerializedSize());
outputStream.write(header);
// Write the message and flush if immediate flush is on
//
outputStream.write(message.toByteArray());
if (isImmediateFlush()) {
outputStream.flush();
}
}
}
}
}
}
DaveJohnston wrote:
>
> Hi Chris,
>
> Not yet - I was hoping there was an off-the-shelf solution that would just
> allow me to pass through a byte[]? Maybe log.info("{}", byte[]) would
> work fine with this ? I thought the second argument was getting cast to a
> string, but maybe not.
>
> If not it looks like writing my own encoder is the way to go. I'll take a
> peak at the interface and see what I can put together.
>
>
> Ceki Gulcu wrote:
>>
>>
>> Hi Dave,
>>
>> A logback encoder is fundamentally binary beast. It writes to an
>> OutputStream. Have you considered rolling your own Encoder to deal with
>> protobuf data?
>>
>>
>> On 24.08.2012 12:30, DaveJohnston wrote:
>>>
>>> Thanks Chris,
>>>
>>> That looks like it might work what additional overhead does Anodyzed
>>> Onyx
>>> add to the log call? My system is processing quite a high volume of
>>> traffic, so I wan't to avoid any performance costs.
>>>
>>> In my case I don't need to mix readable text with the binary data - my
>>> output file should just be purely binary, so maybe there is a simpler
>>> solution ?
>>>
>>>
>>> Chris Pratt wrote:
>>>>
>>>> With the Anodyzed Onyx (http://code.google.com/p/anodyzed) wrapper
>>>> around
>>>> Logback you can use log.debug("Google Protocol
>>>> Buffer\n{0,binary,dump}",myBuffer); to write a Hex Dump style entry in
>>>> the
>>>> logs.
>>>> (*Chris*)
>>>>
>>>> On Thu, Aug 23, 2012 at 4:25 AM, Dave Johnston <dave.johnston at me.com>
>>>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I'd like to log google protocol buffers received by my server to a
>>>>> file,
>>>>> for later offline processing (the data is in a byte[]). This is
>>>>> something
>>>>> I only do in when a debug mode is enabled, but it is useful for
>>>>> diagnostics.
>>>>>
>>>>> Ideally I'd like to use logback, but it doesn't seem to cater for
>>>>> binary
>>>>> data.
>>>>>
>>>>> I saw this issue: http://jira.qos.ch/browse/LOGBACK-232 which is
>>>>> marked
>>>>> as fix, and is a request for the same thing. But I can't figure out
>>>>> how
>>>>> to
>>>>> use this with a normal rolling file appender.
>>>>>
>>>>> Does anyone have any examples of doing this?
>>>>>
>>>>> Cheers
>>>>>
>>>
>>
>>
>> --
>> Ceki
>> http://tinyurl.com/proLogback
>> _______________________________________________
>> Logback-user mailing list
>> Logback-user at qos.ch
>> http://mailman.qos.ch/mailman/listinfo/logback-user
>>
>>
>
>
--
View this message in context: http://old.nabble.com/Logging-encoded-google-protocol-buffers-with-logback-rolling-file-appender-tp34338947p34344772.html
Sent from the Logback User mailing list archive at Nabble.com.
More information about the Logback-user
mailing list