2017-02-22 38 views
0

Я разрабатываю веб-приложение с Java и Jboss.Как добавить заголовок заголовка во всех исключениях журнала регистрации

Я использую регистратор java java.util.logging для регистрации сообщений.

Мне интересно, что все выходные сообщения, которые делают приложение, имеют пользовательский заголовок заголовка. Например:

[21.2.2017 13:25:28][CERT:1642 ENS:5][ERROR]: java.lang.ArithmeticException:/by zero 

Если заголовок пользовательского заголовка является: [21.2.2017 13:25:28][CERT:1642 ENS:5][ERROR]

Я был в состоянии сделать это, создавая обычай (продлить java.util.logging.Formatter).

Logger logger = null; 
StreamHandler handler = null; 
MyCustomFormatter format = null; 

logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME + "." + custom_name); 
format = new MyCustomFormatter(); 
handler = new StreamHandler(System.out, format); 
logger.addHandler(handler); 

Я могу показать заголовок в тех случаях, когда я вызываю регистратор явно. Например:

  • в коде: logger.info(msg);

  • улова исключением: logger.severe(e.printStackTrace());

Я хотел бы добавить этот заголовок во всех сообщениях, а также в ошибках или исключения сообщений что я не контролирую с помощью try/catch.

Как я могу это сделать?

EDIT 1

Мой заказ регистратор имеет родительский регистратор, и этот родитель регистратор имеет корневой регистратор.

Logger.getLogger("") 
    |------> Logger.getLogger("global") 
       |------> Logger.getLogger(Logger.GLOBAL_LOGGER_NAME + "." + custom_name) 

Я сделал тест. Я создал пользовательский PrintStream и OutputStream, чтобы избежать, что ошибки не отображаются на консоли и файл журнала, установив его на System.err:

CustomNullPrintStream pse = new CustomNullPrintStream(new CustomNullOutputStream()); 
System.setErr(pse); 
  • CustomNullPrintStream расширяет PrintStream
  • CustomNullPrintStream расширяет OutputStream

Который я переопределил все методы без кода содержимого.

Тогда, если я провоцирую исключение вроде этого:

  try { 
       throw new Exception("ERROR TEST"); 
      } catch (Exception e1) { 
       e1.printStackTrace(); 
      } 

Исключение не отображается на консоли и файл журнала. Но если я провоцирую исключение, как это без Try/улова:

  int iii = 1/0; 
      iii = iii+1; 

Исключения видно и продолжает показывать на консоли и файл журнал. Почему? В двух случаях есть исключения/ошибки.

+0

Какую версию JBoss AS, JBoss EAP или WildFly вы используете? –

+0

Привет @ JamesR.Perkins, я использую WildFly 8 (8.2.1.Final) и Java (jdk 1.8.0_121) с Eclipse IDE. – stivex

+0

Откуда появляется сообщение '[CERT: 1642 ENS: 5]'? Формат даты довольно прост с шаблоном-форматированием. Другая часть тоже может быть. –

ответ

0

Я не знаю, как инициализирован ваш регистратор, но вы можете попробовать установить форматтер на корневом регистраторе (вызовите parent() на регистраторе до null).

Другим способом является изменение самого глобального шаблона вместо его переопределения. Это можно сделать программно или через командную строку.

System.setProperty("java.util.logging.SimpleFormatter.format", <template>); 

см. Javadoc этого класса для того, как построен шаблон.

+0

Привет @mark, спасибо за ваш предложения. Я знаю, что мой пользовательский регистратор имеет родительский регистратор, а мой родительский регистратор имеет корневой родительский регистратор. Я установил свой MyCustomFormatter ко всем родительским регистраторам. Но я думаю, что это не правильный путь, но я не хочу менять формат родительских регистраторов. – stivex

+0

Затем вам нужно выяснить, какой регистратор использует ваш обработчик исключаемых исключений. –

+1

FWIW WildFly по умолчанию не использует 'java.util.logging.SimpleFormatter'. –

0

Если у вас уже есть пользовательский форматтер, лучший способ использовать ваш форматировщик - сделать его модулем в WildFly. Оттуда вы можете добавить его как custom-formatter в WildFly и назначить его обработчикам, на которых вы хотите видеть этот формат.

Вот пример команды некоторые CLI:

module add --name=com.example.formatter --resources=/path/to/formatter.jar 
/subsystem=logging/custom-formatter=my-formatter:add(class=com.example.formatter.MyCustomFormatter, module=com.example.formatter) 
/subsystem=logging/console-handler=CONSOLE:write-attribute(name=named-formatter, value=my-formatter) 

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

Следует отметить, что вы не должны изменять менеджера журналов в коде, как вы делаете. Это изменит ведение журнала для контейнера и всех развертываний в контейнере.

+0

Спасибо @James за ваше предложение. Но я думаю, что в первую очередь мне нужно добиться того, чтобы все текстовые исключения, которые у моего веб-приложения должны иметь собственный заголовок заголовка. Теперь я не могу зафиксировать исключения до того, как мое приложение напечатает на стандартной консоли/файле output/error. Я думаю, что ваше предложение было бы следующим шагом. – stivex

+0

Я не уверен, что понимаю проблему с исключениями. Не могли бы вы объяснить, что вы пытаетесь с ними сделать? –

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