CodeGym /Java блог /Случаен /Регистриране на Java
John Squirrels
Ниво
San Francisco

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

Публикувано в групата
здрасти Когато пиша уроците, специално наблягам, ако има конкретна тема, която ще бъде абсолютно необходима в реалната работа. Така че, СЛУШАЙТЕ! Темата, която ще разгледаме днес, определено ще бъде полезна във всички ваши проекти от първия ден на работа. Ще говорим за Java Logging. Тази тема не е ниHow сложна (дори бих казал лесна). Но ще имате достатъчно очевидни неща, върху които да наблягате на първата си работа, така че е по-добре да го разберете напълно точно сега :) Е, нека започнем.

Какво е логване в Java?

Регистрирането е акт на записване на данни за работата на дадена програма. Мястото, където записваме тези данни, се нарича "дневник". Веднага възникват два въпроса: Howви данни се записват и къде? Да започнем с "къде". Можете да записвате данни за работата на дадена програма на много различни места. Например, по време на обучението си често System.out.println()за извеждане на данни към конзолата. Това наистина е логване, макар и в най-простата си форма. Разбира се, това не е много удобно за потребителите or екипа за поддръжка на продукта: очевидно те няма да искат да инсталират IDE и да наблюдават конзолата :) Има по-обичаен формат за запис на информация: текстови файлове. Хората се чувстват много по-удобно да четат данни в този формат и със сигурност той е много по-удобен за съхранение на данни! Сега вторият въпрос: Howви програмни данни трябва да се регистрират? Това зависи изцяло от вас! Системата за регистриране на Java е много гъвкава. Можете да го конфигурирате да регистрира всичко, което прави вашата програма. От една страна, това е добре. Но от друга страна, представете си колко големи биха бor регистрационните файлове на Facebook or Twitter, ако записват всичко в тях. Тези големи компании вероятно имат способността да съхраняват толкова много данни. Но представете си колко трудно би било да се намери информация за една критична грешка в 500 гигаbyteа текстови регистрационни файлове? Това би било по-лошо от търсенето на игла в купа сено. Съответно Java може да бъде конфигуриран да регистрира само данни за грешки. Или дори само критични грешки! Въпреки това не е съвсем точно да се говори за собствената система за регистриране на Java. Факт е, че програмистите се нуждаеха от регистриране, преди тази функционалност да бъде добавена към езика. По времето, когато Java представи своя собствена библиотека за регистриране, всички вече използваха библиотеката log4j. Историята на регистриране в Java всъщност е много дълга и информативна. Накратко, Java има своя собствена библиотека за регистриране, но почти никой не я използва :) По-късно, когато се появиха няколко различни библиотеки за регистриране и започнаха да се използват от програмисти, възникнаха проблеми със съвместимостта. За да попречи на хората да преоткриват колелото в дузина различни библиотеки с различни интерфейси, беше създадена абстрактната рамка SLF4J („Фасада за регистриране на услуги за Java“). Нарича се абстрактно, защото дори ако използвате и извикате методите на класовете SLF4J, под капака те всъщност използват всички рамки за регистриране, които са бor преди: log4j, стандартната java.util.logging и други. Ако в даден момент имате нужда от няHowва специфична функция на Log4j, която липсва в други библиотеки, но не искате директно да свържете проекта си с тази библиотека, просто използвайте SLF4J. И след това го оставете да извика методите Log4j. Ако промените решението си и решите, че вече не се нуждаете от функциите на Log4j, трябва само да преконфигурирате "тук и библиотеката Log4j тук . След това разопаковайте архива и използвайте IntelliJ IDEA, за да добавите JAR файловете към classpath. Елементи от менюто: Файл -> Структура на проекта -> Библиотеки Изберете необходимите JAR файлове и ги добавете към проекта (архивите, които изтеглихме, съдържат много JAR файлове — погледнете снимките, за да видите тези, от които се нуждаете) Имайте предвид, че тази инструкция за тези Защо имаме нужда от дърводобив - 2Защо имаме нужда от дърводобив - 3ученици които не знаят How да използват Maven. Ако знаете How да използвате Maven, обикновено е по-добре (много по-лесно) да опитате да започнете от там. Ако използвате Maven , добавете тази зависимост:

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
Страхотен! Разбрахме настройките :) Да видим How работи SLF4J. Как да сме сигурни, че работата на програмата е записана някъде? За да направим това, имаме нужда от две неща: logger и appender. Да започнем с първото. Регистраторът е обект, който осигурява пълен контрол върху регистрирането. Създаването на регистратор е много лесно: правим това с помощта на статичните методи LoggerFactory.getLogger() . Параметърът на метода е класът, чиято операция ще бъде регистрирана. Нека изпълним нашия code:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
Конзолен изход:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
Какво виждаме тук? Първо виждаме съобщение за грешка. Това е резултат от факта, че сега ни липсват необходимите настройки. Съответно нашият регистратор в момента може да извежда само съобщения за грешка (ERROR) и само към конзолата. Методът logger.info() не работи. Но logger.error() направи! На конзолата виждаме текущата дата, метода, при който е възникнала грешката ( main), думата "ГРЕШКА" и нашето съобщение! ГРЕШКА е нивото на регистриране. По принцип, ако записът в регистрационния файл е маркиран с думата "ГРЕШКА", тогава в този момент в програмата е възникнала грешка. Ако записът е маркиран с думата "INFO", тогава съобщението просто представлява текуща информация за нормалната работа на програмата. Библиотеката SLF4J има много различни нива на регистриране, които ви позволяват да конфигурирате гъвкаво регистриране. Всичко е много лесно за управление: цялата необходима логика вече е в класа Java Logger . Просто трябва да извикате съответните методи. Ако искате да регистрирате рутинно съобщение, извикайте метода logger.info() . За съобщение за грешка използвайте logger.error() . За предупреждение използвайте logger.warn()

