zoukankan      html  css  js  c++  java
  • Java Logging API

    Java Logging

    This article describes how to use the Logging API in Java programs. It includes an example for creating an HTML logger.

     

    1. Overview

    1.1. Logging

    Logging is the process of writing log messages during the execution of a program to a central place. This logging allows you to report and persist error and warning messages as well as info messages (e.g., runtime statistics) so that the messages can later be retrieved and analyzed.

    The object which performs the logging in applications is typically just called Logger.

    1.2. Logging in Java

    Java contains the Java Logging API. This logging API allows you to configure which message types are written. Individual classes can use this logger to write messages to the configured log files.

    The java.util.logging package provides the logging capabilities via the Logger class.

    1.3. Create a logger

    To create a logger in your Java code, you can use the following snippet.

    import java.util.logging.Logger;
    
    // assumes the current class is called logger
    private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName()); 

    The Logger you create is actually a hierarchy of Loggers, and a . (dot) in the hierarchy indicates a level in the hierarchy. So if you get a Logger for the com.example key, this Logger is a child of the com Logger and the com Logger is child of the Logger for the empty String. You can configure the main logger and this affects all its children.

    1.4. Level

    The log levels define the severity of a message. The Level class is used to define which messages should be written to the log.

    The following lists the Log Levels in descending order:

    • SEVERE (highest)

    • WARNING

    • INFO

    • CONFIG

    • FINE

    • FINER

    • FINEST

    In addition to that you also have the levels OFF and ALL to turn the logging off or to log everything.

    For example, the following code sets the logger to the info level, which means all messages with severe, warning and info will be logged.

    LOGGER.setLevel(Level.INFO); 

    1.5. Handler

    Each logger can have access to several handlers.

    The handler receives the log message from the logger and exports it to a certain target.

    A handler can be turned off with the setLevel(Level.OFF) method and turned on with setLevel() method.

    You have several standard handlers. The following list gives some examples.

    • ConsoleHandler: Write the log message to console

    • FileHandler: Writes the log message to file

    Log levels INFO and higher will be automatically written to the console.

    1.6. Formatter

    Each handler's output can be configured with a formatter

    Available formatter

    • SimpleFormatter: Generate all messages as text

    • XMLFormatter: Generates XML output for the log messages

    You can also build your own formatter. The following is an example of a formatter which will create HTML output.

    package com.vogella.logger;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.logging.Formatter;
    import java.util.logging.Handler;
    import java.util.logging.Level;
    import java.util.logging.LogRecord;
    
    // this custom formatter formats parts of a log record to a single line
    class MyHtmlFormatter extends Formatter {
      // this method is called for every log records
      public String format(LogRecord rec) {
        StringBuffer buf = new StringBuffer(1000);
        buf.append("<tr>
    ");
    
        // colorize any levels >= WARNING in red
        if (rec.getLevel().intValue() >= Level.WARNING.intValue()) {
          buf.append("	<td style="color:red">");
          buf.append("<b>");
          buf.append(rec.getLevel());
          buf.append("</b>");
        } else {
          buf.append("	<td>");
          buf.append(rec.getLevel());
        }
    
        buf.append("</td>
    ");
        buf.append("	<td>");
        buf.append(calcDate(rec.getMillis()));
        buf.append("</td>
    ");
        buf.append("	<td>");
        buf.append(formatMessage(rec));
        buf.append("</td>
    ");
        buf.append("</tr>
    ");
    
        return buf.toString();
      }
    
      private String calcDate(long millisecs) {
        SimpleDateFormat date_format = new SimpleDateFormat("MMM dd,yyyy HH:mm");
        Date resultdate = new Date(millisecs);
        return date_format.format(resultdate);
      }
    
      // this method is called just after the handler using this
      // formatter is created
      public String getHead(Handler h) {
          return "<!DOCTYPE html>
    <head>
    <style>
    "
              + "table {  100% }
    "
              + "th { font:bold 10pt Tahoma; }
    "
              + "td { font:normal 10pt Tahoma; }
    "
              + "h1 {font:normal 11pt Tahoma;}
    "
              + "</style>
    "
              + "</head>
    "
              + "<body>
    "
              + "<h1>" + (new Date()) + "</h1>
    "
              + "<table border="0" cellpadding="5" cellspacing="3">
    "
              + "<tr align="left">
    "
              + "	<th style="10%">Loglevel</th>
    "
              + "	<th style="15%">Time</th>
    "
              + "	<th style="75%">Log Message</th>
    "
              + "</tr>
    ";
        }
    
      // this method is called just after the handler using this
      // formatter is closed
      public String getTail(Handler h) {
        return "</table>
    </body>
    </html>";
      }
    } 

    1.7. Log Manager

    The log manager is responsible for creating and managing the logger and the maintenance of the configuration.

    We could set the logging level for a package, or even a set of packages, by calling the LogManager.setLevel(String name, Level level) method. So, for example, we could set the logging level of all loggers toLevel.FINE by making this call:

    LogManager.getLogManager().getLogger(Logger.GLOBAL_LOGGER_NAME).setLevel(Level.FINE); 

    1.8. Best Practices

    It is common practice to use the fully qualified name of each class whose activity is being logged as a message category, because this allows developers to fine-tune log settings for each class.

    Using the fully qualified class name of your class as the name of your Logger is the approach recommended by the Logging API documentation.

     

    2. Example

    2.1. Create the logger

    This example is stored in the project called com.vogella.logger.

    Create your own formatter class.

    package com.vogella.logger;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.logging.Formatter;
    import java.util.logging.Handler;
    import java.util.logging.Level;
    import java.util.logging.LogRecord;
    
    // this custom formatter formats parts of a log record to a single line
    class MyHtmlFormatter extends Formatter {
      // this method is called for every log records
      public String format(LogRecord rec) {
        StringBuffer buf = new StringBuffer(1000);
        buf.append("<tr>
    ");
    
        // colorize any levels >= WARNING in red
        if (rec.getLevel().intValue() >= Level.WARNING.intValue()) {
          buf.append("	<td style="color:red">");
          buf.append("<b>");
          buf.append(rec.getLevel());
          buf.append("</b>");
        } else {
          buf.append("	<td>");
          buf.append(rec.getLevel());
        }
    
        buf.append("</td>
    ");
        buf.append("	<td>");
        buf.append(calcDate(rec.getMillis()));
        buf.append("</td>
    ");
        buf.append("	<td>");
        buf.append(formatMessage(rec));
        buf.append("</td>
    ");
        buf.append("</tr>
    ");
    
        return buf.toString();
      }
    
      private String calcDate(long millisecs) {
        SimpleDateFormat date_format = new SimpleDateFormat("MMM dd,yyyy HH:mm");
        Date resultdate = new Date(millisecs);
        return date_format.format(resultdate);
      }
    
      // this method is called just after the handler using this
      // formatter is created
      public String getHead(Handler h) {
          return "<!DOCTYPE html>
    <head>
    <style>
    "
              + "table {  100% }
    "
              + "th { font:bold 10pt Tahoma; }
    "
              + "td { font:normal 10pt Tahoma; }
    "
              + "h1 {font:normal 11pt Tahoma;}
    "
              + "</style>
    "
              + "</head>
    "
              + "<body>
    "
              + "<h1>" + (new Date()) + "</h1>
    "
              + "<table border="0" cellpadding="5" cellspacing="3">
    "
              + "<tr align="left">
    "
              + "	<th style="10%">Loglevel</th>
    "
              + "	<th style="15%">Time</th>
    "
              + "	<th style="75%">Log Message</th>
    "
              + "</tr>
    ";
        }
    
      // this method is called just after the handler using this
      // formatter is closed
      public String getTail(Handler h) {
        return "</table>
    </body>
    </html>";
      }
    } 

    Initialize the logger via the following code. This Logger class uses the new HTML formatter you created.

    package com.vogella.logger;
    
    import java.io.IOException;
    import java.util.logging.FileHandler;
    import java.util.logging.Formatter;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.util.logging.SimpleFormatter;
    
    public class MyLogger {
      static private FileHandler fileTxt;
      static private SimpleFormatter formatterTxt;
    
      static private FileHandler fileHTML;
      static private Formatter formatterHTML;
    
      static public void setup() throws IOException {
    
        // get the global logger to configure it
        Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
    
        // suppress the logging output to the console
        Logger rootLogger = Logger.*getLogger*("");
        Handler[] handlers = rootLogger.getHandlers();
        if (handlers[0] instanceof ConsoleHandler) {
          rootLogger.removeHandler(handlers[0]);
        }
    
        logger.setLevel(Level.INFO);
        fileTxt = new FileHandler("Logging.txt");
        fileHTML = new FileHandler("Logging.html");
    
        // create a TXT formatter
        formatterTxt = new SimpleFormatter();
        fileTxt.setFormatter(formatterTxt);
        logger.addHandler(fileTxt);
    
        // create an HTML formatter
        formatterHTML = new MyHtmlFormatter();
        fileHTML.setFormatter(formatterHTML);
        logger.addHandler(fileHTML);
      }
    }
     

    2.2. Use the logger

    The following example class demonstrates how you can use your MyLogger class to create log messages.

    package com.vogella.logger.test;
    
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import com.vogella.logger.MyLogger;
    
    public class UseLogger {
      // use the classname for the logger, this way you can refactor
      private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
      
    
      public void doSomeThingAndLog() {
        // ... more code
    
        // now we demo the logging
    
        // set the LogLevel to Severe, only severe Messages will be written
        LOGGER.setLevel(Level.SEVERE);
        LOGGER.severe("Info Log");
        LOGGER.warning("Info Log");
        LOGGER.info("Info Log");
        LOGGER.finest("Really not important");
    
        // set the LogLevel to Info, severe, warning and info will be written
        // finest is still not written
        LOGGER.setLevel(Level.INFO);
        LOGGER.severe("Info Log");
        LOGGER.warning("Info Log");
        LOGGER.info("Info Log");
        LOGGER.finest("Really not important");
      }
    
      public static void main(String[] args) {
        UseLogger tester = new UseLogger();
        try {
          MyLogger.setup();
        } catch (IOException e) {
          e.printStackTrace();
          throw new RuntimeException("Problems with creating the log files");
        }
        tester.doSomeThingAndLog();
      }
    }
     

    Tip

     

    After you ran your program you need to Refresh your project in Eclipse (or check the file system directly) to see the files in the Package Explorer view.

  • 相关阅读:
    描述JSP和Servlet的区别、共同点、各自应用的范围
    JS中的三种弹出式消息提醒(警告窗口、确认窗口、信息输入窗口)的命令是什么?
    如何优化数据库,如何提高数据库的性能?
    什么是数据库的参照完整性?
    常用的设计模式有哪些?说明工厂模式。
    struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的?
    struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象、临时对象、固定名称的对象、Action对象
    Struts2包含哪些标签?
    说出几个与spring同类型的开源框架,说出几个与hibernate同类型的开源框架,说出几个与struts同类型的开源框架
    Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console、file等。Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别。
  • 原文地址:https://www.cnblogs.com/hephec/p/4579632.html
Copyright © 2011-2022 走看看