По незнанным причинам я должен был предоставить адаптер SLF4J для ADF Logger Oracle ADF . Неудивительно, что slf4j не имеет адаптера для ADFLogger, но, поскольку ADFLogger был всего лишь аккуратной оболочкой для ведения журнала Java Util Logging, этот пробел занял чуть более часа.
Тестовые сценарии (более похожие на основные программы) в хранилище подтвердят, что среда адаптера хорошо работает с журналом диагностики Oracle, не нарушая формат сообщений журнала. (что является более или менее единственным преимуществом, которое обеспечивает ADFLogger).
Вы можете загрузить всю кодовую базу из хранилища на github . По желанию, если вас интересует только баночка для переплета, скачайте ее здесь .
Уровни журнала:
Учитывая, что в ADF Logger (7) имеется много уровней журнала и меньше уровней в SLF4J (5), на некоторых уровнях ADG Logger был достигнут компромисс. Отображение производится следующим образом:
ПРИМЕЧАНИЕ. Поддержка уровней журнала 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"); } |
б. Регистрация исключений
где dummyException наследует Throwable
с. Параметры ведения журнала
Примечания по разработке:
-
ADFLoggerFactory.javaADF Logger Adapter состоит из двух основных классов (ADFLoggerFactory.javaиADFLoggerAdapter.java) и трех других вспомогательных классов. - Адаптер может поддерживать несколько регистраторов, включая ROOT-регистратор ADFLogger (который используется по умолчанию и имеет пустую строку в качестве имени).
- Неудивительно, что SLF4J использует
ADFLoggerFactory.javaдля создания экземпляра ADFLoggerAdapter. - Для каждого экземпляра Logger
ADFLoggerAdapter.javaсоставляет экземпляр ADFLogger (привязанный к имени регистратора) и делегирует вызов самому ADFLogger. - Метод
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 testLoggerLevelsINFO: info Message from ADF LoggerJul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevelsINFO: info Message from SLF LoggerJul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevelsWARNING: warning Message from ADF LoggerJul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevelsWARNING: warning Message from SLF LoggerJul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevelsSEVERE: severe Message from ADF LoggerJul 01, 2013 4:21:18 PM org.slf4j.test.TestClass testLoggerLevelsSEVERE: 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 testParametersSEVERE: severe Message from ADF Logger Param :[Rock, Paper, Scissors]Jul 01, 2013 4:32:04 PM org.slf4j.test.TestClass testParametersSEVERE: severe Message from SLF Logger Param :[Rock, Paper, Scissors]Jul 01, 2013 4:32:04 PM org.slf4j.test.TestClass testParametersSEVERE: severe Message from ADF Logger Param 1 :[[Rock, Paper, Scissors]] [[21, 22, 23]]Jul 01, 2013 4:32:04 PM org.slf4j.test.TestClass testParametersSEVERE: severe Message from SLF Logger Param :[Rock, Paper, Scissors] [21, 22, 23]Jul 01, 2013 4:32:04 PM org.slf4j.test.TestClass testParametersSEVERE: 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 testExceptionSEVERE: severe Message from ADF Loggerjava.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 testExceptionSEVERE: severe Message from SLF Loggerjava.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) |




