无纸记录仪的工作原理及基础知识
来源:上海自动化仪表有限公司作者:发表时间:2017-12-13 10:04:17【小中大】
无纸记录仪的工作原理及基础知识
无纸记录仪对象用于记录特定系统或应用程序组件的消息。无纸记录仪通常使用分层点分隔的命名空间命名。无纸记录仪名称可以是任意字符串,但通常应该基于记录组件的包名称或类名称,例如java.net或javax.swing。此外,还可以创建没有存储在记录器名称空间中的“匿名”记录器。
无纸记录仪对象可以通过调用其中一个getLogger工厂方法来获得。这些将创建一个新的记录器或返回一个合适的现有无纸记录仪。需要注意的是,如果没有保存对Logger的强引用,任何时候getLogger工厂方法返回的Logger都可能被垃圾回收。
无纸记录仪消息将被转发到注册的处理程序对象,它可以将消息转发到各种目标,包括控制台,文件,操作系统日志等。
每个无纸记录仪都会跟踪“父”记录器,它是Logger命名空间中最近的现有祖先。
每个记录器都有一个与其关联的“级别”。这反映了这个记录器关心的最低水平。如果Logger的级别设置为null,则其有效级别从其父级继承,而后者又可以从其父级以递归方式获得,依此类推。
日志级别可以根据日志配置文件中的属性进行配置,如LogManager类的描述中所述。但是也可以通过Logger.setLevel方法的调用动态更改。如果记录器的级别发生更改,则更改也可能会影响子级记录器,因为任何级别为空的子级记录器都将从其父级继承其有效级别。
在每次记录调用时,记录器最初对无纸记录仪的有效日志级别执行请求级别的便宜检查(例如,SEVERE或FINE)。如果请求级别低于日志级别,则日志记录调用立即返回。
在通过这个初始的(便宜的)测试之后,无纸记录仪将分配一个LogRecord来描述记录消息。然后它会调用一个过滤器(如果存在)来更详细地检查记录是否应该发布。如果通过它将发布到其输出处理程序。默认情况下,无纸记录仪也会发布到其父处理程序,递归地向上。
每个无纸记录仪可能有一个与其关联的ResourceBundle名称。命名包将用于本地化日志消息。如果无纸记录仪没有自己的ResourceBundle名称,那么它将从其父文件继承ResourceBundle名称,递归到树上。
大部分无纸记录仪输出方法都带有“msg”参数。此msg参数可能是原始值或本地化密钥。在格式化期间,如果无纸记录仪具有(或继承)本地化ResourceBundle,并且ResourceBundle具有msg字符串的映射,则msg字符串将由本地化值替换。否则使用原始的msg字符串。通常情况下,格式化程序使用java.text.MessageFormat样式格式来格式化参数,例如格式字符串“{0} {1}”会将两个参数格式化为字符串。
将ResourceBundle名称映射到ResourceBundles时,Logger将首先尝试使用Thread的ContextClassLoader。如果是null,它将尝试SystemClassLoader。作为初始实现中的一个临时转换功能,如果Logger无法从ContextClassLoader或SystemClassLoader中定位ResourceBundle,则Logger将搜索类堆栈,并使用连续调用的ClassLoaders尝试定位ResourceBundle。 (此调用堆栈搜索允许容器转换为使用ContextClassLoaders,并可能在未来的版本中被删除。)
格式化(包括本地化)是输出处理程序的责任,通常会调用格式化程序。
请注意,格式不需要同步发生。它可能会延迟,直到一个LogRecord实际写入到一个外部接收器。
日志方法分为五个主要类别:
(1)有一组“日志”方法将日志级别,消息字符串和可选的一些参数作为消息字符串。
(2)有一组“logp”方法(对于“log精确”),就像“log”方法一样,但也需要一个明确的源类名和方法名。
(3)有一套类似“logp”方法的“logrb”方法(对于“log with resource bundle”),但是也需要一个明确的资源包名来用于本地化日志消息。
(4)有跟踪方法条目(“进入”方法),方法返回(“退出”方法)和抛出异常(“抛出”方法)的便利方法。
(5)最后,在最简单的情况下,有一套简便的方法,当开发人员只需要在给定的日志级别上记录一个简单的字符串时。这些方法以标准级别名称(“严重”,“警告”,“信息”等)命名,并采用一个参数即消息字符串。
对于不采用显式源名称和方法名称的方法,Logging框架将“尽最大努力”确定将哪个类和方法调用到日志记录方法中。但是,意识到这个自动推断的信息可能只是近似的(甚至可能是相当错误的!)。允许虚拟机在JITing时进行广泛的优化,并可能完全删除堆栈帧,从而无法可靠地定位调用类和方法。记录器上的所有方法都是多线程安全的。
子类化信息:请注意,LogManager类可以为命名空间中的任何点提供自己的命名记录器实现。因此,Logger的任何子类(除非它们与一个新的LogManager类一起实现)应该注意从LogManager类获取一个Logger实例,并且应该将诸如“isLoggable”和“log(LogRecord)”等操作委托给该实例。注意为了拦截所有的日志输出,子类只需要重写log(LogRecord)方法。所有其他日志记录方法在此日志(LogRecord)方法上实现为调用。
上海自动化仪表有限公司推荐资讯
- 科里奥利流量计的先进接线技术知识汇总2019-05-06
- 2018年度上海市科学技术奖揭晓—— 公司"2023-03-22
- 使用气动V形调节球阀的好处2019-08-29
- D511/7DK压力控制器2019-07-12
- 上海自动化仪表有限公司提供初学者差压变送2018-11-24
- 四种基本电动阀的功能细节分析2019-08-02
- 导致电动调节阀发出燃烧气味的原因及其如何2019-12-11
- 平凡岗位淬炼“工匠精神” ——记上自仪七2023-02-13
上海自动化仪表有限公司热门产品
- 公司在装甲电缆中引入下一个伟大的创新2018-01-08
- WZPN-230耐磨热电阻2018-03-06
- 阀门行业的使用增长趋势有助于新的销售平台2018-02-07
- 噪音对转子流量计测量结果的影响2017-12-15
- 详细介绍关于质量流量计技术知识汇总2019-04-04
- 气动调节阀的工作性质和优势2019-07-27
- 耐震电接点压力表2018-03-09
- 雷达物位计测量使用及保养维护注意事项2017-12-15