Logger

http://www.iteye.com/problems/2408

使用Logger需要创建一个 log4j.properties文件,然后在classpath设置路径

比如如果将log4j.properties放在BA1Automation\config下,然后再classpath需要设置<classpathentry kind="src" path="config"/>

 

this.getClass()得到什么?

this 表示当前对象的引用;
getClass() 是 java.lang.Object 中的方法,它返回一个对象的运行时类;
this.getClass() 就是返回当前对象的运行时类。

Logger.getLogger(this.getClass())又得到什么?
他得到一个Logger对象,这个Logger将监视this.getClass()这个运行时类,这个运行时类里面你可能创建了log.info(""), log.debug(""),……等语句,那么这些语句就会根据你预先定义的Logger级别来输出你的日志。就跟你写System.out.print("")一样,不同的是Logger可以根据需要按级别进行日志输出控制。(当然这只是一方面)


Logger.getLogger(this.getClass())这样写,有什么好处?
这样一来你只需要在基类中写一行代码就可以了,子类可以直接使用,这也是复用的原则。
如果你有一个类A,你可以在A类的开始这么写
Logger log=Logger.getLogger(A.class)
这就定死了这个Logger只监视A类本身如果B类继承A类,你创建B类对象时,上面创建的log对象对B是不起作用的。这就就是hard code.

而Logger.getLogger(this.getClass())就不同,你创建B对象时,this就是B对象的引用了,见下列代码:

Java代码 复制代码 收藏代码
  1. package com.zhaipuhong.j2se.keywords; 
  2.  
  3. public class ThisKeywordsA { 
  4.     protected String className = this.getClass().toString(); 
  5.      
  6.     public ThisKeywordsA(){ 
  7.         System.out.println("ThisKeywordsA className == " + className); 
  8.     } 
  9.  
  10. package com.zhaipuhong.j2se.keywords; 
  11.  
  12. public class ThisKeywordsBextends ThisKeywordsA{ 
  13.      
  14.     public ThisKeywordsB(){ 
  15.         System.out.println("ThisKeywordsB className == " + className); 
  16.     } 
  17.     /**
  18.      * @param args
  19.      */ 
  20.     public staticvoid main(String[] args) { 
  21.         // TODO Auto-generated method stub 
  22.         ThisKeywordsB b = new ThisKeywordsB(); 
  23.     } 
  24.  
package com.zhaipuhong.j2se.keywords;

public class ThisKeywordsA {
	protected String className = this.getClass().toString();
	
	public ThisKeywordsA(){
		System.out.println("ThisKeywordsA className == " + className);
	}
}

package com.zhaipuhong.j2se.keywords;

public class ThisKeywordsB extends ThisKeywordsA{
	
	public ThisKeywordsB(){
		System.out.println("ThisKeywordsB className == " + className);
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ThisKeywordsB b = new ThisKeywordsB();
	}

}


运行结果:
ThisKeywordsA className == class com.zhaipuhong.j2se.keywords.ThisKeywordsB
ThisKeywordsB className == class com.zhaipuhong.j2se.keywords.ThisKeywordsB

由于B继承A,A对象首先被创建(请不要考虑抽象类和接口^_^)然后作为B对象的字对象创建B 对象. 此时的Logger就是B对象的一部分,可以为B对象所用。

 

### 日志记录工具和库介绍 #### flexi_logger:灵活且强大的日志记录工具 在现代软件开发中,日志记录对于确保应用程序的稳定性和可维护性至关重要。Flexi_logger 是一款设计用于 Rust 编程语言的强大而灵活的日志记录工具[^1]。该工具不仅易于集成到项目中,还提供了多种配置选项以适应不同场景下的复杂需求。 特性包括但不限于: - 支持多线程环境中的高效日志写入操作; - 提供多样化的输出目标选择(文件、标准输出等); - 可自定义的日志格式设置能力; - 方便快捷地调整全局或局部模块级别的最低显示等级; ```rust use flexi_logger::{Logger, WriteMode}; fn main() { Logger::with_env_or_str("info") .log_to_file() .write_mode(WriteMode::Async) .start() .unwrap(); log::info!("This is an info message."); } ``` #### Consola:适用于 JavaScript/TypeScript 的优雅日志解决方案 Consola 则是一个专门为前端框架 Nuxt.js 设计的日志管理方案,在 Vue 生态圈内广受好评[^2]。除了基本的消息打印外,consola 还具备如下优势: - 自动检测运行时环境并优化表现形式; - 内置颜色编码机制提高阅读体验; - 集成简单易懂的方法接口方便开发者调用; ```javascript import { useLogger } from '@nuxtjs/kit' export default defineEventHandler((event) => { const logger = useLogger('my-module') try { // some code here... logger.info('Informational message.') } catch (error) { logger.error(error.message) } }) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值