Регистрация доступа к Tomcat через log4j?

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


person pzn    schedule 05.08.2013    source источник


Ответы (3)


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

person David Dossot    schedule 12.01.2014
comment
После моего теста log4j-scribe-appender работает ТОЛЬКО с Tomcat 6. Необходимо переписать Log4JAccessLogValve с Tomcat 7. - person Ben; 14.04.2015

если вы используете 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();
            }
        }
    }

}
person Ben    schedule 14.04.2015

Это работает для регистрации 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
    }
}

пом.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. Я добавил его в свою эталонную конфигурацию tomcat7 на github.

person Alex R    schedule 03.12.2015