package org.primftpd.log;
import java.io.PrintStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.helpers.MarkerIgnoringBase;
import org.slf4j.helpers.MessageFormatter;
public class CsvLogger extends MarkerIgnoringBase
{
private static final long serialVersionUID = 3245106428450758061L;
private static final int MAX_MSG_LEN = 100;
private static final DateFormat DATE_FORMAT =
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.S", Locale.GERMAN);
private final String name;
private final PrintStream file;
public CsvLogger(String name, PrintStream file) {
this.name = name;
this.file = file;
}
private void writeLine(LogLevel logLevel, String msg) {
writeLine(logLevel, msg, null);
}
private void writeLine(LogLevel logLevel, String msg, Throwable t) {
StringBuilder sb = new StringBuilder();
sb.append("\"");
sb.append(DATE_FORMAT.format(new Date()));
sb.append("\"");
sb.append(";");
sb.append("\"");
sb.append(logLevel);
sb.append("\"");
sb.append(";");
sb.append("\"");
sb.append(name);
sb.append("\"");
sb.append(";");
sb.append("\"");
if (msg.length() > MAX_MSG_LEN) {
sb.append(msg, 0, MAX_MSG_LEN - 3);
sb.append("...");
} else {
sb.append(msg);
}
sb.append("\"");
sb.append(";");
sb.append("\"");
if (t != null) {
printThrowable(sb, t);
}
sb.append("\"");
sb.append(";");
file.println(sb.toString());
}
private void printThrowable(StringBuilder sb, Throwable t) {
sb.append(t.getClass().getName());
sb.append(": ");
sb.append(t.getMessage());
StackTraceElement[] stackTrace = t.getStackTrace();
for (StackTraceElement elem : stackTrace) {
sb.append("\n\t");
sb.append(elem.getClassName());
sb.append(".");
sb.append(elem.getMethodName());
sb.append("() line: ");
sb.append(elem.getLineNumber());
}
Throwable cause = t.getCause();
if (cause != null) {
sb.append("\n");
sb.append("Caused by:");
sb.append(" ");
printThrowable(sb, cause);
}
}
@Override
public boolean isTraceEnabled()
{
return true;
}
@Override
public void trace(String msg)
{
writeLine(LogLevel.TRACE, msg);
}
@Override
public void trace(String format, Object arg)
{
trace(format(format, arg, null));
}
@Override
public void trace(String format, Object arg1, Object arg2)
{
trace(format(format, arg1, arg2));
}
@Override
public void trace(String format, Object[] argArray)
{
trace(format(format, argArray));
}
@Override
public void trace(String msg, Throwable t)
{
writeLine(LogLevel.TRACE, msg, t);
}
@Override
public boolean isDebugEnabled()
{
return true;
}
@Override
public void debug(String msg)
{
writeLine(LogLevel.DEBUG, msg);
}
@Override
public void debug(String format, Object arg)
{
debug(format(format, arg, null));
}
@Override
public void debug(String format, Object arg1, Object arg2)
{
debug(format(format, arg1, arg2));
}
@Override
public void debug(String format, Object[] argArray)
{
debug(format(format, argArray));
}
@Override
public void debug(String msg, Throwable t)
{
writeLine(LogLevel.DEBUG, msg, t);
}
@Override
public boolean isInfoEnabled()
{
return true;
}
@Override
public void info(String msg)
{
writeLine(LogLevel.INFO, msg);
}
@Override
public void info(String format, Object arg)
{
info(format(format, arg, null));
}
@Override
public void info(String format, Object arg1, Object arg2)
{
info(format(format, arg1, arg2));
}
@Override
public void info(String format, Object[] argArray)
{
info(format(format, argArray));
}
@Override
public void info(String msg, Throwable t)
{
writeLine(LogLevel.INFO, msg, t);
}
@Override
public boolean isWarnEnabled()
{
return true;
}
@Override
public void warn(String msg)
{
writeLine(LogLevel.WARN, msg);
}
@Override
public void warn(String format, Object arg)
{
warn(format(format, arg, null));
}
@Override
public void warn(String format, Object[] argArray)
{
warn(format(format, argArray));
}
@Override
public void warn(String format, Object arg1, Object arg2)
{
warn(format(format, arg1, arg2));
}
@Override
public void warn(String msg, Throwable t)
{
writeLine(LogLevel.WARN, msg, t);
}
@Override
public boolean isErrorEnabled()
{
return true;
}
@Override
public void error(String msg)
{
writeLine(LogLevel.ERROR, msg);
}
@Override
public void error(String format, Object arg)
{
error(format(format, arg, null));
}
@Override
public void error(String format, Object arg1, Object arg2)
{
error(format(format, arg1, arg2));
}
@Override
public void error(String format, Object[] argArray)
{
error(format(format, argArray));
}
@Override
public void error(String msg, Throwable t)
{
writeLine(LogLevel.ERROR, msg, t);
}
private String format(final String format, final Object arg1, final Object arg2)
{
return MessageFormatter.format(format, arg1, arg2).getMessage();
}
private String format(final String format, final Object[] args)
{
return MessageFormatter.arrayFormat(format, args).getMessage();
}
private static enum LogLevel {
TRACE,
DEBUG,
INFO,
WARN,
ERROR
}
}