Статьи

SLF4J Binding для ADFLogger — недостающий кусок

По незнанным причинам я должен был предоставить адаптер SLF4J для ADF Logger Oracle ADF . Неудивительно, что slf4j не имеет адаптера для ADFLogger, но, поскольку ADFLogger был всего лишь аккуратной оболочкой для ведения журнала Java Util Logging, этот пробел занял чуть более часа.

Тестовые сценарии (более похожие на основные программы) в хранилище подтвердят, что среда адаптера хорошо работает с журналом диагностики Oracle, не нарушая формат сообщений журнала. (что является более или менее единственным преимуществом, которое обеспечивает ADFLogger).

ODL

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

Уровни журнала:

Учитывая, что в ADF Logger (7) имеется много уровней журнала и меньше уровней в SLF4J (5), на некоторых уровнях ADG Logger был достигнут компромисс. Отображение производится следующим образом:

LogLevelMapping

ПРИМЕЧАНИЕ. Поддержка уровней журнала FINER и CONFIG была прекращена во время этой адаптации.

Использование :

Просто замените свой ADFLogger на экземпляры SLF4J.

1
private static final Logger slfLogger = LoggerFactory.getLogger(LoggingChecker.class);

вместо

1
private static final ADFLogger adfLogger= ADFLogger.createADFLogger(LoggingChecker.class);

Методы ведения журнала

а. Вход на разные уровни

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
@Test
  public void testLoggerLevels(){
 
        adfLogger.finest("finest Message from ADF Logger");
        slfLogger.trace("finest Message from SLF Logger");
 
        adfLogger.fine("fine Message from ADF Logger");
        slfLogger.debug("fine Message from SLF Logger");
 
        adfLogger.info("info Message from ADF Logger");
        slfLogger.info("info Message from SLF Logger");
 
        adfLogger.warning("warning Message from ADF Logger");
        slfLogger.warn("warning Message from SLF Logger");
 
        adfLogger.severe("severe Message from ADF Logger");
        slfLogger.error("severe Message from SLF Logger");
     }

б. Регистрация исключений

ExceptionTesting

где dummyException наследует Throwable

с. Параметры ведения журнала

ParameterTesting

ParameterPassing

Примечания по разработке:

  1. ADFLoggerFactory.java ADF Logger Adapter состоит из двух основных классов ( ADFLoggerFactory.java и ADFLoggerAdapter.java ) и трех других вспомогательных классов.
  2. Адаптер может поддерживать несколько регистраторов, включая ROOT-регистратор ADFLogger (который используется по умолчанию и имеет пустую строку в качестве имени).
  3. Неудивительно, что SLF4J использует ADFLoggerFactory.java для создания экземпляра ADFLoggerAdapter.
  4. Для каждого экземпляра Logger ADFLoggerAdapter.java составляет экземпляр ADFLogger (привязанный к имени регистратора) и делегирует вызов самому ADFLogger.
  5. Метод fillCallerData в ADFLoggerAdapter.java фильтрует кадры стека ADFLoggerAdapter из всего стека журналов, так что класс вызывающего абонента и имя метода сохраняются как один из приложения хоста, а не классов инфраструктуры адаптера.

