JavaRush /Blog Jawa /Random-JV /Java Logging. Unwind bal saka stectrace

Java Logging. Unwind bal saka stectrace

Diterbitake ing grup
"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. logging.  Unwind bal saka stectrace - 1Ayo 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
Inggih, sampeyan ora kudu nyelidiki rincian kasebut kanthi dawa; iku langsung jelas apa sing kedadeyan. Semono uga ing pembangunan. Iku banget kelangan nalika sampeyan bisa ngomong saka rekaman apa kedaden. Saiki sampeyan bisa uga ngelingi debugging, amarga sampeyan bisa debug kabeh. Nanging ora. Sampeyan mulih, lan ing wayah wengi kabeh pecah, ora ana sing kudu didebug: sampeyan kudu ngerti sebabe rusak lan ndandani. Iki ngendi log teka menyang muter, sajarah kabeh sing kedaden ing wayah wengi. Sajrone artikel kasebut, aku nyaranake sampeyan mikir babagan apa sing dadi salah sawijining logger sing paling misuwur (dudu logger, luwih kaya ngawasi), sing saben wong sing ngrungokake (nonton) kabar kasebut mesthi wis krungu? Thanks kanggo dheweke, sawetara acara dipulihake. Saiki ayo padha serius. Log ing Jawa minangka proses ngrekam acara apa wae sing kedadeyan ing kode kasebut. Sampeyan tanggung jawab minangka programer kanggo nulis apa kode sampeyan, amarga log iki bakal diwenehake kanggo sampeyan kanggo dianalisis. Yen kabeh wis rampung kanthi apik, bug bakal diurutake lan didandani kanthi cepet. Kene, aku mbokmenawa ora bakal delve menyang apa jenis loggers ana. Ing artikel iki kita bakal matesi dhéwé kanggo prasaja 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, pemblokiran catchdiganti karo e.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.
Kita wis ngurutake tingkat. Nanging aja kuwatir: garis ing antarane dheweke tipis banget - ora kabeh wong bisa nerangake. Kajaba iku, bisa uga beda-beda saka proyek menyang proyek. Pangembang senior bakal nerangake marang sampeyan ing level apa lan apa sing kudu dicathet. Ingkang utama yaiku cathetan kasebut cukup kanggo sampeyan kanggo analisis ing mangsa ngarep. Lan iki mangertos ing fly. Sabanjure yaiku setelan. Loggers bisa marang ngendi kanggo nulis (menyang console, file, jms utawa nang endi wae), lan nemtokake tingkat (info, kesalahan, debug ...). Conto setelan kanggo logger prasaja kita katon kaya iki:
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.appenddisetel 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.printlnlan pindhah menyang Toys diwasa. Wis java.util.loggingcacat. 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.loggingamarga ora mbutuhake manipulasi tambahan karo sambungan. Aku uga bakal Wigati sing bisa digunakake LOGGER.infotinimbang 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
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION