Schrift
[thread]3137[/thread]

Apache splitlog



<< >> 9 Einträge, 1 Seite
Balthazor
 2005-03-18 16:52
#31015 #31015
User since
2005-03-18
3 Artikel
BenutzerIn
[default_avatar]
Hallo Board :-)

Ich hab ein Problem mit dem Apachen und zwar habe ich die "file descriptor" Grenze erreicht, weil ich zuviele namensbasierte virtuelle hosts habe.
http://httpd.apache.org/docs-2.0/misc/descriptors.html
Jetzt muss ich wieder eine Log Datei benutzen und mit dem splitlog.pl Skript von Apache diese für jeden Host wieder teilen.
Das Problem dabei ist ich kann kein Perl.....
/var/log/httpd/access_log ist die Log Datei und die geteilten Log Dateien sollen jeweils in das home Verzeichnis des jeweiligen virtuellen Hosts.
Also sprich /home/vhost1/logs/access.log, /home/vhost2/logs/access.log, ....
Die CustomLog Direktive habe ich bereits richtig und ein Auszug aus dem Log wäre z.B.:
vhost1.org 111.222.111.222 - - [18/Mar/2005:15:45:17 +0100] "GET / HTTP/1.1" 200 1207 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
Ich bin jedem sehr dankbar der mir dabei hilft!
Vielen Dank im voraus!

Zu guter letzt noch das Skript das Apache zur Verfügung stellt.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!@perlbin@
#
# This script will take a combined Web server access
# log file and break its contents into separate files.
# It assumes that the first field of each line is the
# virtual host identity (put there by "%v"), and that
# the logfiles should be named that+".log" in the current
# directory.
#
# The combined log file is read from stdin. Records read
# will be appended to any existing log files.
#
%is_open = ();

while ($log_line = <STDIN>) {
   #
   # Get the first token from the log record; it's the
   # identity of the virtual host to which the record
   # applies.
   #
   ($vhost) = split (/\s/, $log_line);
   #
   # Normalize the virtual host name to all lowercase.
   # If it's blank, the request was handled by the default
   # server, so supply a default name.  This shouldn't
   # happen, but caution rocks.
   #
   $vhost = lc ($vhost) or "access";
   #
   # if the vhost contains a "/" or "\", it is illegal so just use
   # the default log to avoid any security issues due if it is interprted
   # as a directory separator.
   if ($vhost =~ m#[/\\]#) { $vhost = "access" }
   #
   # If the log file for this virtual host isn't opened
   # yet, do it now.
   #
   if (! $is_open{$vhost}) {
       open $vhost, ">>${vhost}.log"
           or die ("Can't open ${vhost}.log");
       $is_open{$vhost} = 1;
   }
   #
   # Strip off the first token (which may be null in the
   # case of the default server), and write the edited
   # record to the current log file.
   #
   $log_line =~ s/^\S*\s+//;
   printf $vhost "%s", $log_line;
}
exit 0;
\n\n

<!--EDIT|renee|1111160925-->
renee
 2005-03-18 17:32
#31016 #31016
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Und was ist Dein Problem??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2005-03-18 17:46
#31017 #31017
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=renee,18.03.2005, 16:32]Und was ist Dein Problem??[/quote]
Schreibt er doch: er kann kein Perl :-)

Ich wuerde das Filtern einfach mit einem grep erledigen, da braucht man kein Perl dazu.
pq
 2005-03-18 17:49
#31018 #31018
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bitte code-tags (siehe signatur)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Balthazor
 2005-03-18 18:17
#31019 #31019
User since
2005-03-18
3 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,18.03.2005, 16:46]Ich wuerde das Filtern einfach mit einem grep erledigen, da braucht man kein Perl dazu.[/quote]
wie würde das in der bash zu realisieren sein damit jeder virtueller host seine eigene log datei in seinem home verzeichnis erhält?
ich kann zwar server konfigurieren aber mit Skript und Programmier Sprachen muss ich mich erst genauer befassen, obwohl bash geht ja noch ;)
GwenDragon
 2005-03-18 18:43
