Поиск по сайту:

Регистратор на Java — пример ведения журнала Java


Сегодня мы рассмотрим Logger на Java. Java Logger обеспечивает регистрацию в программировании на Java.

Регистратор на Java

Java-логгер

java.util.logging.Logger — это класс, используемый для регистрации сообщений приложения в API ведения журналов Java. Мы можем создать java Logger с очень простым однострочным кодом:

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

Уровни ведения журнала Java

java.util.logging.Level определяет различные уровни ведения журнала Java. В java существует семь уровней ведения журнала.

  1. СЕРЬЕЗНЫЙ (самый высокий)
  2. ВНИМАНИЕ
  3. ИНФОРМАЦИЯ
  4. НАСТРОЙКА
  5. ОТЛИЧНО
  6. ТОЧНЕЕ
  7. ЛУЧШИЙ

Есть два других уровня ведения журнала: OFF, при котором все сообщения отключаются, и ALL, при котором регистрируются все сообщения. Мы можем установить уровень регистратора, используя следующий код:

logger.setLevel(Level.FINE);

Журналы будут созданы для всех уровней, равных или превышающих уровень регистратора. Например, если уровень ведения журнала установлен на ИНФОРМАЦИЯ, журналы будут генерироваться для сообщений ИНФО, ПРЕДУПРЕЖДЕНИЕ и СЕРЬЕЗНЫЕ сообщения.

Обработчики журналирования Java

Мы можем добавить несколько обработчиков в регистратор Java, и всякий раз, когда мы регистрируем какое-либо сообщение, каждый обработчик будет обрабатывать его соответствующим образом. Java Logging API предоставляет два обработчика по умолчанию.

  1. ConsoleHandler: этот обработчик записывает все сообщения журнала в консоль.
  2. FileHandler: этот обработчик записывает все сообщения журнала в файл в формате XML.

Мы также можем создавать собственные обработчики для выполнения определенных задач. Чтобы создать собственный класс Handler, нам нужно расширить класс java.util.logging.Handler или любой из его подклассов, таких как StreamHandler, SocketHandler и т. д. Вот пример пользовательского обработчика ведения журнала java:

package com.journaldev.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

Форматеры используются для форматирования сообщений журнала. В API ведения журналов Java есть два доступных средства форматирования.

  1. SimpleFormatter: этот модуль форматирования создает текстовые сообщения с основной информацией. ConsoleHandler использует этот класс средства форматирования для вывода сообщений журнала на консоль.
  2. XMLFormatter: этот модуль форматирования создает XML-сообщение для журнала, FileHandler использует XMLFormatter в качестве модуля форматирования по умолчанию.

Мы можем создать собственный пользовательский класс Formatter, расширив класс java.util.logging.Formatter и прикрепив его к любому из обработчиков. Вот пример простого пользовательского класса форматирования.

package com.journaldev.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 Log Manager

java.util.logging.LogManager — это класс, который считывает конфигурацию ведения журнала, создает и поддерживает экземпляры регистратора. Мы можем использовать этот класс для установки собственной конфигурации приложения.

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

Вот пример файла конфигурации Java Logging API. Если мы не указываем какую-либо конфигурацию, она считывается из файла JRE Home 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.journaldev.files = SEVERE

Вот простая Java-программа, показывающая использование Logger в Java.

package com.journaldev.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/pankaj/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.journaldev.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.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg977
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg978
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg979
1::com.journaldev.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.journaldev.log.LoggingExample</logger>
  <level>INFO</level>
  <class>com.journaldev.log.LoggingExample</class>
  <method>main</method>
  <thread>1</thread>
  <message>Msg996</message>
</record>

Сообщения журнала консоли будут иметь следующий формат:

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

Скачать пример проекта Java Logger

Ссылка: API ведения журналов Java