2013-08-05 1 views
3

У меня есть чистая установка tomcat7 с включенным log4j (согласно http://tomcat.apache.org/tomcat-7.0-doc/logging.html#Using_Log4j). «Журналирование на уровне приложения» использует конфигурацию log4j (я направляю журналы на локальный сервер syslog). Как я могу сделать свое приложение access.log также использовать log4j? Насколько я могу судить, я могу выбирать между AccessLogValve, ExtendedAccessLogValve и JDBCAccessLogValve, но из их числа я могу войти в syslog или использовать log4j.Доступ к Tomcat через log4j?

ответ

3

Проект log4j-scribe-appender содержит Log4JAccessLogValve, который позволит вам сделать именно это.

+0

После моего теста приложение log4j-scribe-appender работает ТОЛЬКО с Tomcat 6. Необходимо переписать Log4JAccessLogValve с Tomcat 7. – Ben

0

если вы используете Tomcat 7, вы можете продлить AccessLogValve путем переопределения эту функцию:

/** 
* Log the specified message to the log file, switching files if the date 
* has changed since the previous log call. 
* 
* @param message Message to be logged 
*/ 
public void log(String message) { 

    rotate(); 

    /* In case something external rotated the file instead */ 
    if (checkExists) { 
     synchronized (this) { 
      if (currentLogFile != null && !currentLogFile.exists()) { 
       try { 
        close(false); 
       } catch (Throwable e) { 
        ExceptionUtils.handleThrowable(e); 
        log.info(sm.getString("accessLogValve.closeFail"), e); 
       } 

       /* Make sure date is correct */ 
       dateStamp = fileDateFormatter.format(
         new Date(System.currentTimeMillis())); 

       open(); 
      } 
     } 
    } 

    // Log this message 
    synchronized(this) { 
     if (writer != null) { 
      writer.println(message); 
      if (!buffered) { 
       writer.flush(); 
      } 
     } 
    } 

} 
0

Это работает для JDK-каротажа:

package org.apache.plugins; 

import java.util.logging.Logger; 
import org.apache.catalina.valves.AccessLogValve; 

public class AccessLogJdkValve extends AccessLogValve { 

    private static Logger jdkLogger = Logger.getLogger(AccessLogJdkValve.class.getName()); 

    @Override 
    public void log(String msg) { 
     jdkLogger.info(msg); 
    } 

    @Override 
    protected synchronized void open() { 
     // do nothing 
    } 
} 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>tomcat7-conf</groupId> 
    <artifactId>tomcat7-conf</artifactId> 
    <version>1.0-RELEASE</version> 
    <packaging>jar</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>org.apache.tomcat.maven</groupId> 
      <artifactId>common-tomcat-maven-plugin</artifactId> 
      <version>2.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat</groupId> 
      <artifactId>tomcat-catalina</artifactId> 
      <version>7.0.12</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <sourceDirectory>src</sourceDirectory> 
     <plugins> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Просто скомпилируйте, сделайте банку, поместите копию в /usr/share/tomcat7/lib/ и измените server.xml. Я добавил его к моему reference tomcat7 configuration на github.