#31020 #31020
User since
2005-01-17
14548 Artikel
Admin1
[Homepage]
user image
So könnte es gehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/perl
#
# This script will take a combined Web server access
# log file and break its contents into separate files.
# It assumes that the first field of each line is the
# virtual host identity (put there by "%v"), and that
# the logfiles should be named that+".log" in the current
# directory.
#
# The combined log file is read from stdin. Records read
# will be appended to any existing log files.
#
%is_open = ();

$apachelogdir = "/var/log/apache";

$logdir = "/home";

while ($log_line = <STDIN>) {
  #
  # Get the first token from the log record; it's the
  # identity of the virtual host to which the record
  # applies.
  #
  ($vhost) = split (/\s/, $log_line);
  #
  # Normalize the virtual host name to all lowercase.
  # If it's blank, the request was handled by the default
  # server, so supply a default name.  This shouldn't
  # happen, but caution rocks.
  #
  $vhost = lc ($vhost) or "access";
  #
  # if the vhost contains a "/" or "\", it is illegal so just use
  # the default log to avoid any security issues due if it is interprted
  # as a directory separator.
# log to apache access log if no vhost!
$logfile = "$apachelogdir/access.log";
#
  if ($vhost =~ m#[/\\]#) {
    $vhost = "access";
  } else
  {
    $logfile = "$logdir/$vhost/access.log";
  }
  #
  # If the log file for this virtual host isn't opened
  # yet, do it now.
  #
  if (! $is_open{$vhost}) {
      open $vhost, ">> $logfile"
          or die ("Can't open $logfile");
      $is_open{$vhost} = 1;
  }
  #
  # Strip off the first token (which may be null in the
  # case of the default server), and write the edited
  # record to the current log file.
  #
  $log_line =~ s/^\S*\s+//;
  printf $vhost "%s", $log_line;
}
exit 0;

Das Apache-Log muß dann wohl per Pipe an dieses Skript geschickt werden.
Also wahrscheinlich in der httpd.conf
Code: (dl )
CustomLog "| splitlog"


//Edit: Code leicht geändert\n\n

<!--EDIT|GwenDragon|1111166431-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Balthazor
 2005-03-18 19:14
#31021 #31021
User since
2005-03-18
3 Artikel
BenutzerIn
[default_avatar]
Für das ErrorLog gibt es nichts vergleichbares ausser wieder ein eigenes ErrorLog zu jedem virtuellen Host definieren.
Da ich mir Perl erst aneignen muss, kann ich nur raten was nun anders ist :blush:
Aber ich vermute einmal das jetzt unter /home die Log Dateien erstellt werden.
Sie sollten allerdings unter /home/vhost1/logs/access.log, /home/vhost2/logs/access.log,.....
Was noch dazu kommt ist das die Verzeichnisnamen nicht dem Name des virtuellen hosts entspircht.
Allerdings kann man den Verzeichnisname aus der passwd erfahren. Jeder User erhält als Kommentar den Domain Namen für den virtuellen Host beigefügt :-)

Code: (dl )
1
2
[user@www user]$ egrep domain.com /etc/passwd
jk23fj4k:x:1425:1425:domain.com:/home/jk23fj4k:/sbin/nologin
GwenDragon
 2005-03-18 19:31
#31022 #31022
User since
2005-01-17
14548 Artikel
Admin1
[Homepage]
user image
Achtung: Ich weiss nicht, inwieweit das Skript eine Sicherheitslücke hat!
Die /etc/passwd auslesen, na ja. Zugriff auf wichtige Dateien? Vorsicht!
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

GwenDragon
 2005-03-19 13:45
#31023 #31023
User since
2005-01-17
14548 Artikel
Admin1
[Homepage]
user image
Das Problem mit vielen offenen Dateien existiert ja immer noch.
Sinnvoller wäre per cronjob einmal am Tag die Datei zu splitten.
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

<< >> 9 Einträge, 1 Seite



View all threads created 2005-03-18 16:52.