Мы разрабатываем веб-приложение, и я реализую регистрацию событий на стороне сервера. Я решил, что хорошим подходом будет расширение API ведения журналов Java для регистрации событий в файле CSV. Я создал класс java.util.logging.Formatter
следующим образом:
public class EventLogCsvFormatter extends Formatter {
private static final SimpleDateFormat SDF = new SimpleDateFormat("MM/dd/yyyy h:mm a");
private static final String[] COL_HEADERS = {"Date/Time", "Source", "Event Type", "Application Context", "Description", "Fields"};
public EventLogCsvFormatter() {
}
@Override
public String getHead(Handler h) {
return String.join(",", COL_HEADERS);
}
@Override
public String format(LogRecord record) {
if (record instanceof EventLogRecord) {
EventLogRecord customLogRecord = (EventLogRecord) record;
String[] fields = customLogRecord.getFields();
List<String> textList = new ArrayList<>();
textList.add(SDF.format(new Date(record.getMillis())));
textList.add(customLogRecord.getSource() != null ? customLogRecord.getSource() : "Not Given");
textList.add(customLogRecord.getEventType() != null ? customLogRecord.getEventType().toString() : "Not Given");
textList.add(customLogRecord.getEventContext() != null ? customLogRecord.getEventContext().toString() : "Not Given");
textList.add(customLogRecord.getMessage());
if (fields != null && fields.length > 0) {
for (String field : fields) {
textList.add(field);
}
}
String retVal = "\n" + String.join(",", textList);
return retVal;
}
return "";
}
}
Идея реализации метода getHead() заключается в предоставлении заголовков столбцов для каждого CSV-файла. Обратите внимание, что XMLFormatter собственного языка Java делает нечто подобное, возвращая строку заголовка XML-файла в методе getHead()
. Как оказалось, ведение журнала Java не учитывает флаг добавления при вызове getHead(). Флаг добавления в основном говорит регистратору повторно открыть существующий файл и продолжить запись в него при запуске. Поскольку наш тестовый сервер довольно часто отскакивает, большинство сгенерированных CSV-файлов имеют имена заголовков столбцов в нескольких местах внутри файлов, а не только вверху.
Я не думаю, что есть какой-то способ обойти это, поскольку почти весь код обработчика ведения журнала Java имеет частные поля или методы области действия пакета. Итак, я даже не могу написать свой собственный обработчик для работы здесь. Это ошибка и я SOL? Должен ли я просто использовать другой API ведения журналов (например, Log4J)?