java 日志源码的进一步加深
来源:互联网 发布:我亲爱的朋友们 知乎 编辑:程序博客网 时间:2024/06/08 06:58
Logger类:
1记录特定系统或应用程序组件的日志消息,一般使用圆点分隔的层次名称来命名Logger。和包的命名类似。
2.每个logger都有一个与其相关的“level”,如果他的logger级别为空,则他的有效级别继承自父logger。
3.可以通过配置文件来配置日志级别,也可以通过Logger.setLevel方法动态修改,但是它的变化会影响其子logger的变化。
4.在每次日志记录调用时,他都会按照自己的有效日志级别来对请求级别进行检查,如果低于日志级别则返回日志记录调用。
5.在经过初始化后,Logger将会分配一个LogRecord来描述日志记录消息,在接着调用Filter进行详细的检查,如果检查通过则发布到输出Handler。
6.每个Logger都有一个与其相关联的ResourceBundle名称,该指定用于本地化日志消息。
LogManager类:
存在一个全局的LogManager对象,用于维护Logger和日志服务的一组共享状态。
1管理Logger对象的层次结构名称空间,所有指定的Logger都存储在此命名空间中。
2 管理一组日志控制属性,这些事供Handler及其他日志对象用于自我配置的简单键值对。
注意:
1 LogManager对象是在类初始化是创建,过后就不可更改了。
2在默认情况下,LogManager会从JRE目录属性文件lib/logging.properties中获取最初的配置信息。
3在LogManager配置期间加载的所有类,他们的搜索顺序是先从系统路劲中搜索,在从用户类中搜索。
4 初始化的整个过程
static{AccessController.doPrivileged(new PrivilegedAction<Object>() {public Object run(){String cname = null;try{cname = System.getProperty("java.util.logging.manager");if (cname != null){try{Class clz = ClassLoader.getSystemClassLoader().loadClass(cname);manager = (LogManager) clz.newInstance();}catch (ClassNotFoundException ex){Class clz = Thread.currentThread().getContextClassLoader().loadClass(cname);manager = (LogManager) clz.newInstance();}}}catch (Exception ex){System.err.println("Could not load Logmanager \"" + cname + "\"");ex.printStackTrace();}if (manager == null){manager = new LogManager();} manager.rootLogger = manager.new RootLogger();manager.addLogger(manager.rootLogger);manager.systemContext.addLocalLogger(manager.rootLogger); Logger.global.setLogManager(manager);manager.addLogger(Logger.global);return null;}});}
LogRecord类:
重点要理解下面三个类属性:
private static long globalSequenceNumber;
private static int nextThreadId = 10;
private static ThreadLocal threadIds = new ThreadLocal();
public LogRecord(Level level, String msg){level.getClass();this.level = level;message = msg;synchronized (LogRecord.class){sequenceNumber = globalSequenceNumber++;Integer id = (Integer) threadIds.get();if (id == null){id = new Integer(nextThreadId++);threadIds.set(id);}threadID = id.intValue();}millis = System.currentTimeMillis();needToInferCaller = true;}
与logger的关系如下,以info方法为例:
public void info(String msg){if (Level.INFO.intValue() < levelValue){return;}log(Level.INFO, msg);}public void log(Level level, String msg){if (level.intValue() < levelValue || levelValue == offValue){return;}LogRecord lr = new LogRecord(level, msg);doLog(lr);}
转载自:http://www.strutshome.com/index.php/archives/577
- java 日志源码的进一步加深
- 对自定义View的进一步加深
- poj2002~对哈希表的理解进一步加深了
- View的绘制流程(需要进一步加深)
- R3、微软进一步加深合作,推动Corda DLT的采用
- 加深对JAVA的理解
- Java 接口的加深理解
- 如何进一步的学习java?
- Java继承的进一步联系
- Java关于注解的加深理解
- Java关于反射的加深理解
- 关于JAVA谜题畅读的进一步理解
- Java中异常的运用进一步理解
- java day02 for循环的进一步理解
- 对Java instanceof的进一步理解
- Java中final的进一步理解
- poj 2184(dp变形,进一步加深01背包)
- SI4463研究计划(兼STM32F0进一步加深理解)
- poj 1328 贪心 水题
- HDU 1864 最大报销额(01背包)
- metaq spring
- c# using 关键字小结
- HLG 1251 Marshal's Confusion III (快速幂)
- java 日志源码的进一步加深
- MTK 智能机ddr调试自我梳理
- Tomcat源码分析(四)--容器处理链接之责任链模式
- 数据结构之稀疏矩阵18浅谈三元组,行逻辑以及十字链表
- js中传递参数
- Sbothai เข้ากับคนไทยได้ดี
- RoboCup 2D足球仿真项目team_logo制作教程
- OllyDbg破解系列学习笔记(三)
- 递归:八皇后 92种解