今天我们将讨论Java Logger,Java Logger提供了Java编程中的日志。
在 Java 中使用
Java Logging API was introduced in 1.4 and you can use java logging API to log application messages. In this java logging tutorial, we will learn basic features of Java Logger. We will also look into Java Logger example of different logging levels, Logging Handlers, Formatters, Filters, Log Manager and logging configurations.
Java 记录器
「java.util.logging.Logger」是用來記錄 Java 記錄 API 中的應用程式訊息的類別,我們可以用非常簡單的單行代碼來創建 java Logger。
1Logger logger = Logger.getLogger(MyClass.class.getName());
Java 登录级别
java.util.logging.Level
定义了 Java 记录的不同级别,在 Java 中有七个级别的记录。
第一百一十四条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条 第一百一十一条
还有另外两个日志级别, OFF将关闭所有日志和 ALL将记录所有消息,我们可以使用以下代码设置日志级别:
1logger.setLevel(Level.FINE);
所有等于或大于日志记录级别的级别将生成日志,例如,如果日志记录级别设置为INFO,则将生成日志,用于INFO、警告和SEVERE日志消息。
Java 登录处理器
我们可以将多个处理器添加到 Java 日志器中,每次我们登录任何消息时,每个处理器都会相应地处理它。
- ConsoleHandler:此处理器将所有日志信息写入控制台
- FileHandler:此处理器将所有日志信息写入 XML 格式
为了创建自己的 Handler 类,我们需要扩展 java.util.logging.Handler 类或其任何子类,如 StreamHandler、SocketHandler 等。
1package com.journaldev.log;
2
3import java.util.logging.LogRecord;
4import java.util.logging.StreamHandler;
5
6public class MyHandler extends StreamHandler {
7
8 @Override
9 public void publish(LogRecord record) {
10 //add own logic to publish
11 super.publish(record);
12 }
13
14 @Override
15 public void flush() {
16 super.flush();
17 }
18
19 @Override
20 public void close() throws SecurityException {
21 super.close();
22 }
23
24}
Java 登录格式
用于格式化日志消息的格式化器有两个可用的格式化器在java日志 API。
- SimpleFormatter:此格式器生成包含基本信息的文本消息。ConsoleHandler 使用此格式器类来打印日志消息到控制台.
- XMLFormatter:此格式器生成日志的 XML 消息,FileHandler 使用 XMLFormatter 作为默认格式。
我们可以通过扩展java.util.logging.Formatter
类来创建自己的自定义 Formatter 类,并将其附加到任何处理器中。
1package com.journaldev.log;
2
3import java.util.Date;
4import java.util.logging.Formatter;
5import java.util.logging.LogRecord;
6
7public class MyFormatter extends Formatter {
8
9 @Override
10 public String format(LogRecord record) {
11 return record.getThreadID()+"::"+record.getSourceClassName()+"::"
12 +record.getSourceMethodName()+"::"
13 +new Date(record.getMillis())+"::"
14 +record.getMessage()+"\n";
15 }
16
17}
Java 日志管理器 - Java Log Manager
「java.util.logging.LogManager」是读取日志配置、创建和维护日志实例的类。
1LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
以下是Java Logging API配置文件的一个例子,如果我们不指定任何配置,则从JRE Homelib/logging.properties
文件中读取。
1handlers= java.util.logging.ConsoleHandler
2
3.level= FINE
4
5# default file output is in user's home directory.
6java.util.logging.FileHandler.pattern = %h/java%u.log
7java.util.logging.FileHandler.limit = 50000
8java.util.logging.FileHandler.count = 1
9java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
10
11# Limit the message that are printed on the console to INFO and above.
12java.util.logging.ConsoleHandler.level = INFO
13java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
14
15com.journaldev.files = SEVERE
这里有一个简单的Java程序,展示了Java中的Logger的使用。
1package com.journaldev.log;
2
3import java.io.FileInputStream;
4import java.io.IOException;
5import java.util.logging.ConsoleHandler;
6import java.util.logging.FileHandler;
7import java.util.logging.Handler;
8import java.util.logging.Level;
9import java.util.logging.LogManager;
10import java.util.logging.Logger;
11
12public class LoggingExample {
13
14 static Logger logger = Logger.getLogger(LoggingExample.class.getName());
15
16 public static void main(String[] args) {
17 try {
18 LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
19 } catch (SecurityException | IOException e1) {
20 e1.printStackTrace();
21 }
22 logger.setLevel(Level.FINE);
23 logger.addHandler(new ConsoleHandler());
24 //adding custom handler
25 logger.addHandler(new MyHandler());
26 try {
27 //FileHandler file name with max size and number of log files limit
28 Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
29 fileHandler.setFormatter(new MyFormatter());
30 //setting custom filter for FileHandler
31 fileHandler.setFilter(new MyFilter());
32 logger.addHandler(fileHandler);
33
34 for(int i=0; i<1000; i++){
35 //logging messages
36 logger.log(Level.INFO, "Msg"+i);
37 }
38 logger.log(Level.CONFIG, "Config data");
39 } catch (SecurityException | IOException e) {
40 e.printStackTrace();
41 }
42 }
43
44}
當您在 Java 記錄器示例程式上執行時,您會注意到 CONFIG 記錄不會在檔案中打印,這是由於 MyFilter 類別。
1package com.journaldev.log;
2
3import java.util.logging.Filter;
4import java.util.logging.Level;
5import java.util.logging.LogRecord;
6
7public class MyFilter implements Filter {
8
9 @Override
10 public boolean isLoggable(LogRecord log) {
11 //don't log CONFIG logs in file
12 if(log.getLevel() == Level.CONFIG) return false;
13 return true;
14 }
15
16}
此外,输出格式将与MyFormatter类定义相同。
11::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg977
21::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg978
31::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg979
41::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg980
如果我们不将自己的 Formatter 类添加到 FileHandler 中,则日志消息将如下打印。
1<record>
2 <date>2012-12-14T17:03:13</date>
3 <millis>1355533393319</millis>
4 <sequence>996</sequence>
5 <logger>com.journaldev.log.LoggingExample</logger>
6 <level>INFO</level>
7 <class>com.journaldev.log.LoggingExample</class>
8 <method>main</method>
9 <thread>1</thread>
10 <message>Msg996</message>
11</record>
控制台日志消息将具有以下格式:
1Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
2INFO: Msg997
3Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
4INFO: Msg998
5Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
6INFO: Msg998
Below image shows the final Java Logger example project. That's all for Logger in Java and Java Logger Example. You can download the project from below link.
参考: Java Logging API