При размещении нескольких доменов с 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. Что будет
Вот пример строки в журнале с этим конкретным набором директив:
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