// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.components;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
// TODO: Convert to java.util.logging.Formatter
public class Logger {
private File directory;
public static SimpleDateFormat makeLogFormat() {
//SimpleDateFormat is not thread safe,
// so we need to create each instance independently.
return new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z");
}
public static SimpleDateFormat makeFileNameFormat() {
//SimpleDateFormat is not thread safe, so we need to create each instance independently.
return new SimpleDateFormat("yyyyMMddHHmmss");
}
private PrintWriter writer;
private Calendar currentFileCreationDate;
public Logger(String dirPath) {
directory = new File(dirPath);
directory.mkdir();
}
public File getDirectory() {
return directory;
}
String formatLogLine(LogData data) {
StringBuilder line = new StringBuilder();
line.append(data.host).append(" - ");
line.append(data.username == null ? "-" : data.username);
line.append(" [").append(format(makeLogFormat(), data.time)).append("] ");
line.append('"').append(data.requestLine).append("\" ");
line.append(data.status).append(" ");
line.append(data.size);
return line.toString();
}
static String makeLogFileName(Calendar calendar) {
return "fitnesse" + format(makeFileNameFormat(), calendar) + ".log";
}
public void log(LogData data) {
if (needNewFile(data.time))
openNewFile(data);
writer.println(formatLogLine(data));
writer.flush();
}
private boolean needNewFile(Calendar time) {
if (writer == null)
return true;
else {
boolean different = (time.get(Calendar.DAY_OF_YEAR) != currentFileCreationDate.get(Calendar.DAY_OF_YEAR))
|| (time.get(Calendar.YEAR) != currentFileCreationDate.get(Calendar.YEAR));
return different;
}
}
private void openNewFile(LogData data) {
if (writer != null)
writer.close();
currentFileCreationDate = data.time;
String filename = makeLogFileName(data.time);
File file = new File(directory, filename);
OutputStream outputStream;
try {
outputStream = new FileOutputStream(file);
} catch (FileNotFoundException e) {
System.err.println("Unable to open log file. Falling back to stderr");
e.printStackTrace(System.err);
outputStream = System.err;
}
writer = new PrintWriter(outputStream);
}
public void close() {
if (writer != null)
writer.close();
}
private static String format(DateFormat format, Calendar calendar) {
DateFormat tmpFormat = (DateFormat) format.clone();
tmpFormat.setTimeZone(calendar.getTimeZone());
return tmpFormat.format(calendar.getTime());
}
@Override
public String toString() {
return getDirectory().getAbsolutePath();
}
}