способ использовать log4j пройти установить флаги в моем коде - PullRequest
0 голосов
/ 15 марта 2010

Мне нужно передать какое-то значение, чтобы включить определенный код в майском приложении (в данном случае это необязательно включить запись статистики в файл в определенных условиях, но это может быть что-нибудь общее).

Мое java-приложение установлено как сервис. Так что каждый способ, о котором я думал, имеет некоторые недостатки:

  1. Добавить еще один параметр в main (): громоздко, поскольку клиенты уже установили инструмент, и командную строку нужно будет менять каждый раз.
  2. Добавление java -DmyEnvVar = A_VALUE в мою командную строку: то же, что и выше.
  3. Установите переменную среды: по крайней мере, служба должна быть перезапущена, и даже тогда вы должны позаботиться о том, под каким пользователем работает служба и т. Д.
  4. Добавление свойства в файл конфигурации: я предпочитаю, чтобы это не отображалось в файле конфигурации, чтобы пользователь его не видел, это что-то для отладки и т. Д.

Так что я подумал, что, может быть, есть какой-то способ (или взлом) использовать log4j logger для передачи этого значения в мой код. Я уже думал об одном способе, хотя он очень ограничен:

  1. Добавить фиктивный класс в мою кодовую базу com.dummy.DevOptions

    открытый класс DevOptions { public static final Logger logger = Logger.getLogger (DevOptions.class);

  2. В моем коде используйте его так:

    if (DevOptions.logger.isInfoEnabled ()) { // делаю мои дополнительные вещи } // ... if (DevOptions.logger.isDebugEnabled ()) { // делать другие вещи }

Это позволяет мне использовать различение между различными значениями, и я мог бы увеличить число, добавив больше регистраторов в DevOptions. Но мне интересно, есть ли более чистый способ, возможно, путем настройки регистраторов только в log4j.xml ??

Ответы [ 2 ]

0 голосов
/ 16 марта 2010

хорошо, я думаю, что нашел то, что мне было нужно, на самом деле это было не сложно ...

 public class DevOptions{
  public static boolean isEnabled(String myvalue){
    Logger logger = Logger.getLogger(myvalue);
    return logger.isDebugEnabled();
  }

}

public class SomeAppCode {
  public void someMethod() {
    if(DevOptions.isEnabled("value.A")) {
       //do low level stuff
    } 
  }

}

И я могу добавить столько значений, сколько value.A в log4j.xml:

  <logger name="value.A" additivity="true"><level value="debug" /></logger>

Таким образом, я могу добавить столько значений, сколько захочу, только изменив log4j.xml, не нужно добавлять больше регистраторов в DevOptions, достаточно только одного.

0 голосов
/ 15 марта 2010

В log4j вам вообще не нужны классы Java для создания логгеров (это может быть сюрпризом). Все, что вам нужно, это строка с указанием пакета, а не класс Java для создания категории регистратора. На вашем месте я бы сделал следующее

PS: код не гарантируется для компиляции / запуска

public class SomeAppCode {
      public static final Logger specialLogger = Logger.getLogger("com.mypackage.mysubpackage.speciallogger");

      public void someMethod() {
        if(specialLogger.isDebugEnabled()) {
           //do low level stuff
        } 

      }
}

В вашем log4j.xml добавьте категорию для этой упомянутой строки, и, если хотите, вы можете установить для «additivity» значение true / false (в зависимости от того, хотите ли вы распространить это сообщение журнала на несколько loggerS)

PS: обратите внимание, что specialLogger является общедоступной статикой и может использоваться сотнями классов, как и их собственными регистраторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...