SyslogAppender: при использовании шаблона, не начинающегося с квадратных скобок, имя хоста перезаписывается

1

Я использую 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 без упаковки первого элемента в квадратных скобках?

  • 0
    Вы нашли решение? :)
  • 0
    К сожалению у меня нет.
Показать ещё 1 комментарий
Теги:
log4j
rsyslog

1 ответ

1
Лучший ответ

Я решил посмотреть на это свежими глазами, посмотрев на источник класса 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 что вы назвали этим приложением в вашем файле свойств.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню