Java中的记录器– Java记录示例

时间:2020-02-23 14:37:20  来源:igfitidea点击:

今天,我们将研究Java中的Logger。
Java Logger提供Java编程中的日志记录。

Java中的记录器

Java日志记录API在1.4中引入,您可以使用Java日志记录API来记录应用程序消息。
在此Java日志记录教程中,我们将学习Java Logger的基本功能。
我们还将研究不同记录级别,记录处理程序,格式化程序,过滤器,日志管理器和记录配置的Java Logger示例。

Java记录器

" java.util.logging.Logger"是用于在Java日志记录API中记录应用程序消息的类。

我们可以使用非常简单的一行代码来创建Java Logger。

Logger logger = Logger.getLogger(MyClass.class.getName());

Java记录级别

java.util.logging.Level定义了Java日志记录的不同级别。
Java有七个日志级别。

  • SEVERE (highest)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

还有其他两个日志记录级别,"关闭"将关闭所有日志记录,"所有"将记录所有消息。

我们可以使用以下代码设置记录器级别:

logger.setLevel(Level.FINE);

将为等于或者大于记录器级别的所有级别生成日志。
例如,如果记录器级别设置为INFO,则将为INFO,WARNING和SEVERE记录消息生成日志。

Java记录处理程序

我们可以向Java记录器添加多个处理程序,并且每当记录任何消息时,每个处理程序都会对其进行相应处理。
Java Logging API提供了两个默认处理程序。

  • ConsoleHandler:此处理程序将所有日志消息写入控制台
  • FileHandler:此处理程序将所有日志记录消息以XML格式写入文件。

我们还可以创建自己的自定义处理程序来执行特定任务。
要创建自己的Handler类,我们需要扩展java.util.logging.Handler类或者它的任何子类,如StreamHandler,SocketHandler等。

这是一个自定义Java日志处理程序的示例:

package com.theitroad.log;

import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;

public class MyHandler extends StreamHandler {

  @Override
  public void publish(LogRecord record) {
      //add own logic to publish
      super.publish(record);
  }

  @Override
  public void flush() {
      super.flush();
  }

  @Override
  public void close() throws SecurityException {
      super.close();
  }

}

Java记录格式化程序

格式化程序用于格式化日志消息。
java记录API中有两个可用的格式化程序。

  • SimpleFormatter:此格式化程序生成带有基本信息的文本消息。
    ConsoleHandler使用此格式化程序类将日志消息打印到控制台。

  • XMLFormatter:此格式化程序为日志生成XML消息,FileHandler使用XMLFormatter作为默认格式化程序。

我们可以通过扩展java.util.logging.Formatter类来创建自己的自定义Formatter类,并将其附加到任何处理程序上。
这是一个简单的自定义格式化程序类的示例。

package com.theitroad.log;

import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

public class MyFormatter extends Formatter {

  @Override
  public String format(LogRecord record) {
      return record.getThreadID()+"::"+record.getSourceClassName()+"::"
              +record.getSourceMethodName()+"::"
              +new Date(record.getMillis())+"::"
              +record.getMessage()+"\n";
  }

}

Java中的记录器– Java日志管理器

java.util.logging.LogManager是读取日志配置,创建和维护日志实例的类。
我们可以使用此类来设置我们自己的应用程序特定的配置。

LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));

这是Java Logging API配置文件的示例。
如果我们未指定任何配置,则从JRE主页" lib/logging.properties"文件中读取。

mylogging.properties

handlers= java.util.logging.ConsoleHandler

.level= FINE

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.theitroad.files = SEVERE

这是一个简单的Java程序,显示了Java中Logger的用法。

package com.theitroad.log;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class LoggingExample {

  static Logger logger = Logger.getLogger(LoggingExample.class.getName());
  
  public static void main(String[] args) {
      try {
          LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
      } catch (SecurityException | IOException e1) {
          e1.printStackTrace();
      }
      logger.setLevel(Level.FINE);
      logger.addHandler(new ConsoleHandler());
      //adding custom handler
      logger.addHandler(new MyHandler());
      try {
          //FileHandler file name with max size and number of log files limit
          Handler fileHandler = new FileHandler("/Users/hyman/tmp/logger.log", 2000, 5);
          fileHandler.setFormatter(new MyFormatter());
          //setting custom filter for FileHandler
          fileHandler.setFilter(new MyFilter());
          logger.addHandler(fileHandler);
          
          for(int i=0; i<1000; i++){
              //logging messages
              logger.log(Level.INFO, "Msg"+i);
          }
          logger.log(Level.CONFIG, "Config data");
      } catch (SecurityException | IOException e) {
          e.printStackTrace();
      }
  }

}

当您在Java logger示例程序上方运行时,您会注意到CONFIG日志未在文件中打印出来,这是由于MyFilter类所致。

package com.theitroad.log;

import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

public class MyFilter implements Filter {

	@Override
	public boolean isLoggable(LogRecord log) {
		//don't log CONFIG logs in file
		if(log.getLevel() == Level.CONFIG) return false;
		return true;
	}

}

同样,输出格式将与MyFormatter类定义的格式相同。

1::com.theitroad.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg977
1::com.theitroad.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg978
1::com.theitroad.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg979
1::com.theitroad.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg980

如果我们不将自己的Formatter类添加到FileHandler,则日志消息将像这样打印。

<record>
<date>2012-12-14T17:03:13</date>
<millis>1355533393319</millis>
<sequence>996</sequence>
<logger>com.theitroad.log.LoggingExample</logger>
<level>INFO</level>
<class>com.theitroad.log.LoggingExample</class>
<method>main</method>
<thread>1</thread>
<message>Msg996</message>
</record>

控制台日志消息将采用以下格式:

Dec 15, 2012 1:42:43 AM com.theitroad.log.LoggingExample main
INFO: Msg997
Dec 15, 2012 1:42:43 AM com.theitroad.log.LoggingExample main
INFO: Msg998
Dec 15, 2012 1:42:43 AM com.theitroad.log.LoggingExample main
INFO: Msg998