LINUX.ORG.RU
ФорумAdmin

анализ логов почты.


0

1

Подскажите пожалуста прав ли я.
Задача такая, надо проанализировать работу почтового ящика пользователя.
Не уверен на все сто!

даная штука : cat /var/log/mail.log | grep name_email@ | grep Mar\ \ 5 | wc -l
Покажет общее количество отправленной и полученной почты?

данная: cat /var/log/mail.log | grep to=\<name_email@ | grep Mar\ \ 5 | wc -l
Количество полученной почты?

cat /var/log/mail.log | grep from=\<name_email@ | grep Mar\ \ 5 | wc -l
Количество отправленной почты?

Если я прав, то почему у меня не сходится сума с первым вариантом? Если нет, то подскажите, как правильно.


macik

Если я прав, то почему у меня не сходится сума с первым вариантом? Если нет, то подскажите, как правильно.

1. \< значит вообще-то «левая граница слова»
2. адрес вовсе не обязательно присутствует только в to строгое или только в from. Он может присутствовать например в сообщении об ошибке.

drBatty ★★
()
Ответ на: комментарий от drBatty

1. < надо экранировать.
2. значит правильно делать выборку по to и from и это будет общее количество писем?

macik
() автор топика

Общий ответ: вместо wc -l нужно написать less и посмотреть, что же там на самом деле выдаётся ;) Лишний вывод можно фильтровать тем же grep -v

router ★★★★★
()

что у меня получилось.

Что я выяснил. Поправьте если я в чем-то заблуждаюсь.

Системы внутри отправляет одно письмо по разным службам.
Postfix->антивирус->dovecot
Все это движение отмечается, как отправка и прием писем. По этой причине получается что статистика дублирует данные.

Данный полученные и отправленные:
a) cat /var/log/mail.log.1 | grep Mar\ \ 2 | grep =\<macik@ | wc -l = 125 шт.

Данные вариант покажет количество откланеных писем (reject):
b) cat /var/log/mail.log.1 | grep Mar\ \ 2 | grep =\<macik@ | grep reject | wc -l = 35 шт.

Данный вариант показывает письма попавшие в почтовый ящик:
v) cat /var/log/mail.log.1 | grep Mar\ \ 2 | grep to=\<macik@ | grep -v reject | wc -l = 74 шт.

Данный вариант показывает количество отправленых писем:
d) cat /var/log/mail.log.1 | grep Mar\ \ 2 | grep from=\<macik@ | grep -v reject | wc -l = 16 шт.

Судя по сему, B+V+D=A что и должно означать правильную выборку?
Как в этом случай исключить двойного подсчета одного письма?
Есть подозрение что отправка письма не дублирует в отчетах и число 16 реальное.
А вот прием дублирует.
Правильно ли будет такая выборка?:
cat /var/log/mail.log.1 | grep Mar\ \ 2 | grep =\<macik@ | grep relay=dovecot | wc -l = 26 шт.
Она показывает отправку письма на dovecot, и происходит это, вроде, один раз.

Теперь осталось проанализировать сколько писем попали в СПАМ. Это можно сделать только проанализировав логи dovecot? Антивирус делает пометку в заголовке письма, а dovecot с модулем sieve сортирует в папку СПАМ.
У меня получилось вот так:
cat dovecot_info_log_path.log | grep macik@ | grep 2012-03-02 | grep deliver | grep \'INBOX.\&BCEEPwQwBDw | wc -l = 7 шт.

PS
Подскажите если проще и правильнее способ для анализа?

macik
() автор топика
Ответ на: что у меня получилось. от macik

macik

Вы что издеваетесь?

macik

a) cat /var/log/mail.log.1 | grep Mar\ \ 2 | grep =\<macik@ | wc -l = 125 шт.

это вы совсем обленились. Вам сложно 125 строк просмотреть что-ли?! Вы этой только теме сколько написали уже?

drBatty ★★
()
Ответ на: комментарий от macik

macik

