2013-04-08 3 views
8

В настоящее время я работаю над программой, в которой я должен записать весь вывод в файл журнала.Регистрация с несколькими параметрами

Мне нужно написать метод журнала, который должен давать результат с уровнем, сообщением, значением объекта, другим сообщением, целочисленным значением, другим сообщением и другим целочисленным значением в том же порядке, который я указал , Кажется, я не могу найти метод журнала, который делает это. Я использую Java.util.logging. Это возможно?

+0

Рассмотрим Log4J HTTP://logging.apache.org/log4j/2.x/ – Mirco

+1

@ verbose-mode Почему? java util logging делает все, что требуется и является более простым в использовании. Насколько я понимаю, ваше предложение нарушает принцип KISS (Keep the Simple S ...). – Martin

ответ

13

Я полагаю, вам нужен формат журнала в формате ниже FINE, Сообщение1 object.GetValue(), Message2,1, Message3,2

Вы должны создать формат вывода сообщений

logger.log(Level.INFO, "{0},{1},{2},{3},{4},{5}",new Object[]{Message1,object.getValue(),Message2,1,Message3,2}); 

Теперь вам нужно создать пользовательский форматировщик, который за счет расширения класс Formatter

public class DataFormatter extends Formatter { 

@Override 
public synchronized String format(LogRecord record) { 
    String formattedMessage = formatMessage(record); 
    String throwable = ""; 
    String outputFormat = "%1$s, %2$s \n %3$s"; //Also adding for logging exceptions 
    if (record.getThrown() != null) { 
     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw); 
     pw.println(); 
     record.getThrown().printStackTrace(pw); 
     pw.close(); 
     throwable = sw.toString(); 
    } 
    return String.format(outputFormat,record.getLevel().getName(),formattedMessage,throwable); 
} 
} 

Теперь установите вновь созданный форматировщик

for(int i=0;i<logger.getHandlers().length;i++) 
     logger.getHandlers()[i].setFormatter(new DataFormatter()); 
9

Это очень старая тема, во всяком случае, мои два цента, потому что я также предпочитаю использовать java.util.logging.Logger` в моих проектах, где достаточно.

Lambdas делает этот шаблонный расширитель Formatter для нескольких пользовательских параметров более или менее устаревшим, если только вы не пользуетесь его повторным использованием в масштабе всего приложения. В (my) простых сценариях сообщения журнала настраиваются на часть кода, где она вставлена, поэтому String.format() обычно намного проще и гибче.

Перед тем, как Java 8 и lambdas, Formatter была единственной возможностью отложить построение сообщения. Единственной альтернативой было, чтобы построить сообщение для входа в систему до того, как произошла проверка на основании уровня loggable.
С Java 8 lambdas форматирование строк может быть отложено после проверки loggable, но все же с доступом к исходному контексту метода. Единственным недостатком является то, что все доступные поля должны быть окончательными из-за ограничений лямбда.

Здесь довольно простой фрагмент:

final String val1 = "lambda expression log message"; 
final Level level = Level.INFO; 
Logger.getGlobal().log(level,() -> 
     String.format("Hello, I'm a %s, evaluated after %s loggable check.", val1, level) 
); 
Logger.getGlobal().log(level, new RuntimeException(),() -> 
     String.format("Hello, I'm a %s with a stack trace, evaluated after %s loggable check.", val1, level) 
); 

Надеется, что это помогает некоторым из вас, кто также хочет использовать встроенную в лесозаготовительной :-)

Приветствие Бен

Смежные вопросы