Поиск в файле iptables.log занимает много времени

Поиск в файле iptables.log занимает много времени

Я использовал iptables для сохранения информации о соединениях, изменив /etc/syslog.confфайл для сохранения информации в формате /var/log/iptables.log.

Итак, каждые X часов мне нужно извлекать информацию из файла журнала. Но проблема в том, что файл будет больше, а поиск будет медленнее. Поэтому я использовал:

sed -i '/string/d' iptables.log

Чтобы удалить то, что мне больше не нужно. Но когда я использую эту команду, iptables перестает сохранять данные в файле iptables.log.

Так в чем проблема? Как мне решить эту проблему?

решение1

попробуйте, может быть,

cat iptables.log | sed -n "/PatternYouLookat/ p"

чтобы не заблокировать файл во время sed

на больших файлах sed работает плохо, поэтому попробуйте сначала выполнить grep файла или (что я и делаю) сохранить маркер/индекс, чтобы вы могли начать с него и обработать только конец файла (даже с временной копией, если обработка интенсивная).

Вы можете использовать sed -u для работы в качестве потока и избежать проблем с буфером в больших файлах.

решение2

Я полагаю, вы используете syslog. И я предполагаю, что редактирование на месте sed фактически создает новый файл и удаляет старый.

Syslog очень хрупкий, если вы ротируете/пересоздаете файлы журнала, не уведомляя его. То, что вы видите, это именно то, что происходит: syslog ничего не записывает в файл, хотя он существует. Это потому, что syslog все еще имеет старый дескриптор файла и пишет в старый файл (хотя вы больше не можете его увидеть с помощью ls и т. д.). Как только syslog закрывает этот дескриптор файла, данные исчезают в нирване.

Я бы рекомендовал использовать logrotate вместо devnull. Если вы не хотите, то выполните syslog reload или restart после вызова sed. Надеюсь, это должно сработать.

решение3

Используйте logrotate. Обычно вы делаете ротацию каждую ночь или каждую неделю, но вы можете изменить это на то, что вам нужно. Единственная загвоздка в том, что это может означать, что iptables нужно перезапустить после ротации, что обрабатывается logrotate. Я не знаю, нужно ли это, и является ли это (или частота) проблемой для вас или вашего приложения.

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

  • Допустим, у вас есть файл журнала access.log.
  • Logrotate обычно переименовывает его в access.log-20140729.
  • Вместо даты можно использовать число: access.log.1.
  • Вы можете запустить другой cronscript, который изменяет данные access.log.1с помощью sed.
  • При следующем повороте этот файл переименовывается в access.log.2, со всеми вашими изменениями.
  • Последний access.logпереименовывается в access.log.1, и его можно изменить с помощью sed.
  • access.logСоздаётся новый и т.д. и т.п.

Связанный контент