«Қайырлы күн, бүгін өндірістік алаңда оқиға тіркелді, әзірлеушіден талдау тобына қосылуын сұраймын». Жұмыстағы күндеріңіздің бірінде осындай нәрсе басталуы мүмкін немесе таңертең болуы мүмкін - бұл маңызды емес. Бірақ басынан бастайық. Мұнда JavaRush-те мәселелерді шешу арқылы сіз жұмыс істейтін және одан күтілетін нәрсені жасайтын code жазуды үйренесіз. Анықтама бөліміне қарасаңыз , бұл әрқашан бірінші рет жұмыс істемейтіні анық. Жұмыста да солай болады. Сіз әрқашан мәселені бірінші рет шеше алмайсыз: қателер біздің мәңгілік серігіміз. Қате оқиғаларын қалпына келтіру маңызды. Мысалдан бастайық. Сіз полицей екеніңізді елестетейік. Оқиға орнына сізді шақырды (дүкенде әйнек сынды), сіз келдіңіз, олар сізден не болғаны туралы жауап күтуде. Неден бастау керек? Мен полицияның қалай жұмыс істейтінін білмеймін. Өте шартты түрде - олар куәгерлерді, дәлелдемелерді және осының бәрін іздей бастайды. Орынның өзі не болғанын егжей-тегжейлі айтып берсе ше? Мысалы, келесідей:
- 21:59 иесі дабылды қосты (толық іске қосылғанға дейін 5 minutes)
- 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 - белгілі бір сәттегі оқиғаларды толығырақ сипаттайды. Мысалы, тарихтағы шайқастың егжей-тегжейлері жөндеу деңгейінде." Командир Такойтұлы өз әскерімен Селовича ауылына қарай ілгерілей бастады ."
- ҚАТЕ – орын алатын қателер әдетте осында жазылады.
try-catch
Сіз бір нәрсені ораған кезде блоктыңcatch
орнына келетінін байқаған боларсызe.printStacktrace()
. Ол тек жазбаны консольге шығарады. Тіркелгіні пайдаланып, сіз бұл жазбаны тіркеушіге жібере аласыз (хаха), сіз идеяны аласыз. - ЕСКЕРТУ - мұнда ескертулер жазылған. Мысалы, көлікте қызып кету шамы. Бұл жай ғана ескерту, және бір нәрсені өзгерткен дұрыс, бірақ бұл бұзылу емес. Құрылғы бұзылған кезде, біз ҚАТЕ деңгейімен тіркелеміз.
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 деңгейі. Файл үшін ат үлгісі де көрсетілген. Бұл консольге де, файлға да жазуға мүмкіндік беретін ең аз конфигурация. файлдағы ескі жазбалар өшірілмеуі үшін шынjava.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
кемшіліктері бар. Мысалы, мен жоғарыда сипаттаған деңгейлер бұл жерде жоқ, бірақ олар көп қолданылатын тіркеушілерде. Мен оны осы мақала үшін таңдадым java.util.logging
, себебі ол қосылыммен қосымша манипуляцияларды қажет етпейді. LOGGER.info
Сондай-ақ, оның орнына қолдануға болатынын атап өтейін, LOGGER.log(Level.INFO...
мұнда қазірдің өзінде пайда болған кемшіліктердің бірі: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
- бұл хабарлама мен нысанды беруге мүмкіндік береді Exception
, тіркеуші өзі оны әдемі етіп жазады. Сонымен бірге LOGGER.warning("");
ол тек хабарлама алады, яғни. Ерекшеліктен өту мүмкін емес, оны өзіңіз жолға аударуыңыз керек. Бұл мысал Java журналымен танысу үшін жеткілікті деп үміттенемін. Содан кейін басқа тіркеушілерді қосуға болады (log4j, slf4j, Logback...) - олардың көпшілігі бар, бірақ мәні бірдей ^ әрекеттер тарихын жазу үшін. Ресми оқу құралы
GO TO FULL VERSION