Skip to content

Instantly share code, notes, and snippets.

@jvmvik
Created November 25, 2013 23:03
Show Gist options
  • Save jvmvik/7650511 to your computer and use it in GitHub Desktop.
Save jvmvik/7650511 to your computer and use it in GitHub Desktop.
Add log4j capability to append two event message on a single line in the console output. Example: log.info("hello \n"); log.info("world !"); Results: [INFO] hello world !
import org.apache.log4j.RollingFileAppender
import org.apache.log4j.helpers.CountingQuietWriter
import org.apache.log4j.spi.LoggingEvent
/**
* Interactive file appender
*
* Provide a capability to append two event message on a single line in a log file.
*
* Example:
* log.info("hello \n");
* log.info("world !");
*
* Results:
* [INFO] hello world !
*
* @author vicben01
*/
class InteractiveRollingFileAppender extends RollingFileAppender
{
public boolean immediateFlush = false
@Override
protected void subAppend(LoggingEvent event)
{
SingleLineAppenderStrategy.subAppend(event, this)
if (fileName != null && qw != null)
{
long size = ((CountingQuietWriter) qw).getCount();
if (size >= maxFileSize && size >= nextRollover)
{
rollOver();
}
}
}
}
package com.arm.pipd.scf.utils.log4j
import org.apache.log4j.AppenderSkeleton
import org.apache.log4j.Layout
import org.apache.log4j.WriterAppender
import org.apache.log4j.spi.LoggingEvent
/**
* SingeLineAppender strategy.
*
* Enables to append two event message on a single line in a log file.
*
* @author vicben01
*/
class SingleLineAppenderStrategy
{
static void subAppend(LoggingEvent event, WriterAppender writerAppender)
{
// Write message
writerAppender.qw.write(text(event, writerAppender));
if (writerAppender.layout.ignoresThrowable())
{
String[] s = event.getThrowableStrRep();
if (s != null)
{
int len = s.length;
for (int i = 0; i < len; i++)
{
writerAppender.qw.write(s[i]);
writerAppender.qw.write(Layout.LINE_SEP);
}
}
}
if (writerAppender.shouldFlush(event))
{
writerAppender.qw.flush();
}
}
static String text(LoggingEvent event, AppenderSkeleton appenderSkeleton)
{
if(!(event.message instanceof String))
return "";
// Dirty text formatting
String text
if(event?.message
&& (((String) event.message).startsWith('done')
|| ((String) event.message).startsWith('fail')
|| ((String) event.message).startsWith('using')))
{
text = event.message + '\n'
}
else
text = appenderSkeleton.layout.format(event)
// Remove line separator if line is not finished
if(!endOfLine(event))
text = text.substring(0, text.length() - 4)
return text
}
/**
* Detect if event.message end with /n
* and remove /n if placed at the end
*
* @param event send by logger
* @return true if message does not end with \n
*/
static boolean endOfLine(LoggingEvent event)
{
String msg = (String) event.message
if (msg.endsWith('/n'))
return false
return true
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment