javax.servlet.UnavailableException: In a Servlet 3.0+ application, you must not define a log4jServletFilter in web.xml. Log4j 2 defines this for you automatically.

Tomcat7に、古いWebアプリをデプロイしたら、log4jにまつわるエラーにより、WEBアプリが立ち上がらない問題に遭遇しました。

Tomcatのログを見ると、以下のようなエラーが出ていました。

SEVERE: Error during ServletContainerInitializer processing
javax.servlet.UnavailableException: In a Servlet 3.0+ application, you must not define a log4jServletFilter in web.xml. Log4j 2 defines this for you automatically.

Servlet 3.0以降では、log4jServletFilterをweb.xmlの中に定義してはいけないそうです。

web.xmlから以下を削除しました。

        <!-- log4j.xmlのファイルパス -->
    <context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>file:///PATH/TO/log4j2.xml</param-value>
    </context-param>

    <filter>
        <filter-name>log4jServletFilter</filter-name>
        <filter-class>org.apache.logging.log4j.core.web.Log4jServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>log4jServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>

    <!-- 起動・停止リスナー -->
    <listener>
        <listener-class>org.apache.logging.log4j.core.web.Log4jServletContextListener</listener-class>
    </listener>

そして、log4j2.xmlを、クラスパスが通ったディレクトリ、つまり、classファイル(Javaファイル)が配置されているディレクトリに移しました。