View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements. See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache license, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License. You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the license for the specific language governing permissions and
    15   * limitations under the license.
    16   */
    17  package org.apache.logging.log4j.web;
    18
    19  import javax.servlet.ServletContext;
    20  import javax.servlet.ServletContextEvent;
    21  import javax.servlet.ServletContextListener;
    22
    23  import org.apache.logging.log4j.Logger;
    24  import org.apache.logging.log4j.status.StatusLogger;
    25
    26  /**
    27   * In environments older than Servlet 3.0, this initializer is responsible for starting up Log4j logging before anything
    28   * else happens in application initialization. In all environments, this shuts down Log4j after the application shuts
    29   * down.
    30   */
    31  public class Log4jServletContextListener implements ServletContextListener {
    32
    33      private static final Logger LOGGER = StatusLogger.getLogger();
    34
    35      private ServletContext servletContext;
    36      private Log4jWebLifeCycle initializer;
    37
    38      @Override
    39      public void contextInitialized(final ServletContextEvent event) {
    40          this.servletContext = event.getServletContext();
    41          LOGGER.debug("Log4jServletContextListener ensuring that Log4j starts up properly.");
    42
    43          this.initializer = WebLoggerContextUtils.getWebLifeCycle(this.servletContext);
    44          try {
    45              this.initializer.start();
    46              this.initializer.setLoggerContext(); // the application is just now starting to start up
    47          } catch (final IllegalStateException e) {
    48              throw new IllegalStateException("Failed to initialize Log4j properly.", e);
    49          }
    50      }
    51
    52      @Override
    53      public void contextDestroyed(final ServletContextEvent event) {
    54          if (this.servletContext == null || this.initializer == null) {
    55              throw new IllegalStateException("Context destroyed before it was initialized.");
    56          }
    57          LOGGER.debug("Log4jServletContextListener ensuring that Log4j shuts down properly.");
    58
    59          this.initializer.clearLoggerContext(); // the application is finished shutting down now
    60          this.initializer.stop();
    61      }
    62  }