syslog-ng - передача FILENAME от клиента к серверу при использовании wildcard_file - PullRequest
0 голосов
/ 03 августа 2020

Я использую syslog-ng для удаленного протоколирования журналов приложений нескольких контейнеров одного и того же изображения. Я использую исходную конфигурацию, как показано ниже.

source s_wild { wildcard-file(
    base-dir("/var/myapp/logs")
    filename-pattern("*")
    recursive(no)
    flags(no-parse)
    follow-freq(1)
); };

Когда я использую ведение журнала на локальном компьютере (в целях тестирования), используя МАКРОС, $ {FILE_NAME}, он работает. Но имя файла не передается по сети при тестировании с удаленным сервером.

Aug  3 19:39:46 46fc878e92cf syslog-ng[2320]: Error opening file for writing; filename='', error='Is a directory (21)'

Есть около 20-25 файлов, и я ищу автоматическое сопоставление имен файлов как на стороне клиента, так и на стороне сервера. Является ли это возможным. Не уверен, как wildcard_file сопоставляется с удаленным сервером. Логически это может быть невозможно. Все еще не могу найти решение.

Мне интересно, могу ли я избежать ручного сопоставления 1-1, указав несколько источников и пунктов назначения или используя log_prefix.

1 Ответ

0 голосов
/ 05 августа 2020

Макрос $FILE_NAME работает только в том случае, если syslog-ng получает сообщения из файла или источника файла с подстановочными знаками, и он не работает с network(). Вот несколько вариантов передачи имен файлов по сети:

  1. Использование раздела структурированных данных RF C 5424 сообщения системного журнала
  2. Используйте template () с json -parser () , чтобы отправлять сообщения со стороны клиента и анализировать их на стороне сервера
  3. Используйте ewmm ( ) (общеорганизационная модель сообщений), которая поддерживает доставку структурированных сообщений

В первом методе отправка сообщений в формате RFC5424 (IETF-syslog) позволяет вам установить FILE_NAME в поле SDATA . Используйте syslog() на стороне источника и получателя вместо network() для отправки сообщений с использованием протокола системного журнала IETF. Подстановочный знак исходного файла может быть определен как это . Вся конфигурация будет выглядеть примерно так:

клиентская сторона syslog-ng
source s_wild {
        wildcard-file(
                base-dir("/var/log_syslog")
                filename-pattern("*")
                recursive(no)
                follow-freq(1)
                );

};

rewrite r_set_filename{
    set(
        "$FILE_NAME",
         value(".SDATA.file@18372.4.name")
        );
};

rewrite r_use_basename {
  subst(
        "/var/log_syslog/",
        "",
        value(".SDATA.file@18372.4.name")
        type("string")
        flags("prefix")
       );
};

destination d_container_logs {
        syslog(
              "192.168.10.48"
               transport("tcp")
               port(5141)
        );
};

log {source(s_wild); rewrite(r_set_filename); rewrite(r_use_basename); destination(d_container_logs);};

r_set_filename получает абсолютный путь к файлу, мы отрезаем бит пути и сохраняем только имя файла с использованием r_use_basename

syslog-ng на стороне сервера
source s_network {
        syslog(
        transport("tcp")
        port(5141)
        keep_hostname(yes)
        );
};


destination d_container_logs {
    file(
        "/var/sys_log/${.SDATA.file@18372.4.name}"
        create_dirs(yes)
        );
};

log {source(s_network); destination(d_container_logs);};
...