1. < надо экранировать.

не нужно. Это глюк grep.

кстати:

04.03.12 20:17
Вышла новая версия популярной утилиты для организации поиска данных в текстовых файлах - GNU Grep 2.11.

Устранены проблемы с интерпретацией альтернативных меток (^, $, \< \> \B, \b), например, для строки «x a» команда grep -E "(^|\B)a" теперь не выявит совпадений.

может с этим проблемы?

drBatty ★★
()
Ответ на: комментарий от drBatty

Естествено не сложно. Я конешно же смотрю данные, еслибы я не сомтрел я бы не сделал данных выводов.

macik
() автор топика
Ответ на: комментарий от drBatty

Да, у меня версия grep 2.5.4 . А как ее до 2,11 довести я пока не знаю.

macik
() автор топика
Ответ на: комментарий от drBatty

Вы правы, можно уменьшить до cat /var/log/dovecot_info_log_path.log | grep macik@ | grep 2012-03-02 | grep \&BCEEPwQwBDw | wc -l

Подскажите как в bash вот это записать, у меня проблема с экранированием пробелов.

#!/bin/bash
#
MONT=`date '+%h %e'`
TIME=`date '+%Y-%m-%d'`
i=«macik»
A=`cat /var/log/mail.log | grep $MONT | grep =\<$i@ | grep relay=dovecot | wc -l`
B=`cat /var/log/mail.log | grep $MONT | grep =\<$i@ | grep reject | wc -l`
D=`cat /var/log/mail.log | grep $MONT | grep from=\<$i@ | grep -v reject | wc -l`
V=`cat /var/log/dovecot_info_log_path.log | grep $i@ | grep $TIME | grep \&BCEEPwQwBDw | wc -l`
echo -ne $i $TIME ALL=$A reject=$B SEND=$D SPAM=$V \\n >> /home/maciborka/log.log

macik
() автор топика
Ответ на: комментарий от anonymous

если я сейчас еще и regex суда засуну, я запутаюсь в конец. Пока мне хватит и ручной работы.
А уже потом можно и regex всовывать.

macik
() автор топика
Ответ на: комментарий от macik

macik

Вы правы, можно уменьшить до cat /var/log/dovecot_info_log_path.log | grep macik@ | grep 2012-03-02 | grep \&BCEEPwQwBDw | wc -l

facepalm.jpg

grep 'macik@.*2012-03-02.*&BCEEPwQwBDw' /var/log/dovecot_info_log_path.log

macik

\<

НЕ НАДО это экранировать.

macik

у меня проблема с экранированием пробелов.

заключите regex в 'одиночные кавычки'.

macik

если я сейчас еще и regex суда засуну, я запутаюсь в конец. Пока мне хватит и ручной работы.
А уже потом можно и regex всовывать.

вы УЖЕ всунули, только ректально.

drBatty ★★
()
Ответ на: комментарий от macik

macik

Так не работает?

вы МЕНЯ спрашиваете? Откуда мне знать, что вы там добиваетесь? Составьте нормальный regex, и фильтруйте. Создавать полдюжины кривых не нужно, хотя вам это якобы «проще».

drBatty ★★
()
Ответ на: комментарий от drBatty

Ну вы мне написали, так понял, что
grep 'macik@.*2012-03-02.*&BCEEPwQwBDw' /var/log/dovecot_info_log_path.log
это тоже самое, что
cat /var/log/dovecot_info_log_path.log | grep macik@ | grep 2012-03-02 | grep \&BCEEPwQwBDw

Выдача разная. Вот я и написал, что не работает. Но ваш вариант я понял. Буду знать как можно ...

macik
() автор топика

