Incluindo o nome do host nos relatórios do logwatch do apache

6

Ao hospedar vários domínios com o apache, é útil ver a saída do logwatch do apache com o nome do host virtual incluído, mas eu só obtenho:

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

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

Considerando que gostaria de algo como

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

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

Como posso conseguir isso com o logwatch?

    
por Robert Munteanu 12.06.2009 / 10:03

6 respostas

3

Tente isso (funciona para mim): Defina o LogFormat no seu httpd.conf as

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

Com este caso em particular, você terá remote_address, data / hora, [O nome do servidor de acordo com a configuração UseCanonicalName] , solicitação, código satus e Referer (esse é o meu formato desejado) e depois coloque

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

em seus serviços / arquivo do LogWatch http.conf. Isso vai

  1. faz o apache colocar o nome do host (canônico ou não, depende se você usa% v ou% v)
  2. force o LogWatch a entender seu log do Apache Access

Aqui está um exemplo da linha na saída de log com este conjunto específico de diretivas:

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"

Se nos concentrarmos em códigos de erro, e como eles são tratados no LogWatch, aqui estão algumas alterações que você pode fazer para / usr / share / logwatch / scripts / services / http : Adicione:

my $my_host = ""; my $my_url = "";

Depois, sobre a linha 462, adicione esta linha para salvar nossa quarta coluna (HOST):

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

E na linha 560, depois que fmt_url é encurtar ( if (length($field{url}) > 60) {...} ) adicione:

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

Por fim, altere:

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

por

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

Fazendo isso, você terá isso no seu Logwatch:

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

Espero que ajude você a sair

    
por 01.06.2011 / 21:08
2

Eu tive o mesmo problema e resolvi isso alterando o LogFormat em apache.conf ( link )

# 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

Isso gera a mesma saída que o padrão, adicionando o nome do servidor canônico como um prefixo. Por exemplo:

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

O profissional é que você não precisa de nenhuma outra personalização (por exemplo, no lado do logwatch). O con é que você recebe alguns caracteres extras para cada linha registrada.

    
por 13.01.2016 / 20:49
1

Eu não acho que seja possível se você estiver registrando todos os domínios virtuais no mesmo arquivo de log ... O log do apache não irá diferenciá-los.

Eu também sugiro que você dê uma olhada no open source OSSEC . Nós mudamos de logwatch para ele, porque é em tempo real e permite uma correlação centralizada (correlacionando coisas como ssh failed login com erros do apache 400).

    
por 08.08.2009 / 14:27
1

Eu encontrei uma postagem no blog detalhando esse problema e como alguém o resolveu . Não sei como isso afetará a análise de log, mas anotando-a aqui, pois achei útil.

    
por 04.01.2011 / 00:54
0

Você pode obter o nome do host usando a diretiva LogFormat na configuração do apache. Você pode usar a seguinte opção

%{Host}i

Encontrei esta informação em este link . O Logwatch deve ser capaz de analisar informações personalizadas.

    
por 03.10.2009 / 01:54
0

Muito obrigado a @Syquus, que me colocou no caminho certo para modificar o arquivo /usr/share/logwatch/scripts/services/http .

Meu arquivo e a solução eram diferentes, mas achei que compartilharia da mesma forma.

Eu uso o padrão vhost_combined LogFormat que o Apache fornece que se parece com:

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

que produz algo como:

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"

Eu coloquei isso na substituição da configuração do serviço em /etc/logwatch/conf/services/http.conf :

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

Depois de encontrar os lugares aproximadamente corretos para fazer as mudanças para a solução da @Sequus em /usr/share/logwatch/scripts/services/http , eu pensei que simplesmente mudar o índice de [3] para [0] funcionaria - não funcionou. Eu obtive segmentos incorretos do caminho e, mesmo depois de percorrer todo o hash / array, não encontrei o nome do host. A depuração foi frustrante porque eu sou novo no Perl, mas minha solução foi adicionar a correspondência para o %v que estava sendo descartado e, em seguida, modificar o URL mais abaixo para incluir o nome do domínio.

Diferença para minha solução (também removi o truncamento de 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) &&

Devo decidir disponibilizar conteúdo seguro ou conteúdo em uma porta diferente de: 80 Eu posso incluí-lo no futuro. Deveria ser óbvio agora como.

Espero que isso ajude!

UPDATE

Fiz mais algumas alterações, consertamos um bug. Em vez de continuar editando esta resposta, você pode encontrar minhas modificações aqui: link

    
por 09.10.2013 / 16:57