4. logger.trace(\, expensiveOperation()); 5. }
在java8中可以使用 lambda表达式实现相同的效果,你可以不用显式的检查日志级别了:
1. // Java-8 style optimization: no need to explicitly check the log level: 2. // the lambda expression is not evaluated if the TRACE level is not enabled 3. logger.trace(\,()-> expensiveOperation());
(6)Logger Names
大部分日志实现使用为了使得 日志名称与日志配置匹配 使用一个分层的名称方案。在这个方案中Logger的名称是由 . 分隔的, 非常类似于 java
包名的层次。 例如 :org.apache.logging
是 org.apache.logging.appender 与 org.apache.logging.filter 的父层。大多数情况下,应用命名他们的日志名称是通过在LogManager.getLogger中传入当前类名实现的。因为这个用法太常见,Log4j2在入参为空或者传入为Null的时候默认是提供当前类的名称。例如,下面的例子的 Logger的名称都是 \
1. package org.apache.test; 2.
3. publicclassMyTest{
4. privatestaticfinalLogger logger =LogManager.getLogger(MyTest.class); 5. }
1. package org.apache.test; 2.
3. publicclassMyTest{
4. privatestaticfinalLogger logger =LogManager.getLogger(MyTest.class.getName()); 5. }
1. package org.apache.test; 2.
3. publicclassMyTest{
4. privatestaticfinalLogger logger =LogManager.getLogger(); 5. }
1. Flow Tracing
Logger 类提供了针对跟踪应用执行路径的很有用的方法 。这些方法可以从debug 日志中产生可以单独 过滤的logging events。以下情况鼓励使用这些方法: (1) 在不需要DEBUG的开发中帮助诊断问题 (2)在不需要DEBUG的生产中帮助诊断问题。 (3)帮助新的开发人员在应用中学习使用。
最常用的2个方法是 entry() 与exit() 。
entry() 一般置于方法的开头,entry() 可以传入0-4个参数,通常是传入方法变量, entry() 方法的日志级别是TRACE ,并且使用了一个名为ENTER 的Marker。这也是一个FLOW Marker
exit() 放置在方法的结束或者方法的返回前,exit() 可以传入 1个参数或者不传入参数,通常 void方法不传入参数,而返回一个Object的方法使用exit(Object obj) 。exit()方法使用TRACE 的日志级别,并且使用了一个名为EXIT 的Marker。
throwing() 方法一般在应用抛出一个不太可能处理的异常时使用。类似RuntimeException 。这个方法使用了ERROR 的日志级别。
catching() 方法使用在捕获一个异常,但是不会抛出的时候,这个方法使用了ERROR 的日志级别。,
下面的例子展示了这些方法的典型使用:
1. package com.test; 2.
3. import org.apache.logging.log4j.Logger; 4. import org.apache.logging.log4j.LogManager; 5.
6. import java.util.Random; 7.
8. publicclassTestService{
9. privateLogger logger =LogManager.getLogger(TestService.class.getName()); 10.
11. privateString[] messages =newString[]{ 12. \, 13. \, 14. \ 15. };
16. privateRandom rand =newRandom(1); 17.
18. publicString retrieveMessage(){ 19. logger.entry(); 20.
21. String testMsg = getMessage(getKey()); 22.
23. return logger.exit(testMsg); 24. } 25.
26. publicvoid exampleException(){ 27. logger.entry(); 28. try{
29. String msg = messages[messages.length];
30. logger.error(\); 31. }catch(Exception ex){ 32. logger.catching(ex); 33. }
34. logger.exit(); 35. } 36.
37. publicString getMessage(int key){ 38. logger.entry(key); 39.
40. String value = messages[key];
41.
42. return logger.exit(value); 43. } 44.
45. privateint getKey(){ 46. logger.entry();
47. int key = rand.nextInt(messages.length); 48. return logger.exit(key); 49. } 50. }
测试程序的调用 :
1. package com.test; 2.
3. publicclassApp{ 4.
5. publicstaticvoid main(String[] args ){ 6. TestService service =newTestService(); 7. service.retrieveMessage(); 8. service.retrieveMessage(); 9. service.exampleException(); 10. } 11. }
日志配置文件 :
1. 2.
4.
5.
8.
10.
11.
15.
18. 19.
2. Markers
日志记录框架的主要目的之一是在需要的时候提供一种方法来生成调试和诊断信息。并且可以对这些信息进行过滤,以使不会压垮系统或者需要使用它的人,例如:应用需要打印 入口,出口,和分别执行的SQL语句,并且希望能够分开 查询和 更新语句 :
1. import org.apache.logging.log4j.Logger; 2. import org.apache.logging.log4j.LogManager; 3. import java.util.Map; 4.
5. publicclassMyApp{ 6.
7. privateLogger logger =LogManager.getLogger(MyApp.class.getName()); 8. privatestaticfinalMarker SQL_MARKER =MarkerManager.getMarker(\); 9. privatestaticfinalMarker UPDATE_MARKER
=MarkerManager.getMarker(\).set(SQL_MARKER); 10. privatestaticfinalMarker QUERY_MARKER
=MarkerManager.getMarker(\).set(SQL_MARKER); 11.
12. publicString doQuery(String table){ 13. logger.entry(param); 14.
15. logger.debug(QUERY_MARKER,\, table); 16.
17. return logger.exit(); 18. } 19.
20. publicString doUpdate(String table,Map
23. if(logger.isDebugEnabled()){
24. logger.debug(UPDATE_MARKER,\, table, formatCols()); 25.
26. return logger.exit(); 27. } 28.
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库log4j2中文手册(4)在线全文阅读。
相关推荐: