最后一次实验要求用日志来记录信息,学习的内容整理如下:
Java 中的 Logging API 让 Java 应用可以记录不同级别的信息,它在debug过程中非常有用,如果系统因为各种各样的原因而崩溃,崩溃原因可以在日志中清晰地追溯。

日志工作原理

java getlog java getlogger_java getlog


首先通过LoggerManager进行日志框架的初始化,生成Logger的根节点RootLogger. 这里需要注意的是LoggerManager的初始化工作,并没有将构建配置文件中所有的日志对象,而仅仅是构建了根节点,这种方式就是我们多例模式中经常用到的懒加载,对象只有在真正被时候的时候,再进行构建。 我觉得这跟学过的代理模式工作机制是一样的。

通过Logger.getLogger(String name) 获取一个已有的Logger对象或者是新建一个Logger对象。

Logger,日志记录器,这就是在应用程序中需要调用的对象了,通过Logger对象的一系列log方法,收到应用程序的记录请求,将参数中的日志信息和运行时的信息构建出LogRecord对象,而后通过Logger对象本身设置的记录级别和调用者传递进来的日志级别,如果传递进来的日志级别低于Logger对象本身设置的记录级别(从语义上的理解,而实际上语义级别越高的级别其内部用数字表示的标志的数值越小),那么Logger对象将直接返回,因为他认为这条日志信息,在当前运行环境中,没有必要记录。

而满足以上条件的日志信息,将会通过Logger对象的filter元素的过滤校验,filter是动态的,在运行时是可以随意设置的,如果有filter对象,那么将调用filter对象,对日志对象LogRecord进行校验,只有校验通过的LogRecord对象,才会继续往下执行。

通过filter校验后,Logger对象将依次调用其配置的处理器,通过处理器来真正实现日志的记录功能,一个Logger对象可以配置多个处理器handler,所以一条日志记录可以被多个处理器处理,同时Logger对象的实现是树形结构,如果Logger对象设置其可以继承其父节点的处理器(默认),一条日志记录还会被其父节点的Logger对象处理。 而handler的处理方式就会是形形色色了,但是归根节点,会有以下几个大的步骤:

  1. 级别的判定和比较,决定某条具体的日志记录是否应该继续处理
  2. 将日志记录做格式化处理,以达到输出的日志在格式上统一,美观,可读性高。 3. 资源的释放,不管是以何种方式记录日志,总是会消耗一些方面的资源,所以会涉及到资源的释放问题。比如以文件方式记录的日志的,在一定的时候需要做文件关闭操作,以报文方式发送日志的,在和远程通话的过程中,也需要涉及到网络IO的关闭操作,或者是存储在数据库等等。

代码示例

//1.首先获取调用日志记录的类的名称
static String strclassname=你的类.class.getName();
//2.初始化一个logger
static Logger mylogger= Logger.getLogger(strclassname);
//3.初始化一个    FileHandler 指针    
FileHandler fh=null;
//4.还可以设置logger记录的信息是否在控制台上输出        
mylogger.setUseParentHandlers(false);//让logger信息不在控制台输出,true即为在控制台输出
//5.设置要写入的文件                    
fh = new FileHandler("....你的路径Logger.log",true);
//6.设置你所要设置的写入文件的日志格式                    
fh.setFormatter(new MyFileFormatter());//其中new MyFileFormatter()是你需要自己设计的格式类,这里不做详细解释
//7. 最后将此日志信息写入文件
mylogger.addHandler(fh);
mylogger.info("你所需要用日志记录的信息");
 fh.close();//关掉日志文本
// 8.这样就成功实现了将日志记录进文件了