"Кутмандуу күн, бүгүн өнөр жай сайтында окуя катталды, мен иштеп чыгуучунун анализ тобуна кошулушун суранам." Жумуштагы күндөрдүн бири ушундай башталышы мүмкүн, же эртең менен болушу мүмкүн - бул маанилүү эмес. Бирок, келгиле, башынан баштайлы. Бул жерде JavaRush көйгөйлөрүн чечүү менен, сиз иштеген жана андан күтүлгөн нерсени аткарган code жазууну үйрөнөсүз. Эгер сиз жардам бөлүмүн карасаңыз , бул дайыма эле биринчи жолу иштебей турганы көрүнүп турат. Жумушта да ошондой болот. Сиз дайыма эле көйгөйдү биринчи жолу чече албайсыз: мүчүлүштүктөр биздин түбөлүк шериктештерибиз. Сиз мүчүлүштүктөрдү окуяларды калыбына келтирүү үчүн маанилүү болуп саналат. Келгиле, бир мисал менен баштайлы. Келгиле, сизди мorция кызматкери деп элестетип көрөлү. Окуя болгон жерге сизди чакырышты (дүкөндө айнек сынды), сиз келдиңиз, алар сизден эмне болгондугу боюнча жооп күтүп жатышат. Эмнеден баштасам? Мorция кандай иштегенин билбейм. Абдан шарттуу - алар күбөлөрдү, далилдерди жана башка нерселерди издей башташат. Эгер ошол жердин өзү эмне болгонун майда-чүйдөсүнө чейин айтып бере алсачы? Мисалы, бул сыяктуу:
- 21:59 ээси ойготкучту күйгүздү (толук иштетилгенге чейин 5 мүнөт)
- 22:00 ээси эшикти жапты
- 22:05 толук ойготкучту жандыруу
- 22:06 ээси тутканы тартып алды
- 23:15 ызы-чуу сенсору күйгүзүлдү
- 23:15 Катуу үргөн иттер жанынан чуркап өтүштү
- 23:15 ызы-чуу сенсору өчүрүлгөн
- 01:17 дисплейдин сырткы айнегиндеги шок сенсору күйгүзүлдү
- 01:17 көгүчкөн айнекке учуп кетти
- 01:17 айнек сынды
- 01:17 сирена күйүп турат
- 01:17 көгүчкөн өзүн силкип, учуп кетти
java.util.Logger
: бул бири-бири менен таанышуу үчүн жетиштүү. Ар бир журнал жазуусу дата-убакыт, окуя деңгээлин, билдирүүнү камтыйт. Дата жана убакыт автоматтык түрдө киргизилет. Окуянын деңгээли билдирүүнүн автору тарабынан тандалат. Бир нече деңгээли бар. Негизгилери маалымат, мүчүлүштүктөрдү оңдоо, ката.
- INFO - адатта, бул эмне болуп жаткандыгы жөнүндө маалымат билдирүүлөр, датасы боюнча тарых сыяктуу бир нерсе: 1915 - бир нерсе болду, 1916 - башка нерсе.
- DEBUG - белгилүү бир учурдун окуяларын кененирээк сүрөттөйт. Мисалы, тарыхта болгон салгылашуулардын чоо-жайы оңдоп-түзөө деңгээлинде." Командир Такойтович өз армиясы менен Селовича айылын көздөй бет алды ."
- ERROR - пайда болгон каталар адатта ушул жерде жазылат. Сиз бир нерсени орогондо
try-catch
блоктунcatch
менен алмаштырылганын байкаган чыгарсызe.printStacktrace()
. Ал консолго киришти гана чыгарат. Логерди колдонуп, сиз бул жазууну журналга жөнөтө аласыз (хаха), сиз идеяны аласыз. - ЭСКЕРТҮҮ - эскертүүлөр бул жерде жазылган. Мисалы, унаадагы ысып кеткен жарык. Бул жөн гана эскертүү жана бир нерсени өзгөртүү жакшы, бирок бул бузулуу эмес. Машина бузулганда, биз ERROR деңгээли менен каттайбыз.
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
java.util.logging.FileHandler.level = INFO
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.pattern = log.%u.%g.txt
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
Бул учурда, бардыгы логгер файлга жана консолго бир эле учурда жаза тургандай конфигурацияланган. Андайда? консолдо бир нерсе өчүрүлгөн болсо, файл боюнча издөө оңой болот. Экөө үчүн тең INFO деңгээли. Файл үчүн ат үлгүсү да көрсөтүлгөн. Бул консолго да, файлга да жазууга мүмкүндүк берген минималдуу конфигурация. файлдагы эски жазуулар өчүп калбашы үчүн truejava.util.logging.FileHandler.append
деп коюңуз . Колдонуунун мисалы бул (комментарийсиз, логгер өзү жөнүндө комментарий берет):
public class Main {
static Logger LOGGER;
static {
try(FileInputStream ins = new FileInputStream("C:\\log.config")){ \\полный путь до file с конфигами
LogManager.getLogManager().readConfiguration(ins);
LOGGER = Logger.getLogger(Main.class.getName());
}catch (Exception ignore){
ignore.printStackTrace();
}
}
public static void main(String[] args) {
try {
LOGGER.log(Level.INFO,"Начало main, создаем лист с типизацией Integers");
List<Integer> ints = new ArrayList<Integer>();
LOGGER.log(Level.INFO,"присваиваем лист Integers листу без типипзации");
List empty = ints;
LOGGER.log(Level.INFO,"присваиваем лист без типипзации листу строк");
List<String> string = empty;
LOGGER.log(Level.WARNING,"добавляем строку \"бла бла\" в наш переприсвоенный лист, возможна ошибка");
string.add("бла бла");
LOGGER.log(Level.WARNING,"добавляем строку \"бла 23\" в наш переприсвоенный лист, возможна ошибка");
string.add("бла 23");
LOGGER.log(Level.WARNING,"добавляем строку \"бла 34\" в наш переприсвоенный лист, возможна ошибка");
string.add("бла 34");
LOGGER.log(Level.INFO,"выводим все элементы листа с типизацией Integers в консоль");
for (Object anInt : ints) {
System.out.println(anInt);
}
LOGGER.log(Level.INFO,"Размер equals " + ints.size());
LOGGER.log(Level.INFO,"Получим первый элемент");
Integer integer = ints.get(0);
LOGGER.log(Level.INFO,"выведем его в консоль");
System.out.println(integer);
}catch (Exception e){
LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
}
}
}
Бул эң жакшы үлгү эмес, мен колдо болгонду алдым. Мисал чыгаруу:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Начало main, создаем лист с типизацией Integers
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист Integers листу без типипзации
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист без типипзации листу строк
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла бла" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 23" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 34" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
INFO: выводим все элементы листа с типизацией Integers в консоль
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: что-то пошло не так
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at generics.Main.main(Main.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Бул жерде мен ноталарга токтолгум келет:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Бул жазуу таптакыр пайдасыз жана маалыматтуу эмес. Ката жазуусу сыяктуу:
WARNING: что-то пошло не так
Сиз муну жазбашыңыз керек: бул журнал үчүн журнал, ал жолго гана тоскоол болот. Ар дайым маңыздуу нерселерди жазганга аракет кылыңыз. System.out.println
Бул аны колдонууну токтотуп , чоңдорго оюнчуктарга өтүү үчүн жетиштүү деп ойлойм . Анын java.util.logging
кемчorктери бар. Мисалы, мен жогоруда сүрөттөгөн деңгээлдер бул жерде эмес, бирок алар эң көп колдонулган логгерлерде. Мен аны бул макала үчүн тандап алдым java.util.logging
, анткени ал туташуу менен кошумча манипуляцияларды талап кылbyte. LOGGER.info
Мен анын ордуна колдонсо болорун белгилей кетейин, LOGGER.log(Level.INFO...
бул жерде буга чейин эле пайда болгон кемчorктердин бири: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
- бул кабарды жана an objectти өткөрүүгө мүмкүндүк берет Exception
, логгер өзү аны сонун жазат. Ошол эле учурда, LOGGER.warning("");
ал бир гана билдирүү алат, б.а. Өзгөчөлүктү өткөрүү мүмкүн эмес, аны өзүңүз сапка которууңуз керек. Мен бул мисал Java журналы менен таанышуу үчүн жетиштүү деп үмүттөнөм. Андан кийин башка логгерлерди (log4j, slf4j, Logback...) туташтыра аласыз - алар көп, бирок иш-аракеттердин тарыхын жазуу үчүн маңызы бир ^. Расмий окуу куралы
GO TO FULL VERSION