Сәлеметсіз бе! Дәрістерді жазу кезінде мен нақты жұмыста белгілі бір тақырып міндетті түрде қолданылатынын ерекше атап өтемін.
Сонымен, НАЗАР АУДАРЫҢЫЗ! Бүгін біз қозғайтын тақырып жұмыстың бірінші күнінен бастап барлық жобаларыңызда сізге пайдалы болады. Біз ағаш кесу туралы сөйлесеміз. Бұл тақырып мүлде қиын емес (тіпті оңай дер едім). Бірақ сіздің бірінші жұмысыңызда әлі де айқын нәрселермен күресу үшін стресс жеткілікті болады, сондықтан оны қазір мұқият сұрыптап алғаныңыз жөн :) Сонымен, бастайық. Тіркеу дегеніміз не? Тіркеу - бұл бағдарламаның жұмысы туралы деректерді жазу. Бұл деректер жазылатын орын « журнал » деп аталады. Бірден екі сұрақ туындайды: қайда және қандай деректер жазылады? «Қайда» деп бастайық. Бағдарлама жұмысының деректерін әртүрлі жерлерде жазуға болады. Мысалы, оқу кезінде сіз консольге деректерді жиі пайдаланасыз ![Сізге журнал жүргізу не үшін қажет - 2]()
Ескерту - бұл нұсқаулық Maven қолдануды білмейтін студенттер. Егер сіз оны қалай пайдалану керектігін білсеңіз, одан бастаған жөн: бұл әдетте әлдеқайда оңай.Егер сіз Maven қолдансаңыз , мына тәуелділікті қосыңыз:
System.out.println()
. Бұл ең қарапайым болса да, нағыз журнал жүргізу. Әрине, бұл клиент немесе өнімді қолдау тобы үшін өте ыңғайлы емес: олар IDE орнатуды және консольді бақылауды қаламайтыны анық :) Сондай-ақ ақпаратты жазудың көбірек таныс форматы бар - мәтіндік файлда. Адамдарға оларды осылай оқу оңайырақ және сақтау оңайырақ! Енді екінші сұрақ: журналға бағдарламаның жұмысы туралы қандай мәліметтер жазылуы керек? Бірақ мұнда бәрі сізге байланысты! Java журналын тіркеу жүйесі өте икемді. Сіз оны бағдарламаңыздың барлық орындалу барысы тіркелетін етіп конфигурациялай аласыз. Бір жағынан бұл жақсы. Бірақ екінші жағынан, егер бәрі сонда жазылған болса, Facebook немесе Twitter журналдары қандай өлшемге жететінін елестетіп көріңіз. Мұндай ірі компаниялардың тіпті осы көлемдегі ақпаратты сақтау мүмкіндігі болуы мүмкін. Бірақ 500 гигаbyte мәтіні бар журналдардағы бір маңызды қате туралы ақпаратты іздеу қаншалықты қиын болатынын елестетіп көріңізші? Шөптегі инеден де жаман. Сондықтан Java жүйесінде жүйеге кіру журналға (журналға) тек қате деректері жазылатындай етіп конфигурациялануы мүмкін. Немесе тіпті маңызды қателер туралы! Дегенмен, «Java жүйесіне кіру» деген сөз мүлдем дұрыс емес. Шындығында, тіркеу қажеттілігі бағдарламашылар арасында тілге бұл функция қосылмай тұрып пайда болды. Java-ның жеке журналдар кітапханасы болған кезде барлығы log4j кітапханасын пайдаланып жүр. Java-да кірудің пайда болу тарихы шын мәнінде өте ұзақ және мазмұнды; бос уақытта сіз бұл жазбаны Habré сайтынан оқи аласыз . Бір сөзбен айтқанда, Java-ның өзінің жеке журналдар кітапханасы бар, бірақ оны ешкім қолданбайды деуге болады :) Кейінірек бірнеше түрлі журналдар кітапханалары пайда болып, барлық бағдарламашылар басқаларын пайдалана бастағанда, үйлесімділік мәселесі туындады. Адамдардың әртүрлі интерфейстері бар ондаған әртүрлі кітапханаларды пайдаланып бір нәрсені істеуіне жол бермеу үшін slf4j абстракциялық құрылымы жасалды.(«Java үшін қызмет журналының қасбеті»). Ол абстракциялау деп аталады, себебі сіз slf4j сыныптарын қолданып, олардың әдістерін шақырғаныңызға қарамастан, оларда барлық алдыңғы журнал жүргізу құрылымдары жұмыс істейді: log4j, стандартты java.util.logging және т.б. Егер сізге қазіргі уақытта басқа кітапханаларда жоқ log4j кейбір ерекше мүмкіндіктері қажет болса, бірақ жобаны осы кітапханаға қатаң байланыстырғыңыз келмесе, жай ғана slf4j пайдаланыңыз. Ол қазірдің өзінде log4j әдістерін «тартады». Ойыңызды өзгертіп, log4j мүмкіндіктері енді қажет емес деп шешсеңіз, басқа кітапхананы пайдалану үшін «ораманы» (яғни, slf4j) қайта конфигурациялау қажет. Сіздің codeыңыз жұмысын тоқтатпайды, өйткені онда сіз белгілі бір кітапхананың емес, slf4j әдістерін шақырасыз. Шағын ауытқу. Келесі мысалдар жұмыс істеуі үшін slf4j кітапханасын осы жерден және log4j кітапханасын осы жерден жүктеп алуыңыз керек . Әрі қарай, біз мұрағатты ашып, қажет jar файлдарын Intellij IDEA арқылы сынып жолына қосуымыз керек. Мәзір элементтері: Файл -> Жоба құрылымы -> Кітапханалар Қажетті банкаларды таңдап, оларды жобаға қосыңыз (біз жүктеп алған мұрағаттарда көптеген банкалар бар, суреттерден сізге керектілерін қараңыз) ![Сізге журнал жүргізу не үшін қажет - 2](https://cdn.javarush.com/images/article/09c92a9d-03af-405e-88f9-9ff66145ba8e/1024.jpeg)
![Сізге журнал жүргізу не үшін қажет - 3](https://cdn.javarush.com/images/article/c87a7e99-c90c-45c5-98a9-109db7daaced/1024.jpeg)
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.14.0</version>
</dependency>
Керемет, біз параметрлерді реттедік :) slf4j қалай жұмыс істейтінін қарастырайық. Бағдарламаның орындалу барысы бір жерде жазылғанына қалай көз жеткізе аламыз? Ол үшін бізге екі нәрсе керек - тіркеуші және қосымша . Біріншіден бастайық. Тіркеуші - бұл іс қағаздарын жүргізуді толығымен басқаратын an object . Тіркелгіні жасау өте оңай: ол статикалық әдіс арқылы орындалады - 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 record!!!");
LOGGER.error("В программе возникла ошибка!");
}
}
Консоль шығысы: ERROR StatusLogger Log4j 2 конфигурация файлы табылмады. Әдепкі конфигурацияны пайдалану (тек қателерді консольге тіркеу) немесе пайдаланушы бағдарламамен қамтамасыз етілген конфигурацияларды. Log4j 2 ішкі баптандыру журналын көрсету үшін 'log4j2.debug' жүйе сипатын орнатыңыз. Log4j 2 15:49:08.907 конфигурациялау туралы нұсқауларды https://logging.apache.org/log4j/2.x/manual/configuration.html сайтынан қараңыз 15:49:08.907 [негізгі] ERROR MyTestClass - Бағдарламада қате орын алды! Мұнда не көріп тұрмыз? Алдымен қате туралы хабарды көреміз. Бұл қазір бізде қажетті параметрлердің жоқтығынан пайда болды. Сондықтан, біздің тіркеуші енді тек қате туралы хабарларды (ERROR) және тек консольге шығара алады. Әдіс logger.info()
орындалмады. Бірақ logger.error()
ол жұмыс істеді! Консоль ағымдағы күнді, қате орын алған әдісті ( main
), ERROR сөзін және хабарымызды көрсетеді! ERROR – тіркеу деңгейі. Жалпы алғанда, журнал жазбасы ERROR сөзімен белгіленсе, бұл бағдарламаның сол нүктесінде қате орын алғанын білдіреді. Егер жазба INFO сөзімен белгіленсе, бұл бағдарламаның қалыпты жұмысы туралы жай ғана ағымдағы ақпаратты білдіреді. SLF4J кітапханасында тіркеуді икемді түрде конфигурациялауға мүмкіндік беретін бірнеше түрлі тіркеу деңгейлері бар. Оларды басқару өте оңай: барлық қажетті логика қазірдің өзінде сыныпқа енгізілген Logger
. Сізге тек қажетті әдістерді шақыру қажет. Кәдімгі хабарлама жібергіңіз келсе, телефонға қоңырау шалыңыз logger.info()
. Қате туралы хабар - logger.error()
. Ескертуді көрсету - Енді қосымшаlogger.warn()
туралы сөйлесейік . Қосымша - деректеріңіз келетін орын. Деректер көзіне қарама-қарсы «В нүктесі» деп айтуға болады. Әдепкі бойынша, деректер консольге шығарылады. Алдыңғы мысалда бізге ештеңе конфигурациялаудың қажеті жоқ екенін ескеріңіз: мәтін консольдің өзінде пайда болды, бірақ log4j кітапханасындағы тіркеуші консольге ҚАТЕ деңгейіндегі хабарларды ғана шығара алады. Адамдарға мәтіндік файлдан журналдарды оқу және журналдарды бірдей файлдарда сақтау ыңғайлырақ екені анық. Тіркелгінің әдепкі әрекетін өзгерту үшін файл қосымшасын конфигурациялауымыз керек . Бастау үшін log4j.xml файлын src қалтасында немесе Maven пайдалансаңыз ресурстар қалтасында немесе Maven пайдаланған жағдайда ресурстар қалтасында жасауыңыз керек . Сіз xml пішімімен бұрыннан таныссыз, біз жақында ол туралы лекция оқыдық :) Оның мазмұны мынандай болады:
<?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>
Бұл өте күрделі емес сияқты :) Бірақ әлі де мазмұнды қарастырайық.
<Configuration status="INFO">
Бұл күйді тіркеуші деп аталады. Ол біздің тіркеушіге қатысты емес және ішкі түрде log4j арқылы пайдаланылады. Status=”INFO” орнына күй=“TRACE” параметрін орнатуға болады және log4j ішкі жұмысы туралы барлық ақпарат консольге шығарылады (мәртебесін тіркеуші консольге деректерді шығарады, тіпті бағдарламаның қосымшасы файл болса да. -негізделген). Бұл бізге қазір қажет емес, сондықтан біз бәрін сол күйінде қалдырамыз.
<Appenders>
<File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
Мұнда біз қосымшаны жасаймыз. Tag <File>
оның файл болатынын көрсетеді. name="MyFileAppender"
- біздің қосымшамыздың аты. fileName="C:\Users\Username\Desktop\testlog.txt"
— барлық деректер жазылатын журнал файлының жолы. append="true"
— файлдың соңына қосымша деректерді жазу қажет пе. Біздің жағдайда бұл солай болады. "false" күйіне орнатылса , бағдарлама қайта іске қосылған сайын ескі журнал мазмұны жойылады. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
- Бұл пішімдеу параметрлері. Мұнда журналдағы мәтін пішімін реттеу үшін тұрақты өрнектерді пайдалана аламыз.
<Loggers>
<Root level="INFO">
<AppenderRef ref="MyFileAppender"/>
</Root>
</Loggers>
Мұнда тіркеу деңгейін (түбірлік деңгей) көрсетеміз. Бізде INFO деңгейі орнатылған: яғни INFO деңгейінен жоғары деңгейлердегі барлық хабарламалар (жоғарыда қарастырған кестеге сәйкес) журналға қосылмайды. Біздің бағдарламада 3 хабарлама болады: бір АҚПАРАТ, бір ЕСКЕРТУ және бір ҚАТЕ. Ағымдағы конфигурациямен барлық 3 хабарлама журналға жазылады. Түбір деңгейін ERROR деп өзгертсеңіз, LOGGER.error() соңғы хабары ғана журналға жазылады. Сонымен қатар, мұнда қосымшаға сілтеме орналастырылған. Мұндай сілтеме жасау үшін тегтің ішінде <Root>
тег жасап <ApprenderRef>
, оған параметрді қосу керек ref=”Name твоего аппендера”
. Сіз ұмытып қалсаңыз, қосымшаның атын осында жасадық: <File name="MyFileAppender"
Міне, біздің бағдарламамыздың 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("Начало работы программы!!!");
try {
LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
System.out.println(12/0);
} catch (ArithmeticException x) {
LOGGER.error("Ошибка! Произошло деление на ноль!");
}
}
}
Әрине, бұл аздап қисық (RuntimeException-ті ұстау - орташа идея), бірақ бұл біздің мақсаттарымызға өте ыңғайлы :) Әдісімізді main()
қатарынан 4 рет іске қосып, testlog.txt файлымызды қарастырайық. Оны алдын ала жасаудың қажеті жоқ: кітапхана мұны автоматты түрде жасайды. Барлығы жұмыс істеді! :) Енді сізде конфигурацияланған тіркеуші бар. Сіз бұрын жазған кейбір бағдарламалармен ойнай аласыз, тіркеуші қоңырауларды барлық әдістерге қосып, нәтиже журналын қараңыз :) Қосымша оқу үшін мен осы мақаланы өте ұсынамын . Онда ағаш кесу тақырыбы жан-жақты талқыланады, оны бір отырыста оқу оңайға соқпайды. Бірақ ол көптеген пайдалы қосымша ақпаратты қамтиды. Мысалы, егер біздің testlog.txt файлымыз белгілі бір өлшемге жетсе, ол жаңа мәтіндік файл жасайтындай логгерді конфигурациялауды үйренесіз :) Осымен сабағымыз аяқталды! Бүгін сіз өте маңызды тақырыпты білдіңіз және бұл білім сізге болашақ жұмысыңызда міндетті түрде пайдалы болады. Келесі кездескенше! :)
GO TO FULL VERSION