static {
    ClassLoader prevLoader = Thread.currentThread().getContextClassLoader();
    Thread.currentThread().setContextClassLoader(TCLoggingLog4J.class.getClassLoader());

    Log4jSafeInit.init();

    Logger customerLogger = Logger.getLogger(CUSTOMER_LOGGER_NAMESPACE);
    Logger consoleLogger = Logger.getLogger(CONSOLE_LOGGER_NAME);

    console = new TCLoggerImpl(CONSOLE_LOGGER_NAME);
    consoleAppender =
        new TCConsoleAppender(new PatternLayout(CONSOLE_PATTERN), ConsoleAppender.SYSTEM_OUT);
    operatorEventLogger = new TCLoggerImpl(OPERATOR_EVENT_LOGGER_NAME);

    List<Logger> internalLoggers = new ArrayList<Logger>();
    for (String nameSpace : INTERNAL_LOGGER_NAMESPACES) {
      internalLoggers.add(Logger.getLogger(nameSpace));
    }

    /**
     * Don't add consoleLogger to allLoggers because it's a child of customerLogger, so it shouldn't
     * get any appenders. If you DO add consoleLogger here, you'll see duplicate messages in the log
     * file.
     */
    allLoggers = createAllLoggerList(internalLoggers, customerLogger);

    try {
      boolean customLogging = customConfiguration();
      boolean isDev = customLogging ? false : developmentConfiguration();

      if (!customLogging) {
        for (Logger internalLogger : internalLoggers) {
          internalLogger.setLevel(Level.INFO);
        }
        customerLogger.setLevel(Level.INFO);
        consoleLogger.setLevel(Level.INFO);

        if (!isDev) {
          // Only the console logger goes to the console (by default)
          consoleLogger.addAppender(consoleAppender);
        } else {
          consoleAppender.setLayout(new PatternLayout(CONSOLE_PATTERN_DEVELOPMENT));
          // For non-customer environments, send all logging to the console...
          Logger.getRootLogger().addAppender(consoleAppender);
        }
      }

      delegateFileAppender = new DelegatingAppender(new NullAppender());
      addToAllLoggers(delegateFileAppender);

      BufferingAppender realBufferingAppender;
      realBufferingAppender = new BufferingAppender(MAX_BUFFERED_LOG_MESSAGES);
      realBufferingAppender.setName("buffering appender");
      delegateBufferingAppender = new DelegatingAppender(realBufferingAppender);
      addToAllLoggers(delegateBufferingAppender);
      buffering = true;

      if (!isDev) {
        console.info("New logging session started.");
      }

      writeVersion();
      writePID();
      writeLoggingConfigurations();
    } finally {
      Thread.currentThread().setContextClassLoader(prevLoader);
    }
  }