2016-10-21 5 views
1

Ich arbeite an einer Spring-Boot-Anwendung, und ich möchte Tomcat Zugriff Protokolle durch meine Slf4j Logging-System und schließlich zu einem Remote-Syslog routen.Wie fügt man programmgesteuert ein AccessLogValve zu Tomcat hinzu?

Da es Frühling ist, möchte ich vermeiden, tomcat die Datei server.xml zu berühren.

Mein AccessLogValve ist ziemlich einfach:

import java.io.CharArrayWriter; 
import org.apache.catalina.valves.AccessLogValve; 

public class Log4JAccessLogValve extends AccessLogValve { 
    @Override 
    public void log(CharArrayWriter message) { 
     log.info(message.toString()); 
    } 
} 

Und ich hatte gehofft, dass es möglich wäre, so etwas zu verwenden, um es Tomcat zu anschließen:

@Component 
public class LogConfig { 

    @Autowired 
    private ServletContext servletContext; 

    @PostConstruct 
    public void setAccessLogValve() { 
     ((ApplicationContextFacade)servletContext).addValve(new Log4JAccessLogValve()); 
    } 

} 

mit Ausnahme der addValve() -Methode existiert nicht ...

Also ... hat jemand eine Idee, wie ich meinen AccessLogValve einhängen kann?


Ich bin auch offen für ganz andere Vorschläge Zugriffsprotokolle in einen Remote-Syslog zu bekommen, aber wir Dutzende von Mikro Dienstleistungen machen, so dass es ein ziemlich Standardansatz sein muss, das für jedes Mikro einfach zu implementieren ist Bedienung.

Antwort

1

Verwenden Sie die EmbeddedServletContainerCustomizer-Schnittstelle. Fügen Sie Ihrem eingebetteten Kater ein benutzerdefiniertes Ventil hinzu.

Zum Beispiel

@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter implements EmbeddedServletContainerCustomizer { 

    @Override 
    public void customize(ConfigurableEmbeddedServletContainer container) { 
     if (container instanceof TomcatEmbeddedServletContainerFactory) { 
      TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container; 
      AccessLogValve accessLogValve = new Log4JAccessLogValve(); 
      accessLogValve.setDirectory("/var/log/access_log"); 
      accessLogValve.setPattern("%h %u %t "%r" %s %b - %T"); 
      accessLogValve.setSuffix(".log"); 
      factory.addContextValves(accessLogValve); 
     } else { 
      logger.error("WARNING! this customizer does not support a custom configured container"); 
     } 
    } 

} 
+0

Ich habe jetzt versucht, eine Reihe von verschiedenen Versionen von diesem, aber mein log (CharArrayWriter Nachricht) Methode nie ausgeführt wird,: Es wird nicht Dateizugriffsprotokolldatei bezogene Funktionalität des AccessLogValve

Zum Beispiel initialisieren nach meinem Profiler ... Ich vermute, dass Tomcat das Ventil aus irgendeinem Grund nicht laufen lässt. – schuttek

+0

Ist es möglich, dass factory.addContextValves() etwas hinzufügt, das nicht mit dem eigentlichen Tomcat-Server verbunden ist? – schuttek

+1

Meine eigene Lösung wird ziemlich einfach sein: screw syslog ... es ist ein Hack auf einem veralteten System sowieso ... Ich werde nur Protokolle in das lokale Dateisystem ausgeben und logstash einrichten, um sie zu sammeln, zu zentralisieren und zu verarbeiten . Ich muss nur herausfinden, wie Tomcat alle 30 Sekunden oder so, seinen Zugriffsprotokoll Cache leeren, aber das ist eine andere Sache ... Danke für Ihre Hilfe Johnny, ich hoffe, es hilft jemand anderem :) – schuttek

0

Darüber hinaus werde ich erstreckt Log4JAccessLogValve mit AbstractAccessLogValve statt AccessLogValve empfehlen.

import java.io.CharArrayWriter; 
import org.apache.catalina.valves.AbstractAccessLogValve; 

public class Log4JAccessLogValve extends AbstractAccessLogValve { 

    @Override 
    protected void log(CharArrayWriter message) { 
     LOGGER.info(message.toString()); 
    } 

} 
Verwandte Themen