"Sugeng siang, dina iki ana kedadeyan sing direkam ing situs industri, aku njaluk pangembang kanggo gabung karo grup analisis." Salah sawijining dina sampeyan bisa miwiti kaya iki, utawa bisa uga esuk - ora masalah. Nanging ayo miwiti saka wiwitan. Kanthi ngrampungake masalah ing JavaRush, sampeyan sinau nulis kode sing bisa digunakake lan nindakake apa sing dikarepake. Yen katon ing bagean bantuan , iku cetha sing iki ora tansah bisa metu pisanan. Iku bakal padha ing karya. Sampeyan ora bakal ngrampungake masalah nalika sepisanan: kewan omo minangka kanca sing langgeng. Penting sampeyan bisa mulihake acara bug. Ayo dadi miwiti karo conto. Coba bayangake sampeyan dadi polisi. Sampeyan ditimbali menyang lokasi kedadeyan kasebut (kaca pecah ing toko), sampeyan teka, lan dheweke ngenteni jawaban saka sampeyan babagan kedadeyan kasebut. Where kanggo miwiti? Aku ora ngerti cara kerja polisi. Sarat banget - dheweke wiwit golek saksi, bukti lan kabeh perkara kasebut. Apa yen papan kasebut bisa nyritakake kanthi rinci apa sing kedadeyan? Contone, kaya iki:
- 21:59 pemilik nguripake weker (5 menit nganti diaktifake kanthi lengkap)
- 22:00 pemilik nutup lawang
- 22:05 aktifitas weker lengkap
- 22:06 pemilik ditarik nangani
- 23:15 sensor swara diuripake
- 23:15 asu-asu padha mlayu-mlayu, menggok banter
- 23:15 sensor swara dipateni
- 01:17 sensor kejut ing kaca njaba kasus tampilan diuripake
- 01:17 manuk dara mabur menyang kaca
- 01:17 kaca pecah
- 01:17 sirine ing
- 01:17 manuk dara gonjang-ganjing lan mabur
java.util.Logger
: iku luwih saka cukup kanggo njupuk kanggo ngerti saben liyane. Saben entri log ngemot tanggal-wektu, tingkat acara, pesen. Tanggal lan wektu diketik kanthi otomatis. Tingkat acara dipilih dening penulis pesen. Ana sawetara tingkat. Sing utama yaiku info, debug, kesalahan.
- INFO - biasane iki pesen informasi babagan apa sing kedadeyan, kaya sejarah miturut tanggal: 1915 - ana kedadeyan, 1916 - liyane.
- DEBUG - nggambarake acara ing wayahe tartamtu kanthi luwih rinci. Contone, rincian perang ing sajarah ana ing tingkat debug." Panglima Takoytovich maju karo tentara menyang desa Selovicha ."
- ERROR - kesalahan sing kedadeyan biasane ditulis ing kene. Sampeyan mbokmenawa wis ngeweruhi yen sampeyan mbungkus soko ing
try-catch
, pemblokirancatch
diganti karoe.printStacktrace()
. Iku mung output entri menyang console. Nggunakake logger, sampeyan bisa ngirim entri iki menyang logger (haha), sampeyan entuk ide. - WARN - bebaya ditulis ing kene. Contone, lampu overheating ing mobil. Iki mung bebaya, lan iku luwih apik kanggo ngganti soko, nanging iki ora risak. Nalika mesin rusak, banjur kita bakal log karo tingkat 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
Ing kasus iki, kabeh wis diatur supaya logger nulis menyang file lan console ing wektu sing padha. Ing kasus kasebut? yen soko wis dibusak ing console, plus iku luwih gampang kanggo nggoleki dening file. tingkat INFO kanggo loro. Pola jeneng uga ditemtokake kanggo file kasebut. Iki minangka konfigurasi minimal sing ngidini sampeyan nulis menyang konsol lan file bebarengan. java.util.logging.FileHandler.append
disetel kanggo bener supaya entri lawas ing file ora dibusak. Conto panggunaan iki (tanpa komentar, logger menehi komentar dhewe):
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);
}
}
}
Iki dudu conto sing paling apik, aku njupuk sing ana ing tangan. Tuladha output:
апр 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)
Ing kene aku pengin fokus ing cathetan:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Entri iki cukup ora ana gunane lan ora informatif. Kaya entri kesalahan:
WARNING: что-то пошло не так
Sampeyan ora kudu nulis iki: iku log kanggo log, iku mung bakal njaluk ing dalan. Coba tansah nulis bab sing migunani. Aku iki cukup kanggo mungkasi nggunakake System.out.println
lan pindhah menyang Toys diwasa. Wis java.util.logging
cacat. Contone, level sing dakkandhakake ing ndhuwur ora ana ing kene, nanging ana ing logger sing paling akeh digunakake. Aku milih kanggo artikel iki java.util.logging
amarga ora mbutuhake manipulasi tambahan karo sambungan. Aku uga bakal Wigati sing bisa digunakake LOGGER.info
tinimbang LOGGER.log(Level.INFO...
Salah siji saka cacat wis katon kene: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
- ngijini sampeyan kanggo ngirim pesen lan obyek Exception
, logger dhewe bakal nulis mudhun apik. Ing wektu sing padha, LOGGER.warning("");
mung nampa pesen, i.e. Pangecualian ora bisa dilewati, sampeyan kudu nerjemahake menyang senar dhewe. Muga-muga tuladha iki cukup kanggo ngenal logging Jawa. Banjur sampeyan bisa nyambung logger liyane (log4j, slf4j, Logback ...) - ana akeh, nanging intine padha ^ kanggo ngrekam sajarah tumindak. Tutorial resmi
GO TO FULL VERSION