Тестовый случай (ну вроде)

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class TestClass {
 
    private static final ADFLogger adfLogger= ADFLogger.createADFLogger(TestClass.class);
    private static final Logger slfLogger = LoggerFactory.getLogger(TestClass.class);
 
    private List<String> dummyList1=null;
    private List<Integer> dummyList2=null;
 
    private Exception dummyException=null;
 
    @Before
    public void setUp(){
 
      dummyList1=new ArrayList<String>();
      dummyList1.add("Rock");
      dummyList1.add("Paper");
      dummyList1.add("Scissors");
 
      dummyList2=new ArrayList<Integer>();
      dummyList2.add(21);
      dummyList2.add(22);
      dummyList2.add(23);
 
      dummyException=new Exception("Mind blowing Exception");
 
    }
 
    @Test
  public void testLoggerLevels(){
 
        adfLogger.finest("finest Message from ADF Logger");
        slfLogger.trace("finest Message from SLF Logger");
 
        adfLogger.fine("fine Message from ADF Logger");
        slfLogger.debug("fine Message from SLF Logger");
 
        adfLogger.info("info Message from ADF Logger");
        slfLogger.info("info Message from SLF Logger");
 
        adfLogger.warning("warning Message from ADF Logger");
        slfLogger.warn("warning Message from SLF Logger");
 
        adfLogger.severe("severe Message from ADF Logger");
        slfLogger.error("severe Message from SLF Logger");
  }
 
    @Test
      public void testException(){
 
          adfLogger.severe("severe Message from ADF Logger", dummyException);
          slfLogger.error("severe Message from SLF Logger", dummyException);
 
      }
 
    @Test
      public void testParameters(){
 
          adfLogger.severe("severe Message from ADF Logger Param :{0}", dummyList1 );
          slfLogger.error("severe Message from SLF Logger Param :{}", dummyList1);
 
          adfLogger.severe("severe Message from ADF Logger Param 1 :[{0}] \n [{1}]", new Object[]{dummyList1, dummyList2} );
          slfLogger.error("severe Message from SLF Logger Param :{} \n {} ", dummyList1, dummyList2);
          slfLogger.error("severe Message from SLF Logger Param :[{}] \n [{}] ", new Object[]{dummyList1, dummyList2});
 
      }

Выход :

Уровни логгера:

01
02
03
04
05
06
07
08
09
10
11
12
Jul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevels
INFO: info Message from ADF Logger
Jul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevels
INFO: info Message from SLF Logger
Jul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevels
WARNING: warning Message from ADF Logger
Jul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevels
WARNING: warning Message from SLF Logger
Jul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevels
SEVERE: severe Message from ADF Logger
Jul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevels
SEVERE: severe Message from SLF Logger

Параметры тестирования:

01
02
03
04
05
06
07
08
09
10
11
12
13
Jul 01, 2013 4:32:04 PM org.slf4j.test.TestClass testParameters
SEVERE: severe Message from ADF Logger Param :[Rock, Paper, Scissors]
Jul 01, 2013 4:32:04 PM org.slf4j.test.TestClass testParameters
SEVERE: severe Message from SLF Logger Param :[Rock, Paper, Scissors]
Jul 01, 2013 4:32:04 PM org.slf4j.test.TestClass testParameters
SEVERE: severe Message from ADF Logger Param 1 :[[Rock, Paper, Scissors]]
 [[21, 22, 23]]
Jul 01, 2013 4:32:04 PM org.slf4j.test.TestClass testParameters
SEVERE: severe Message from SLF Logger Param :[Rock, Paper, Scissors]
 [21, 22, 23]
Jul 01, 2013 4:32:04 PM org.slf4j.test.TestClass testParameters
SEVERE: severe Message from SLF Logger Param :[[Rock, Paper, Scissors]]
 [[21, 22, 23]]

Исключение при тестировании:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Jul 01, 2013 4:32:28 PM org.slf4j.test.TestClass testException
SEVERE: severe Message from ADF Logger
java.lang.Exception: Mind blowing Exception
  at org.slf4j.test.TestClass.setUp(TestClass.java:38)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  at java.lang.reflect.Method.invoke(Unknown Source)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
  at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
  at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
 
Jul 01, 2013 4:32:28 PM org.slf4j.test.TestClass testException
SEVERE: severe Message from SLF Logger
java.lang.Exception: Mind blowing Exception
  at org.slf4j.test.TestClass.setUp(TestClass.java:38)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  at java.lang.reflect.Method.invoke(Unknown Source)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
  at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
  at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Ссылка: SLF4J Binding для ADFLogger — недостающая часть от нашего партнера JCG Аруна Маниваннана в блоге Rerun.me .