Назад | Перейти на главную страницу

Включение имени хоста в отчеты apache logwatch

При размещении нескольких доменов с apache полезно видеть вывод logwatch apache с включенным именем виртуального хоста, но я получаю только:

 --------------------- httpd Begin ------------------------

 Requests with error response codes
   400 Bad Request
      /: 1 Time(s)
      /robots.txt: 1 Time(s)

а я бы хотел что-то вроде

 --------------------- httpd Begin ------------------------

 Requests with error response codes
   400 Bad Request
      example.com/: 1 Time(s)
      example.org/robots.txt: 1 Time(s)

Как я могу добиться этого с помощью logwatch?

У меня была такая же проблема, и я решил ее, изменив LogFormat в apache.conf (http://httpd.apache.org/docs/2.2/mod/mod_log_config.html)

# LogFormat "%h %l %u %t \"%r\" %>s %O" common

# The default output has no info about the server name (%v).
# %m %U%q %H is strictly equivalent to %r.
LogFormat "%h %l %u %t \"%m %v%U%q %H\" %>s %O" common

Результатом будет тот же результат, что и по умолчанию, но с добавлением канонического имени сервера в качестве префикса. Например:

... "GET www.example.com/apache_pb.gif HTTP/1.0" 200 2326 ... 

Плюс в том, что вам не нужны никакие другие настройки (например, на стороне logwatch). Минус в том, что вы получаете несколько дополнительных символов для каждой зарегистрированной строки.

Попробуйте это (работает для меня): Определите LogFormat в своем httpd.conf так как

LogFormat "% h% t [% V] \"% r \ "%> s \"% {Referer} i \ ""

В этом конкретном случае у вас будет удаленный_адрес, дата / время, [Имя сервера в соответствии с настройкой UseCanonicalName], запрос, код состояния и Referer (это мой желаемый формат), а затем введите

$ LogFormat "% h% t% V \"% r \ "%> s \"% {Referer} i \ ""

в вашем файле services / http.conf LogWatch. Что будет

  1. сделать так, чтобы apache поместил имя хоста (каноническое или нет, это зависит от того, используете ли вы% v или% V)
  2. заставить LogWatch понимать ваш журнал доступа Apache

Вот пример строки в журнале с этим конкретным набором директив:

172.3.20.11 [01 / Jun / 2011: 21: 00: 52 +0200] joomla.local "GET /images/tabs_back.png HTTP / 1.1" 404 "http: //joomla.local/templates/beez_20/css/personal.css"

Если мы сосредоточимся на кодах ошибок и на том, как они обрабатываются в LogWatch, вот некоторые изменения, которые вы можете внести в / USR / доля / logwatch / скрипты / службы / http: Добавить:

мой $ my_host = ""; мой $ my_url = "";

Затем, около строки 462, добавьте эту строку, чтобы сохранить наш 4-й столбец (HOST):

$ field {my_host} = $ field {$ log_fields [3]};

И в строке 560 после fmt_url сокращается ( if (length($field{url}) > 60) {...} ) Добавить:

$my_host = $field{$log_fields[3]};
$my_host = substr($my_host,1);
$my_url=$my_host . $fmt_url;

Наконец, измените:

$needs_exam{$field{http_rc}}{$fmt_url}++;

по

$needs_exam{$field{http_rc}}{$my_url}++;

при этом в вашем Logwatch будет следующее:

Requests with error response codes
404 Not Found
joomla.local/images/tabs_back.png: 3 Time(s)

Надеюсь, это поможет всем вам

Я не думаю, что это возможно, если вы регистрируете все виртуальные домены в одном файле журнала ... Журнал apache не будет различать их.

Я также предлагаю вам взглянуть на открытый исходный код OSSEC. Мы перешли от logwatch к нему, потому что он работает в режиме реального времени и допускает централизованную корреляцию (сопоставление таких вещей, как неудачный вход по ssh с ошибками apache 400).

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

Вы можете получить имя хоста с помощью директивы LogFormat в конфигурации apache. Вы можете использовать следующий вариант

%{Host}i

Я нашел эту информацию в эта ссылка. Logwatch должен иметь возможность анализировать пользовательскую информацию.

Большое спасибо @Syquus, который направил меня на верный путь изменения /usr/share/logwatch/scripts/services/http файл.

Мой файл и решение были другими, но я думал, что все равно поделюсь им.

Я использую стандартный vhost_combined LogFormat, предоставляемый Apache, выглядит так:

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined

который выводит что-то вроде:

example.org:80 1.1.1.1 - - [08/Oct/2013:16:55:01 +0000] "GET / HTTP/1.1" 200 6094 "-" "Opera/9.80 (X11; Linux x86_64; Edition Linux Mint) Presto/2.12.388 Version/12.16"

Я поместил это в переопределение конфигурации службы в /etc/logwatch/conf/services/http.conf:

$logformat = "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\""

После нахождения приблизительно правильных мест для внесения изменений в решение @Syquus в /usr/share/logwatch/scripts/services/http, Я думал, что просто измените индекс с [3] на [0], но этого не произошло. У меня неправильные сегменты пути, и даже после обхода всего хеша / массива я не нашел имя хоста. Отладка была неприятной, потому что я новичок в Perl, но я решил добавить сопоставление для %v который был отброшен, а затем изменил URL-адрес, чтобы включить доменное имя.

Diff для моего решения (я также удалил усечение URL-адреса), YMMV:

--- __http.2013-10-09   2013-10-09 13:11:48.000000000 +0000
+++ http        2013-10-09 14:36:59.000000000 +0000
@@ -132,6 +132,8 @@
 #  Build tables of the log format to parse it and determine whats what
 #

+my $my_url = "";
+
 my $detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
 my $ignoreURLs = $ENV{'http_ignore_urls'};
 my $ignoreIPs = $ENV{'http_ignore_ips'};
@@ -379,7 +381,10 @@
 $logformat =~ s/%[\d,!]*/%/g;
 while ($end_loop) {

-   if ($logformat =~ /\G%h/gc) {
+   if ($logformat =~ /\G%v/gc) {
+      $parse_string[$parse_index] .= "(\\S*?)";
+      $parse_field[$parse_index][$parse_subindex++] = "my_host";
+   } elsif ($logformat =~ /\G%h/gc) {
       $parse_string[$parse_index] .= "(\\S*?)";
       $parse_field[$parse_index][$parse_subindex++] = "client_ip";
    } elsif ($logformat =~ /\G%l/gc) {
@@ -437,7 +442,6 @@
 #
 #  Process log file on stdin
 #
-
 while (my $line = <STDIN>) {
    chomp($line);

@@ -580,11 +584,12 @@
          !((defined $ignoreURLs) && ($field{url} =~ /$ignoreURLs/)) &&
          !((defined $ignoreIPs) && ($field{client_ip} =~ /$ignoreIPs/)) ) {
       my $fmt_url = $field{url};
-      if (length($field{url}) > 60) {
-         $fmt_url = substr($field{url},0,42) . " ... " .
-                    substr($field{url},-15,15);
-      }
-      $needs_exam{$field{http_rc}}{$fmt_url}++;
+      #if (length($field{url}) > 60) {
+      #   $fmt_url = substr($field{url},0,42) . " ... " .
+      #              substr($field{url},-15,15);
+      #}
+      $my_url = $field{my_host} . $fmt_url;
+      $needs_exam{$field{http_rc}}{$my_url}++;
    }
    if (defined $field{userid} && $field{userid} ne "-" &&
          (eval $user_display) &&

Если я решу обслуживать защищенный контент или контент через порт, отличный от: 80, я могу включить его в будущем. Теперь должно быть очевидно, как это сделать.

Надеюсь это поможет!

ОБНОВИТЬ

Внесены еще изменения, исправлена ​​ошибка. Вместо того, чтобы продолжать редактировать этот ответ, вы можете найти мои модификации здесь: https://bitbucket.org/ubiquitypress/logwatch