The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Организовать 'синхронное' дублирование лога Squid в базе P-S..., !*! Af., 10-Июн-10, 10:07  [смотреть все]
Есть желание в access_log.cc дописать дублирование лога в PostgreSQL средствами libpq.

Если просто вставить нужное в какую-либо из функций записи строк лога в файл (прямо в accessLogLog или в одну из трёх вызываемых оттуда), то эта функция записи в файл будет каждый раз ожидать окончания записи в базу. При относительно скромном опыте и знании языка С пытаюсь понять насколько оптимально поступить именно так.

Чем чревата моя добавка, как при слабой, так и при сильной разнообразной нагрузке на сервер? При том, что записи в базу для меня ценнее записей в файл.

Есть ли другие способы, лучшие по скорости и надёжности?
Как лучше организовать "синхронное" дублирование лога Squid в базе Postgesql?

P.S. Отправлять "в параллель" при открытых соединениях с базой через libpq в случае Unix не велит начало раздела номер 30.1. из мануала к Postgresql 8.4.4. ( второй абзац http://www.postgresql.org/docs/8.4/interactive/libpq-connect... ). Как понимаю в Линукс это тоже нужно учитывать. Хотя... объём знаний не позволяет для нужного осознать необходимость "форка".

  • Организовать 'синхронное' дублирование лога Squid в базе P-S..., !*! svn, 12:42 , 10-Июн-10 (1)
    Чревато. субд менее надёжное и менее предсказуемое подключение, и работать с ним сложнее чем с файлом.

    syslog-ng ?


    • Организовать 'синхронное' дублирование лога Squid в базе P-S..., !*! Af., 14:40 , 07-Июл-10 (2)
      Да, это оно. Спасибо.

      syslog-ng - для Suse "из коробки". Для Fedora - rsyslog. Инструменты примерно одинаковые. У меня Федора.

      Итак - запись лога Squid в базу Postgresql.

      Создать нужную базу. Здесь это не описываю.

      Фрагмент конфигурации squid (версия 3.1.1):

      logformat squid_2_rsyslog CuStOmMaRkEr#DBase_Table_Name#squid#%>a#%<A#%>p#3128#noname#_sql-inj_>ru#%Ss/>Hs#%<st#%<st#%{%Y-%m-%d}tl#%{%H:%M:%S}tl#%{%Y-%m-%d}tl#%{%H:%M:%S}tl#%{%Y-%m-%d %H:%M:%S}tl#%{%Y-%m-%d %H:%M:%S}tl
      access_log syslog squid_2_rsyslog


      Установка нужного модуля:


      # yum install rsyslog-pgsql

      Фрагмент конфигурации rsyslog, v3, из ASPLinux 14 (Fedora Core 9):

      $ModLoad ompgsql.so  # load the output driver for PostgreSQL

      # Template with removing of message custom marker. The result is ready to use SQL command.
      $template rsyslog_2_pgsql, "\nINSERT INTO %msg:F,35:2% VALUES( '%msg:F,35:3%', '%msg:F,35:4%', '%msg:F,35:5%', '%msg:F,35:6%', '%msg:F,35:7%', '%msg:F,35:8%', '%msg:F,35:9%', '%msg:F,35:10%', '%msg:F,35:11%', '%msg:F,35:12%', '%msg:F,35:13%', '%msg:F,35:14%', '%msg:F,35:15%', '%msg:F,35:16%', '%msg:F,35:17%', '%msg:F,35:18%' );", stdsql

      # Filter by message custom marker and log it to separate file. BTW strings in this file are ready to use SQL commands.
      if $msg contains 'CuStOmMaRkEr' then /var/log/squid-sql.log;rsyslog_2_pgsql

      # In case SQL server is down setup on-disk queue.
      # This setup only for next logging command. Each "command" must have separate block before the command.
      $WorkDirectory /var/log/squid # where to place spool files
      $ActionQueueFileName rsyslog.squid2sql_queue # unique name prefix for spool files
      $ActionQueueMaxDiskSpace 5m   # 1gb space limit (use as much as possible)
      $ActionQueueSaveOnShutdown on # save messages to disk on shutdown
      $ActionQueueType LinkedList   # run asynchronously
      $ActionResumeRetryCount -1    # infinite retries if host is down

      # Filter by custom marker inside the message and log information to RMBill data base.
      if $msg contains 'CuStOmMaRkEr' then :ompgsql:127.0.0.1,rmbill,rmbill,123;rsyslog_2_pgsql

      # And finally discard the messages, to avoid logging them to other containers.
      :msg, contains, "CuStOmMaRkEr"  ~

      Встреченные особенности:

      Интерпретация поля >Hs зависит от версии Squid. "Уголок" м.б. нужен, м.б. нет. Squid отчитается, если неправильно.

      Пока не осознал возможна ли инъекция через адрес назначения в ">Hs", потому сейчас при записи в базу подставляю _sql-inj_ вместо реального адреса. Не успел найти точного указания, что stdsql защитит.

      Не претендую на оптимальность фильтра сообщений в rsyslog. С удовольствием увижу предложения по оптимизации.

      P.S. Не обращайте внимание на выборку полей для лога. Этот набор заточен под нечто третье, в чью базу дописываются эти логи.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру