Как войти в статический блок для библиотеки jar

у меня следующая ситуация:

  • У нас есть общая библиотека (созданная нашей организацией), в которой есть некоторый статический класс (поскольку для оптимизации в памяти много записей), и он развернут в каталоге lib tomcat (для доступа ко всем развернутым веб-приложениям).
  • Статический класс должен получить доступ к соединению с БД, и для этого (если есть какие-либо проблемы) мы используем log4j, но этот подход создает следующую проблему:

log4j:WARN Не удалось найти приложения для регистратора (dev.sample.test.TestLog4J). log4j:WARN Пожалуйста, правильно инициализируйте систему log4j.

And also when the server is stop, there are some memory leaks in the webapps that load (or use) the static class:
Jul 24, 2014 11:29:34 AM org.apache.catalina.core.StandardContext reload
INFO: Reloading Context with name [/fake_smsc] has started
Jul 24, 2014 11:29:34 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/fake_smsc] appears to have started a thread named [MultiThreadedHttpConnectionManager cleanup] but has failed to stop it. This is very likely to create a memory leak.
Jul 24, 2014 11:29:34 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/fake_smsc] appears to have started a thread named [Timer-2] but has failed to stop it. This is very likely to create a memory leak.
Jul 24, 2014 11:29:34 AM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
SEVERE: The web application [/fake_smsc] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@65686a12]) and a value of type [org.mockito.configuration.DefaultMockitoConfiguration] (value [org.mockito.configuration.DefaultMockitoConfiguration@2a0bf7c1]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
Jul 24, 2014 11:29:34 AM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
SEVERE: The web application [/fake_smsc] created a ThreadLocal with key of type [com.google.gson.Gson$1] (value [com.google.gson.Gson$1@7c43d507]) and a value of type [java.util.HashMap] (value [{}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
Jul 24, 2014 11:29:34 AM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
SEVERE: The web application [/fake_smsc] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@4956fe4d]) and a value of type [org.mockito.internal.progress.MockingProgressImpl] (value [iOngoingStubbing: org.mockito.internal.stubbing.OngoingStubbingImpl@6e5196d8, verificationMode: null, stubbingInProgress: null]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
Jul 24, 2014 11:29:35 AM org.apache.catalina.core.StandardContext reload
INFO: Reloading Context with name [/fake_smsc] is completed
Jul 24, 2014 11:29:43 AM org.apache.catalina.core.StandardServer await
INFO: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
Jul 24, 2014 11:29:43 AM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-9191"]
Jul 24, 2014 11:29:43 AM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-9109"]
Jul 24, 2014 11:29:43 AM org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
Jul 24, 2014 11:29:44 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/sms_services] appears to have started a thread named [MultiThreadedHttpConnectionManager cleanup] but has failed to stop it. This is very likely to create a memory leak.
Jul 24, 2014 11:29:44 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/sms_services] appears to have started a thread named [ActiveMQ Connection Executor: vm://localhost#2] but has failed to stop it. This is very likely to create a memory leak.
Jul 24, 2014 11:29:44 AM org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["http-bio-9191"]
Jul 24, 2014 11:29:44 AM org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["ajp-bio-9109"]
Jul 24, 2014 11:29:44 AM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["http-bio-9191"]
Jul 24, 2014 11:29:44 AM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["ajp-bio-9109"]

Эта проблема хорошо задокументирована по адресу: https://wiki.apache.org/commons/Logging/StaticLog, но у вас нет чистого исправления этой проблемы (например, некоторая конфигурация в файле logging.properties сервера tomcat)

Код класса java, который ведет журнал, очень прост:

public class TestLog4J {
    private static Logger log = Logger.getLogger(TestLog4J.class);

    static {
        log.debug("We created the instance of the Test class.");

        try {
            //Do black magic connecting to the db
            connectDatabase();
        } catch (Exception e) {
            log.error("What a Terrible Failure (WTF): ", e);
        }
    }
}

Итак, каковы варианты? Кажется немного некрасивым делать "логирование" с помощью System.out.println(...), поэтому я надеюсь, что, возможно, есть какой-то способ обойти эту проблему с помощью log4j.

С уважением и спасибо за ваши ответы :)


person Enrique San Martín    schedule 24.07.2014    source источник


Ответы (1)


Хорошо, решение находится в ссылке, которую я разместил:

  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;

  public static void doStuff(...) {
    Log log = LogFactory.getLog("stuff");
    log.warn(...);
  }

https://wiki.apache.org/commons/Logging/StaticLog

Ссылки на частный статический журнал Logger = Logger.getLogger(TestLog4J.class); должны быть удалены, а все вызовы журналов в статических методах, блоках и классах должны выполняться с помощью метода getLog LogFactory, также файл commons-logging-*.jar должен находиться в папке lib сервера tomcat, поэтому пользовательский lib может найти его (и, конечно же, log4j.jar).

person Enrique San Martín    schedule 25.07.2014