Специально для таких случаев почтовые серверы присваивают каждому письму уникальный идентификатор. И отслеживание того, что с письмом происходит идёт уже по нему. Например, написал я письмо и отправил. smpt-сервер принял его, присвоил id и поставил в очередь отправки. Попытался отправить, но удалённый сервер отшил его, например, с сообщением повторить попытку через пять минут. Наш сервер снова ставит письмо в очередь, ждёт пять минут и потом повторно отправляет. Удалённый сервер письмо принял. Всё, очередь очищается, больше по этому id ничего не встречается в логах. при этом во время всех этих операций упоминания почтовых ящиков to и from могут встречаться неоднократно, в зависимости от сервера и настроек его логов. Поэтому результаты и расходятся. Нужно сперва получать id письма, а потом уже по нему смотреть, что с ним происходит(отправлено, отшито, в очереди и т.д.).

shell-script ★★★★★
()
Ответ на: комментарий от macik

macik

Ну вы мне написали, так понял, что
grep 'macik@.*2012-03-02.*&BCEEPwQwBDw' /var/log/dovecot_info_log_path.log
это тоже самое, что

я НЕ писал, что это тоже самое. Пользуясь даром телепатии, я увидел в ацтрале, что вам именно это и нужно.

macik

Выдача разная.

и что? а ЧТО ВАМ НУЖНО то? Именно одинаковую выдачу, или вы преследуете какую-то иную цель? Меня можете не проверять, я не первый год знаю, что это не эквивалентные конструкции.

macik

Вот я и написал, что не работает.

а ваш вариант выходит идеальный, и фильтрует только то, что вам надо? Откуда ж мне знать, что ВАМ надо?

macik

Буду знать как можно ...

так нужно. Вообще, условие должно быть как можно более жёстким.

drBatty ★★
()
Ответ на: комментарий от drBatty

Спасибо за помощь.
С вашим направлением к такой-то man и т. д. ;) Вот что у меня получилось.
Задача, выдать в цифрах данные о отправке, получении, спаме и отклоненной почты за предыдущий час.
#!/bin/bash
#
H=`date '+%H'`
let «H = $H-1»
MONT=`date '+%h'`
TIME=`date '+%Y-%m-%d'`
LOG=«/var/log/mail.log»
# Всего получено
A=`grep «$MONT.*$H:.*=<$i.*relay=dovecot» $LOG | wc -l`
# Откланеные
B=`grep «$MONT.*$H:.*reject.*=<$i@» $LOG | wc -l`
# Отправлене
D=`grep «$MONT.*$H:.*from=<$i@» $LOG | grep -v reject | wc -l`
# Спам
V=`grep «$TIME.*$H:.*$i@.*\&BCEEPwQwBDw» /var/log/dovecot_info_log_path.log | wc -l`
#полученные данные можно кидать в базу или файл

PS
Сейчас я включил накопление данных по cron, и будем проверять на сколько они реальны. Одно плохо скрипт выполняется около 7, 8 минут, хотя ящиков у меня не так много, около 170 штук ....
Судя по данным от mailgraph то всего писем в сутки получено до 3 000х 4 000х тысяч. И отклоненных до 40 000х .

macik
() автор топика
Ответ на: комментарий от shell-script

я знаю об этом. Это мне в даном случаи не нужно. Нету смысла отлеживать каждое письмо в данной задаче.

macik
() автор топика
Ответ на: комментарий от macik

очевидная оптимизация - запоминать последнюю строку, и читать с неё а не с нуля.

Это по любому надо сделать, ибо за 7..8 минут приходит много писем, которые скрипт сначала не обрабатывает, а потом обрабатывает.

drBatty ★★
()
Ответ на: комментарий от drBatty

понял. Буду чинить.

Актуальность не нарушается, проверка начинается, например с 10:01 и проверяет движение с 9;00 до 10:00

macik
() автор топика

велосипедненько. а посомтреть чо люди дотебя уже наделали, слабо?

задач-то решалась 100500 раз.

и да, Maildir рулит и в этом случае

mumpster ★★★★★
()
Ответ на: комментарий от mumpster

ID это если конкретное письмо искать. Я этим пользуюсь.
А в данном случаи я не понимаю чем он мне упростит работу.

macik
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.