- Логирование в Java – Logger
- Компоненты
- Что такое Логгеры (Logger) в Java?
- Как создать?
- Синтаксис
- Уровни
- Пример с использованием пакета org.apache.log4j.*
- Пример с использованием пакета java.util.logging
- Файл свойств пакета Log4j и Java Util
- Пример файла свойств Log4j
- Пример файла свойств пакета Java Util
- Регистрация событий
- Способ 1
- Способ 2
- Appender или Handlers
- Layout или Formatters
- Use Log4j ObjectRenderer To Log Java Object
- 1. Create a Java Class To Implements The org.apache.log4j.or.ObjectRenderer Interface.
- 2. Override The LogJavaObjectInfo Class toString() Method.
- 3. Example Project Full Source Code.
Логирование в Java – Logger
При создании приложений мы часто сталкиваемся с ошибками, которые необходимо отлаживать. Итак, с помощью логов мы можем легко получить информацию о том, что происходит в приложении, с записью ошибок и необычных обстоятельств. Теперь вам может показаться, что почему бы не использовать оператор System.out.print() в Java.
Проблема с этими утверждениями состоит в том, что сообщения журнала будут печататься только на консоли. Поэтому, как только вы закроете консоль автоматически, все журналы будут потеряны. Они не хранятся постоянно и будут отображаться один за другим, так как это однопоточная среда.
Чтобы избежать таких проблем, логирование в Java упрощается с помощью API, предоставляемого через пакет java.util.logging пакет org.apache.log4j.* .
Компоненты
Компоненты ведения журнала помогают разработчику создавать их, передавать в соответствующее место назначения и поддерживать надлежащий формат. Ниже приведены три компонента:
- Loggers – отвечает за сбор записей журнала и передачу их соответствующему заявителю.
- Appenders или Handlers – они отвечают за запись событий журнала в пункт назначения. Аппендеры форматируют события с помощью макетов перед отправкой результатов.
- Layouts или Formatters – отвечает за определение того, как данные выглядят, когда они появляются в записи журнала.
Вы можете обратиться к изображению ниже для работы всех трех компонентов:
Когда приложение выполняет вызов регистрации, компонент Logger записывает событие в LogRecord и перенаправляет его соответствующему Appender. Затем он форматировал запись, используя формат в соответствии с требуемым форматом. Помимо этого, вы также можете использовать более одного фильтра, чтобы указать, какие Appenders следует использовать для событий.
Что такое Логгеры (Logger) в Java?
Логгеры (Logger) в Java – это объекты, которые запускают события журнала. Они создаются и вызываются в коде приложения, где генерируют события журнала перед передачей их следующему компоненту, который является Appender.
Вы можете использовать несколько логгеров в одном классе для ответа на различные события или использовать в иерархии. Они обычно называются с использованием иерархического пространства имен, разделенных точками. Кроме того, все имена Logger должны основываться на классе или имени пакета зарегистрированного компонента.
Кроме того, каждый логгер отслеживает ближайшего существующего предка в пространстве имен, а также имеет связанный с ним «уровень».
Как создать?
Вы должны использовать Logger.getLogger() . Метод getLogger() идентифицирует имя Logger и принимает строку в качестве параметра. Таким образом, если Logger уже существует, он возвращается, в противном случае создается новый.
Синтаксис
static Logger logger = Logger.getLogger(SampleClass.class.getName());
Здесь SampleClass – это имя класса, для которого мы получаем объект Logger.
Уровни
Уровни журналов используются для классификации их по степени серьезности или влиянию на стабильность приложения. Пакет org.apache.log4j.* и java.util.logging предоставляют разные уровни ведения журнала.
Пакет org.apache.log4j.* предоставляет следующие уровни в порядке убывания:
Пакет java.util.logging предоставляет следующие уровни в порядке убывания:
- SEVERE(HIGHEST LEVEL);
- WARNING;
- INFO;
- CONFIG;
- FINE;
- FINER;
- FINEST(LOWEST LEVEL).
Помимо этого, вышеприведенный пакет также предоставляет два дополнительных уровня ALL и OFF используются для регистрации всех сообщений и отключения регистрации соответственно.
Пример с использованием пакета org.apache.log4j.*
import org.apache.log4j.Logger; public class Customer < static Logger logger = Logger.getLogger(Customer.class); public static void main(String[] args) < logger.error("ERROR"); logger.warn("WARNING"); logger.fatal("FATAL"); logger.debug("DEBUG"); logger.info("INFO"); System.out.println("Final Output"); >>
Таким образом, если в нашем файле log4j.properties ваш вывод является корневым логгером уровня WARN, то все сообщения об ошибках с более высоким приоритетом, чем WARN, будут напечатаны, как показано ниже:
Вы также можете установить уровень с помощью метода setLevel() из пакета java.util.logging , как java.util.logging ниже:
logger.setLevel(Level.WARNING);
Пример с использованием пакета java.util.logging
package edureka; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.*; class EdurekaLogger < private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); public void sampleLog() < LOGGER.log(Level.WARNING, "Welcome to Edureka!"); >> public class Customer < public static void main(String[] args) < EdurekaLogger obj = new EdurekaLogger(); obj.sampleLog(); LogManager slg = LogManager.getLogManager(); Logger log = slg.getLogger(Logger.GLOBAL_LOGGER_NAME); log.log(Level.WARNING, "Hi! Welcome from Edureka"); >>
Чтобы включить вход в приложение с помощью пакета org.apache.log4j.* Или пакета java.util.logging , необходимо настроить файл свойств. Далее в этой статье о Logger в Java давайте обсудим файл свойств обоих из них.
Файл свойств пакета Log4j и Java Util
Пример файла свойств Log4j
# Enable Root logger option log4j.rootLogger=INFO, file, stdout # Attach appenders to print file log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=E:loglogging.log log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=5 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %-5p %c:%L - %m%n # Attach appenders to print on console log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %-5p %c:%L - %m%n
- Файл свойств Log4j создается внутри папки src проекта.
- log4j.appender.file = org.apache.log4j.RollingFileAppender -> Печатает все журналы в файле
- log4j.appender.stdout = org.apache.log4j.ConsoleAppender -> Печатает все журналы в консоли
- log4j.appender.file.File = D: loglogging.log -> Указывает расположение файла журнала
- log4j.appender.file.MaxFileSize = 10 МБ -> Максимальный размер файла журнала до 10 МБ
- log4j.appender.file.MaxBackupIndex = 5 -> Ограничивает количество файлов резервных копий до 5
- log4j.appender.file.layout = org.apache.log4j.PatternLayout -> Указывает шаблон, в котором журналы будут печататься в файл журнала.
- log4j.appender.file.layout.ConversionPattern =% d % -5p% c :% L -% m% n -> Устанавливает шаблон преобразования по умолчанию.
Пример файла свойств пакета Java Util
handlers= java.util.logging.ConsoleHandler .level= WARNING # Output will be stored in the default directory java.util.logging.FileHandler.pattern = %h/java%u.log java.util.logging.FileHandler.limit = 60000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter # Level of logs will be limited to WARNING and above. java.util.logging.ConsoleHandler.level = WARNING java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
- java.util.logging.FileHandler.pattern =% h / java% u.log -> Файлы журнала будут записаны в C: TEMPjava1.log
- java.util.logging.FileHandler.limit = 50000 -> Максимальная сумма, которую регистратор записывает в один файл в байтах.
- java.util.logging.FileHandler.count = 1 -> Указывает количество выходных файлов
- java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter -> Упоминает форматер, используемый для форматирования. Здесь используется XML Formatter.
- java.util.logging.ConsoleHandler.level = WARNING -> Устанавливает уровень журнала по умолчанию для WARNING
- java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter -> Указывает форматер, используемый всеми ConsoleHandler. Здесь используется SimpleFormatter.
Регистрация событий
Чтобы регистрировать события в Java, вы должны убедиться, что вы назначаете уровень, чтобы легко отфильтровать события. Чтобы назначить уровень и упомянуть сообщение, вы можете использовать следующие методы:
Способ 1
logger.log(Level.INFO, “Display message”);
Here, level is INFO and the message to be printed is "Display Message".
Способ 2
logger.info(“Display message”);
Чтобы убедиться, что Logger регистрирует только события, которые находятся на уровне или выше уровня INFO, вы можете использовать метод setLevel(), описанный выше.
Appender или Handlers
Appender или Handlers отвечают за запись событий журнала в пункт назначения. Каждый регистратор имеет доступ к нескольким обработчикам и получает сообщение журнала от регистратора. Затем Appenders используют средства форматирования или макеты для форматирования событий и отправки их в соответствующее место назначения.
Appender можно отключить с помощью метода setLevel (Level.OFF). Два наиболее стандартных обработчика в пакете java.util.logging :
- FileHandler: записать сообщение журнала в файл.
- ConsoleHandler: записывает сообщение журнала в консоль.
Layout или Formatters
Используются для форматирования и преобразования данных в журнале событий. Каркасы журналов предоставляют макеты для HTML, XML, Syslog, JSON, простого текста и других журналов.
Use Log4j ObjectRenderer To Log Java Object
The log is an essential feature for each java application, and log4j is one of many uses. Generally, we use the java code logger.info(“Hello World”); to log a String value. it will output “Hello World” in the appender destination.
But how about logging a java object like this logger.info(new LogJavaObjectInfo());. Generally, it will output data like INFO [main] (LogJavaObjectInfo.java:18) – [email protected].
This is not human-readable and friendly. To resolve this issue, we have the below solutions.
1. Create a Java Class To Implements The org.apache.log4j.or.ObjectRenderer Interface.
- The custom class name is com.dev2qa.java.basic.log4jexample.LogJavaObjectInfoRenderer.
- You should override the method doRender(Object obj) to return customize String value when logging obj ( This renderer decorated java object ).
public class LogJavaObjectInfoRenderer implements ObjectRenderer < @Override public String doRender(Object obj) < // Convert the obj parameter to LogJavaObjectInfo class object. LogJavaObjectInfo logJavaObjectInfo = (LogJavaObjectInfo)obj; // Invoke the converted object's method. String ret = logJavaObjectInfo.getUserName() + " : " + logJavaObjectInfo.getMessage(); return ret; >>
# This means when log LogJavaObjectInfo object, use LogJavaObjectInfoRenderer to output String data. log4j.renderer.com.dev2qa.java.basic.log4jexample.LogJavaObjectInfo=com.dev2qa.java.basic.log4jexample.LogJavaObjectInfoRenderer # Define root logger, logger level is INFO, appender name is appender1 log4j.rootLogger = INFO, appender1 # Set appender1 to be a Console appender that will print log data to console. log4j.appender.appender1=org.apache.log4j.ConsoleAppender # Define appender1's layout log4j.appender.appender1.layout=org.apache.log4j.PatternLayout log4j.appender.appender1.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
public class LogJavaObjectInfo < private String userName; private String message; public static void main(String[] args) < // Get root logger. Logger logger = Logger.getRootLogger(); // Create a new object. LogJavaObjectInfo logJavaObjectInfo = new LogJavaObjectInfo(); // Set object's properties. logJavaObjectInfo.setUserName("Jerry"); logJavaObjectInfo.setMessage("Welcome to dev2qa.com"); // Log the object use root logger. logger.info(logJavaObjectInfo); >public String getUserName() < return userName; >public void setUserName(String userName) < this.userName = userName; >public String getMessage() < return message; >public void setMessage(String message) < this.message = message; >>
INFO [main] (LogJavaObjectInfo.java:25) - Jerry : Welcome to dev2qa.com
2. Override The LogJavaObjectInfo Class toString() Method.
@Override public String toString()
INFO [main] (LogJavaObjectInfo.java:25) - This message is generated from toString() method. Jerry : Welcome to dev2qa.com
3. Example Project Full Source Code.
D:\WORK\DEV2QA.COM-EXAMPLE-CODE\JAVACOREEXAMPLEPROJECT\SRC\COM\DEV2QA\JAVA\BASIC\LOG4JEXAMPLE log4j.properties Log4jBasicExample.java LogJavaObjectInfo.java LogJavaObjectInfoRenderer.java
# Define com.dev2qa.java.basic.log4jexample class logger log4j.logger.com.dev2qa.java.basic.log4jexample = warn, appender1 # Set appender1 to be a Console appender which will print log data to console. log4j.appender.appender1=org.apache.log4j.ConsoleAppender # Define appender1's layout log4j.appender.appender1.layout=org.apache.log4j.PatternLayout log4j.appender.appender1.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n # Define root logger, logger level is INFO, appender name is appender2 log4j.rootLogger = info, appender2 # Appender2 will save log data to file. log4j.appender.appender2=org.apache.log4j.FileAppender log4j.appender.appender2.File=C:/WorkSpace/logData.log log4j.appender.appender2.layout=org.apache.log4j.PatternLayout log4j.appender.appender2.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
package com.dev2qa.java.basic.log4jexample; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class Log4jBasicExample < public static void main(String[] args) < //You can specify log4j.properties location if you do not save it in CLASSPATH directory. PropertyConfigurator.configure("C:/WorkSpace/dev2qa.com/Code/src/com/dev2qa/java/basic/log4jexample/log4j.properties"); Logger rootLogger = Logger.getRootLogger(); // Get this class related logger object. Logger logger = Logger.getLogger(Log4jBasicExample.class); logger.debug("This is debug message."); logger.info("This is info message."); logger.warn("This is warn message."); logger.error("This is error message."); logger.fatal("This is fatal message."); rootLogger.debug("This is rootLogger debug message."); rootLogger.info("This is rootLogger info message."); rootLogger.warn("This is rootLogger warn message."); rootLogger.error("This is rootLogger error message."); rootLogger.fatal("This is rootLogger fatal message."); >>
package com.dev2qa.java.basic.log4jexample; import org.apache.log4j.Logger; public class LogJavaObjectInfo < private String userName; private String message; public static void main(String[] args) < // Get root logger. Logger logger = Logger.getRootLogger(); // Create a new object. LogJavaObjectInfo logJavaObjectInfo = new LogJavaObjectInfo(); // Set object's properties. logJavaObjectInfo.setUserName("Jerry"); logJavaObjectInfo.setMessage("Welcome to dev2qa.com"); // Log the object use log4j root logger. logger.info(logJavaObjectInfo); >public String getUserName() < return userName; >public void setUserName(String userName) < this.userName = userName; >public String getMessage() < return message; >public void setMessage(String message) < this.message = message; >@Override public String toString() < StringBuffer retBuf = new StringBuffer(); retBuf.append("This message is generated from toString() method. "); retBuf.append(this.getUserName()); retBuf.append(" : "); retBuf.append(this.getMessage()); return retBuf.toString(); >>
package com.dev2qa.java.basic.log4jexample; import org.apache.log4j.or.ObjectRenderer; public class LogJavaObjectInfoRenderer implements ObjectRenderer < @Override public String doRender(Object obj) < // Convert the obj parameter to LogJavaObjectInfo class object. LogJavaObjectInfo logJavaObjectInfo = (LogJavaObjectInfo)obj; // Invoke the converted object's method. String ret = logJavaObjectInfo.getUserName() + " : " + logJavaObjectInfo.getMessage(); return ret; >>