Я использую log4j и класс SyslogAppender для отправки сообщений в rsyslog, запущенных на локальной машине Linux (называемой orion). В настоящее время у меня есть следующий шаблон:
log4j.appender.SYSLOG_LOCAL1.layout.conversionPattern=[%p] %m%n
Что производит этот вывод:
Jun 5 16:16:09 orion [ERROR]: <My message here>
Это не показывает источник сообщения, поэтому я хотел добавить это, но, к сожалению, когда я добавляю что-либо перед квадратными скобками, имя хоста исчезает. например.
log4j.appender.SYSLOG_LOCAL1.layout.conversionPattern=TEST [%p] %m%n
Jun 5 16:22:41 TEST [ERROR]: <My message here>
Это не просто буквальный текст, который вызывает эту проблему. Например, если я использую шаблон образца из документации, "% -5p [% t]:% m% n", имя хоста также отсутствует:
log4j.appender.SYSLOG_LOCAL1.layout.conversionPattern=%-5p [%t]: %m%n
Jun 5 16:25:34 ERROR [main]: <My message here>
Вот простейший пример, который я могу придумать, чтобы продемонстрировать проблему, используя шаблоны aaa
и [aaa]
:
log4j.appender.SYSLOG_LOCAL1.layout.conversionPattern=aaa
Jun 5 17:47:29 aaa
log4j.appender.SYSLOG_LOCAL1.layout.conversionPattern=[aaa]
Jun 5 17:48:24 orion [aaa]:
Документация не показывает, что квадратные скобки имеют какое-то особое значение, поэтому я не понимаю, почему это происходит. Я также не понимаю, вызвана ли эта проблема классом SyslogAppender или rsyslog.
Как сохранить имя хоста в сообщении syslog без упаковки первого элемента в квадратных скобках?
Я решил посмотреть на это свежими глазами, посмотрев на источник класса SyslogAppender.
Этот подкласс имеет дополнительное поле, называемое header
:
105 /**
106 * If true, the appender will generate the HEADER (timestamp and host name)
107 * part of the syslog packet.
108 * @since 1.2.15
109 */
110 private boolean header = false;
Установка этого значения в значение true позволяет отобразить имя хоста.
log4j.appender.SYSLOG_LOCAL1.layout.conversionPattern=TEST [%p] %m%n
May 9 16:50:14 orion TEST [ERROR] <my message here>
Документация для setHeader()
(путано смешана с документацией для getHeader()
) содержит дополнительную информацию о значении по умолчанию.
460 /**
461 * If true, the appender will generate the HEADER part (that is, timestamp and host name)
462 * of the syslog packet. Default value is false for compatibility with existing behavior,
463 * however should be true unless there is a specific justification.
464 * @since 1.2.15
465 */
466 public final boolean getHeader() {
467 return header;
468 }
469
470 /**
471 * Returns whether the appender produces the HEADER part (that is, timestamp and host name)
472 * of the syslog packet.
473 * @since 1.2.15
474 */
475 public final void setHeader(final boolean val) {
476 header = val;
477 }
Значение header
может быть установлено в Java-коде, вызвав setHeader(true)
или добавив следующую строку в log4j.properties:
log4j.appender.SYSLOG_LOCAL1.header=true
Замените SYSLOG_LOCAL1
что вы назвали этим приложением в вашем файле свойств.