log4j и weblogic: повторяющиеся сообщения журнала

Я использую log4j для входа в свой проект. Вот его пример настройки:

public class MyClass {
  private final Logger logger = Logger.getLogger(MyClass.class);

  public MyClass() {
    BasicConfigurator.configure();
    Logger.getLogger(MyClass.class).setLevel(Level.INFO);
  }

  ...

}

Проблема в том, что при каждом следующем вызове регистратора он дублирует сообщения журнала (я имею в виду, что при первом вызове есть только 1 сообщение, при втором вызове 2 одинаковых сообщения, затем их 3 и так далее). Кажется, что каждый раз создается новый экземпляр логгера и используется со всеми старыми экземплярами.
Как избежать этой проблемы? Спасибо.

УПП. Пытался сделать его статичным, но все равно не работает. Я все еще получаю несколько сообщений журнала. Любые идеи? Возможно, что-то специфичное для Weblogic?


person kardanov    schedule 17.08.2011    source источник


Ответы (4)


Сделать регистратор static

private static final Logger logger = Logger.getLogger(MyClass.class);

Ключевым моментом здесь является создание Logger для каждого класса, а не для каждого экземпляра.

person Shawn    schedule 17.08.2011
comment
Хм, попробовал это, но безуспешно. И это действительно странно, потому что ваш совет выглядит очень разумным. Любые другие идеи? Что может вызвать проблему? Возможно, что-то специфичное для Weblogic? - person kardanov; 18.08.2011
comment
Вы нашли решение для этого? У меня такое же поведение здесь, и я не мог исправить это до сих пор. - person groo; 30.05.2012

попробуйте установить аддитивность false программно или в конфиг.

    Logger.getLogger(MyClass.class).setAdditivity(false);

Для меня это помогло, когда я установил его в log4j.xml.

<logger name="com.stackoverflow.answers.gnat" additivity="false">
    <!-- note additivity value set above -->
    <level value="INFO"/>
    <appender-ref ref="knowledge"/>
    <appender-ref ref="reputation"/>
</logger>
person gnat    schedule 18.08.2011
comment
Спасибо за ваш ответ @gnat, но теперь я получаю исключение: log4j:WARN No appenders could be found for logger log4j:WARN Please initialize the log4j system properly Похоже, что регистратор вообще не инициализирован. - person kardanov; 18.08.2011
comment
ПРЕДУПРЕЖДЕНИЕ Никаких дополнений... Понятно. Звучит знакомо. Никогда не мог точно определить причину этого (я писал, что ненавижу документацию log4j? только документы maven кажутся хуже), но всегда казалось, что это происходит, когда я слишком рано устанавливаю какой-то атрибут. Попробуйте установить аддитивность как можно позже. Кстати, пример xml в моем ответе скопирован из кодовой базы, с которой я работаю прямо сейчас (я просто запутал имя и ссылки для конкретной компании), и доказано, что он отлично работает в течение последних полугода или что-то в этом роде. - person gnat; 18.08.2011

Если вы сделаете свой класс Logger статическим, как было предложено выше, а затем убедитесь, что вы настраиваете log4j либо с помощью системного свойства -D на уровне JVM, либо в конфигурации вашего приложения, у вас не должно возникнуть никаких проблем. Этот вызов для анализа конфигурации либо во время загрузки класса, либо во время создания экземпляра является ненужным.

log4j нужно инициализировать конфигурацию только один раз - будь то при инициализации сервера или при развертывании вашего приложения.

Является ли ваш проект веб-приложением?

Кроме того, вы можете узнать больше о подключении к конфигурации ведения журнала WebLogic Server здесь: http://download.oracle.com/docs/cd/E12840_01/wls/docs103/logging/logging_services.html

Надеюсь, это поможет.

person kevinpowe    schedule 19.08.2011
comment
С удовольствием, @kardanov - если вы нашли ответ полезным, было бы здорово, если бы вы проголосовали за ответ. Надеюсь, что ведение журнала теперь относится к вам лучше. - person kevinpowe; 26.08.2011

Проблема заключается в методе BasicConfurator.configure(). У меня была точно такая же проблема в моем java-проекте, и я не использую WebLogic.

Я переместил свой метод BasicConfigurator.configure() из моего beforeTest() в beforeClass(), и внезапно проблема исчезла.

@BeforeClass
public static void beforeClass() {
  BasicConfigurator.configure();
  GeoLogger.setLogLevel(Level.INFO);
}

@Before
public void beforeTest() {
  //BasicConfigurator.configure();
}

Надеюсь, что это поможет вам найти решение.

person Anonymous    schedule 28.09.2012