Сега нека поговорим за appender

Добавящото устройство е мястото, където отиват вашите данни. По няHowъв начин обратното на източник на данни, т.е. "точка Б". По подразбиране данните се извеждат към конзолата. Обърнете внимание, че в предишния пример не трябваше да конфигурираме нищо: текстът се появи в конзолата и регистраторът на библиотеката Log4j може да извежда само съобщения на ниво ГРЕШКА към конзолата. Очевидно е по-удобно за хората да четат и записват регистрационни файлове в текстов файл. За да променим поведението по подразбиране на регистратора, трябва да конфигурираме нашето приложение за добавяне на файлове. За да започнете, трябва да създадете файл log4j.xml директно в папката src. Вече сте запознати с XML формата: наскоро имахме урок за него :) Ето съдържанието на file:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
Тук няма нищо особено or трудно :) Но все пак нека преминем през съдържанието.
<Configuration status="INFO">
Това е така нареченият StatusLogger. Той не е свързан с нашия регистратор и се използва във вътрешните процеси на Log4j. Ако зададете status="TRACE" instead of status="INFO", и цялата информация за вътрешната работа на Log4j ще бъде показана на конзолата (StatusLogger показва данни на конзолата, дори ако нашият appender е файл). Сега не ни трябва, така че нека го оставим Howто е.

<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Тук създаваме нашия appender. Етикетът <File> показва, че това ще бъде файл за добавяне. name="MyFileAppender" задава името на приложението за добавяне. fileName="C:\Users\Username\Desktop\testlog.txt" указва пътя до регистрационния файл, където ще бъдат записани всички данни. append="true" показва дали данните трябва да бъдат записани в края на file. В нашия случай ще направим точно това. Ако зададете стойността на false, тогава старото съдържание на регистрационния файл ще се изтрива при всяко стартиране на програмата. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>показва настройките за форматиране. Тук можем да използваме регулярни изрази, за да персонализираме How се форматира текстът в нашия журнал.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Тук посочваме коренното ниво. Задали сме ниво "INFO", което означава, че всички съобщения, чиито нива са по-високи от INFO (според tableта, която разгледахме по-горе), няма да бъдат регистрирани. Нашата програма ще има 3 съобщения: едно INFO, едно WARN и едно ERROR. С текущата конфигурация всичките 3 съобщения ще бъдат регистрирани. Ако промените основното ниво на ГРЕШКА, само последното съобщение от извикването на метода LOGGER.error() ще завърши в дневника. Освен това тук влиза и препратка към добавката. За да създадете такава препратка, трябва да създадете таг <ApprenderRef> в тага <Root> и да добавите атрибута ref='your appender's name' към него. В случай, че сте забравor, това е мястото, където задаваме името на допълнителя: <. И ето нашия code!

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
Разбира се, това е малко странно (хващането на RuntimeException е съмнителна идея), но е идеално за нашите цели :) Нека изпълним метода main() 4 пъти подред и да разгледаме нашия файл testlog.txt. Не е необходимо да го създавате предварително: библиотеката ще направи това автоматично. Всичко проработи! :) Сега имате конфигуриран регистратор. Можете да си поиграете с някои от старите си програми, като добавите извиквания на logger към всеки метод. След това погледнете получения дневник :) Той разглежда темата за регистриране в дълбочина. Би било предизвикателство да се прочете всичко наведнъж. Това каза, че съдържа много допълнителна полезна информация. Например, ще научите How да конфигурирате регистратора, така че да създава нов текстов файл, ако нашият файл testlog.txt достигне определен размер :) И това приключва нашия клас! Днес се запознахте с много важна тема и това знание определено ще ви бъде полезно в бъдещата ви работа. До следващия път! :)
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION