[linux-l] apachelogs wohlgeordnet archivieren aus logrotate

Peter Ross Peter.Ross at alumni.tu-berlin.de
Do Aug 7 08:46:41 CEST 2008


On Wed, 6 Aug 2008, Peter Ross wrote:

> On Wed, 6 Aug 2008, Thomas Feldhaus wrote:
> 
> > Hallo,
> 
> > grübele gerade bei lpi2 Kapitel 2.213.1 Automatisierungsskripte über dem 
> > Lernziel "Synchronisieren von logs" mit rsync, scp. zum Beispiel 
> > apachelogs: logrotate managt die Logs im Ringbufferverfahren in 
> > /var/log/apache, dh. zerschneiden, im Ring verfahren umbenennen, 
> > irgendwann die ältesten löschen, usw.
> 
> > Jetzt will ich aber sämtliche apachelogs wohlgeordnet und an einem 
> > passenden Ort aufbewahren. Aber das geht ja in der Form, wie logrotate 
> > die Daten aufbereitet hat, nicht mehr so ohne weiteres.
> 
> Eine andere Variante ist syslog-ng, dort kann man Schreiben nach 
> /var/log/${host}/${datum} veranlassen. Wir benutzen das, inklusive der 
> Benutzung zentraler Logserver (weitere Vorteile: Zugang zu vielen Daten 
> zentral, Entkopplung von Produktionsservern, so Zugang für Entwickler 
> unabhängig von Prod möglich, kein Auffüllen von /var-Partitionen..) - so 
> wirklich sehr sehr hilfreich.
> 
> Wir haben apache und tomcat so konfiguriert. Lokal läuft normales syslog, 
> nur der Logserver braucht syslog-ng.
> 
> Wenn Interesse besteht, schreibe ich morgen mehr, wenn ich Zugang zu den 
> Servern habe.

Okay, hier die Schritte:

beim Client:

1. Syslogd muß weiterleiten können, wird mit folgenden Optionen gestartet:

SYSLOGD_OPTIONS="-m 0 -h -r" # Bei Red Hat unter /etc/sysconfig/syslog

2. /etc/syslog.conf konfiguriert, daß die Daten zum Syslogserver kommen

local0.*	@logserver
local1.*        @logserver
..
local6.*        @logserver

3. Apache errorlog zu syslog

ErrorLog syslog:local1 # in /etc/httpd/conf/httpd.conf oder include

4. Apache accesslog zu einem Skript, welches an syslog weiterleitet:

CustomLog | httpd_access2syslog.pl combined_t

5. Das Perl-Skript httpd_access2syslog.pl

#!/usr/bin/perl
use Sys::Syslog qw( :DEFAULT setlogsock );
setlogsock('unix','/dev/log');
openlog('apache', 'cons', 'local1');
while ($log = <STDIN>) { syslog('info', "%s", $log);}
closelog

6. Für Tomcat in den log4j.properties:

log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.syslogHost=localhost
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=%-5p %d [%t] %c - %m%n
log4j.appender.SYSLOG.Facility=LOCAL1

Am Server:

7. Ausschalten von syslog

8. Installation von syslog-ng

9. Aufpassen, daß klogd läuft (unter Red Hat Kopie des syslog-Bootskripts, 
   aber nur klogd, nicht syslogd starten)

10. Konfiguration in syslog-ng.conf

options {
	sync (0);
	time_reopen (10);
	log_fifo_size (1000);
	long_hostnames (off);
	use_dns (yes);
	use_fqdn (yes);
	create_dirs (no);
	keep_hostname (yes);
};

source s_sys {
	file ("/proc/kmsg" log_prefix("kernel: "));
	unix-stream ("/dev/log");
	internal();
	udp(ip(0.0.0.0) port(514)); # Listen to the outside world
};

# automatic host sorting (usually used on a loghost)
#

# set it up
destination std { 
   file("/var/log/$FULLHOST/$R_YEAR-$R_MONTH-$R_DAY/$FACILITY.$PRIORITY" 
        owner(root) group(root) perm(0644) dir_perm(0755) create_dirs(yes)
       ); 
};

# log it
   log { 
      source(s_sys); 
      destination(std); 
   };

Ich hoffe, ich habe nichts übersehen..

Es grüßt
Peter


Mehr Informationen über die Mailingliste linux-l