JavaRush /Java Blog /Random-TK /Java-a girmek: näme, nädip, nirede we näme bilen?

Java-a girmek: näme, nädip, nirede we näme bilen?

Toparda çap edildi
Hemmelere salam, JavaRush jemgyýeti! Bu gün Java ýazgysy barada gürleşeris:
  1. Bu näme, näme üçin? Haýsy ýagdaýlarda ulanmak has gowudyr, haýsy ýagdaýlarda beýle däl?
  2. Java-da hasaba alyş amallarynyň haýsy görnüşleri bar we bu dürlilik bilen näme etmeli?
  3. Giriş derejeleri. Geliň, ýüz tutýan adamyň nämedigini we ony nädip sazlamalydygyny ara alyp maslahatlaşalyň.
  4. Düwünleri açmak we hemme zady isleýşimiz ýaly işlemek üçin olary nädip dogry düzmeli.
Bu material giň tomaşaçylar üçin niýetlenendir. Javaaňy-ýakynda Java bilen tanyşýanlara-da, eýýäm işleýänlere-de düşnükli bolar, ýöne muny diňe Geliň logger.info(“log something”); !

Gingurnal açmak näme üçin zerur?

Gingurnalyň meseläni çözjek hakyky ýagdaýlaryna seredeliň. Ine, meniň işimden mysal. Beýleki hyzmatlar bilen birleşýän amaly nokatlar bar. Bu nokatlaryň ýazgysyny “alibi” hökmünde ulanýaryn : integrasiýa işlemese, meseläniň haýsy tarapdan gelip çykandygyny anyklamak aňsat bolar. Şeýle hem maglumatlar bazasyna ýazylan möhüm maglumatlary hasaba almak maslahat berilýär. Mysal üçin, administrator ulanyjysyny döretmek. Hasaba girmek gowy zat.

Java giriş gurallary

Gingurnal: näme, nädip, nirede we näme bilen?  - 2Java-a girmek üçin belli çözgütler şulary öz içine alýar:
  • log4j
  • IULUL - java.util.logging
  • JCL - jakartada ýygym ýazgylary
  • Yza gaýdyp gelmek
  • SLF4J - java üçin ýönekeý ýazgy fasady
Geliň, olaryň hersine gysgaça göz aýlalyň we materialyň amaly böleginde Slf4j - log4j baglanyşygyny esas hökmünde alarys . Bu indi geň bolup görünmegi mümkin, ýöne alada etme: makalanyň ahyryna çenli hemme zat düşnükli bolar.

System.err.println

Ilki bilen, elbetde, System.err.println bardy (konsola çykyş ýazgysy). Düzediş wagtynda ýazgy almak üçin henizem ulanylýar. Elbetde, bu ýerde haýsydyr bir sazlamalar hakda gürleşmegiň hajaty ýok, geliň muny ýatda saklalyň we dowam edeliň.

Log4j

Bu eýýäm işläp düzüjileriň zerurlyklaryndan döredilen doly hukukly çözgütdi. Ulanmak üçin hakykatdanam gyzykly gural boldy. Dürli ýagdaýlar sebäpli bu çözgüt hiç haçan JDK-a girmedi, bu bolsa tutuş jemgyýeti biynjalyk etdi. log4j-de hasaba alyş bukjada açylyp com.example.type, kiçi bukjada öçürilmegi üçin konfigurasiýa opsiýalary bardy com.example.type.generic. Bu, hasaba alynmaly zatlary zerur däl zatlardan çalt aýyrmaga mümkinçilik berdi. Bu ýerde log4j-iň iki wersiýasynyň bardygyny bellemek möhümdir : 1.2.x we 2.x.x, biri-birine gabat gelmeýär . log4j, ýüz tutujy , ýagny surnallary ýazga alýan we ýerleşdirilen gural - log formaty ýaly düşünje goşdy . Bu size diňe nämäniň gerekdigini we nädip gerekdigini ýazga almaga mümkinçilik berýär. Biraz soň ýüz tutujy hakda has giňişleýin gürleşeris.

IULUL - java.util.logging

Esasy artykmaçlyklaryndan biri çözgütdir - JUL JDK-a (Java ösüş toplumy) girýär. Gynansagam, ösüş döwründe esas hökmünde alnan meşhur log4j däl-de, onuň ösüşine täsir eden IBM-iň çözgüdi. Aslynda häzirki wagtda JUL bar, ýöne hiç kim ulanmaýar. “Beýle zatlardan”: JUL-da hasaba alyş derejeleri Logback, Log4j, Slf4j-den tapawutlanýar we bu olaryň arasyndaky düşünişmegi hasam erbetleşdirýär. Kitap ýazgysyny döretmek köp ýa-da az meňzeýär. Munuň üçin import etmeli:
java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggingJul.class.getName());
Synpyň ady, ýazgylaryň nireden gelýändigini bilmek üçin ýörite berilýär. Java 8-den bäri geçip bolýar Supplier<String>. Bu, diňe bir zerur bolan pursatda sanamaga we döretmäge kömek edýär, her gezek bolşy ýaly däl-de, her gezek. Diňe Java 8 çykmagy bilen döredijiler möhüm meseleleri çözdüler, şondan soň JUL hakykatdanam ulanyp başlady. Supplier<String> msgSupplierAşakda görkezilişi ýaly argumentli usullar :
public void info(Supplier<String> msgSupplier) {
   log(Level.INFO, msgSupplier);
}

JCL - jakartada ýygym ýazgylary

Uzak wagtlap hasaba alyşda hiç hili önümçilik standartynyň ýokdugy we köp adamyň öz şahsy ýazgysyny döreden döwri bolansoň, beýlekilerden has köp ulanyljak umumy örtük JCL-i çykarmak kararyna geldiler. Näme üçin? Taslama käbir garaşlylyklar goşulanda, taslamadaky ýazgydan başga bir ýazgy ulanyp bilerler. Şol sebäpli, hemmesini bir ýere jemlemäge synanyşanda hakyky kynçylyklary döredýän taslama geçişli goşuldy. Gynansagam, örtük işleýşi gaty pesdi we goşmaçalar girizmedi. Her kim öz işini ýerine ýetirmek üçin JCL ulansa, amatly bolardy. Emma hakykatda beýle netije bermedi, şonuň üçin JCL-ni ulanmak häzirki wagtda gowy pikir däl.

Yza gaýdyp gelmek

Açyk çeşmäniň ýoly nähili tikenli ... Logback, mirasdüşer döretmek üçin log4j ýaly bir dörediji tarapyndan ýazyldy. Bu pikir log4j bilen deňdi. Tapawutlar yza gaýdyşda:
  • öndürijiligi gowulandyrmak;
  • slf4j üçin ýerli goldaw goşuldy;
  • Süzgüç opsiýasy giňeldildi.
Düzgüne görä, yza gaýdyp gelmek hiç hili sazlamany talap etmeýär we DEBUG derejesinden we ondan ýokary ähli ýazgylary ýazga alýar. Konfigurasiýa zerur bolsa, ony xml konfigurasiýasy arkaly edip bolýar:
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>app.log</file>
        <encoder>
            <pattern>%d{HH:mm:ss,SSS} %-5p [%c] - %m%n</pattern>
        </encoder>
    </appender>
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.type.descriptor.sql" level="TRACE" />
    <root level="info">
        <appender-ref ref="FILE" />
    </root>
</configuration>

SLF4J - java üçin ýönekeý ýazgy fasady

Takmynan 2006-njy ýylda log4j-iň esaslandyryjy atalarynyň biri bu taslamany taşlap, slf4j - Java üçin ýönekeý giriş fasadyny döretdi - log4j, JUL, umumy giriş we logback. Görşüňiz ýaly, öňegidişlik gabygyň üstünde örtük döreden derejä ýetdi ... Mundan başga-da, ol iki bölege bölünýär: programmada ulanylýan API we ýerine ýetirilişi ýaly hasaba almagyň her görnüşi üçin aýratyn baglylyklar. Mysal üçin slf4j-log4j12.jar, slf4j-jdk14.jar. Dogry durmuşa geçirmegi birleşdirmek ýeterlik we bu: ähli taslama onuň bilen işlär. Slf4j, giriş üçin setir formatlamak ýaly ähli täze aýratynlyklary goldaýar. Öň şeýle mesele bardy. Gündeligiň ýazgysy bar diýeliň:
log.debug("User " + user + " connected from " + request.getRemoteAddr());
Setirleriň birleşmegi sebäpli obýektde useraç-açan öwrülişik bolýar user.toString()we bu ulgamy haýalladýan wagt talap edýär. Programmany düzetsek hemme zat gowy. Bu synp üçin giriş derejesi INFO we has ýokary bolsa, problemalar başlaýar. Thisagny, bu gündeligi ýazmaly däl we simli birleşme hem edilmeli däldir. Teoriýa boýunça, bu ýazgy kitaphanasynyň özi tarapyndan çözülmelidi. Mundan başga-da, bu log4j-iň birinji wersiýasynyň iň uly meselesi boldy. Adaty çözgüt bermediler, ýöne muny şeýle etmegi teklip etdiler:
if (log.isDebugEnabled()) {
    log.debug("User " + user + " connected from " + request.getRemoteAddr());
}
.Agny, bir ýazgy setiriniň ýerine 3 (!) Suggestedazmagy teklip etdiler. Gingazgy, koddaky üýtgeşmeleri azaltmaly we üç setir umumy çemeleşmä aç-açan ters gelýär. slf4j-iň JDK we API bilen utgaşyklygy ýokdy, şonuň üçin derrew owadan çözgüt peýda boldy:
log.debug("User {} connected from {}", user, request.getRemoteAddr());
bu ýerde {}usuldan geçen argumentleriň goýulmagyny aňladýar. .Agny, birinjisi {}gabat gelýär user, ikinjisi {}- request.getRemoteAddr(). Şol sebäpli, diňe hasaba alyş derejesi gündelige ýazga geçirmäge mümkinçilik beren ýagdaýynda, bu habary ýekeje habara birikdirip bolýar. Ondan soň SJF4J tiz meşhurlyk gazandy we häzirki wagtda iň oňat çözgüt. Şol sebäpden, bukjanyň mysaly bilen hasaba girmegi göz öňünde tutarys slf4j-log4j12.

Hasaba girmeli zatlar

Elbetde, hemme zady hasaba almaly däl. Käwagt bu zerur däl we hatda howply. Mysal üçin, kimdir biriniň şahsy maglumatlaryna girew goýsaňyz we nämüçindir ýüze çyksa, esasanam Günbatara gönükdirilen taslamalarda hakyky problemalar ýüze çykar. Logöne hasaba alynmaly hökmany bir zat bar :
  1. Programmanyň başlangyjy / soňy. Programmanyň hakykatdanam garaşyşymyz ýaly başlandygyny we garaşylşy ýaly gutarandygyny bilmelidiris.
  2. Howpsuzlyk soraglary. Bu ýerde paroly çaklamak synanyşyklaryny, möhüm ulanyjylaryň giriş girişlerini we ş.m. ýazsaňyz gowy bolardy.
  3. Käbir programmalarda aýdylýar . Mysal üçin, iş prosesinde bir ştatdan beýlekisine geçmek.
  4. Degişli derejeli hasaba alyş derejesi bilen düzediş üçin käbir maglumatlar.
  5. Käbir SQL skriptleri. Bu zerur bolanda hakyky ýagdaýlar bolýar. Againene-de derejeleri ussatlyk bilen sazlamak bilen ajaýyp netijelere ýetip bolýar.
  6. Dogry iş barlanylan ýagdaýynda ýerine ýetirilen sapaklar (sapak) hasaba alnyp bilner.

Meşhur hasaba alyş ýalňyşlyklary

Nuanslar köp, ýöne birnäçe ýalňyşlyklar bar:
  1. Artykmaç giriş. Teoretiki taýdan möhüm bolup biljek her ädimiňizi ýazmaly dälsiňiz. Düzgün bar: surnallar öndürijiligi 10% -den köp ýükläp bilmez. Otherwiseogsam öndürijilik meselesi ýüze çykar.
  2. Datahli maglumatlary bir faýla ýazmak. Bu belli bir wagtda okamak / ýazmagy gaty kynlaşdyrar, käbir ulgamlarda faýl ölçeg çäkleriniň bardygyny aýtmazlyk.
  3. Nädogry hasaba alyş derejelerini ulanmak. Her hasaba alyş derejesiniň anyk çäkleri bar we hormat goýulmalydyr. Araçäk düşnüksiz bolsa, haýsy derejäni ulanmalydygyňyz barada ylalaşyp bilersiňiz.

Giriş derejeleri

x: Görünýän
FATAL RAL .YŞLYK DUNDURYŞ INFO DEBUG TRACE HEMMESI
Öçürmek
FATAL x
RAL .YŞLYK x x
DUNDURYŞ x x x
INFO x x x x
DEBUG x x x x x
TRACE x x x x x x
HEMMESI x x x x x x x
Hasaba alyş derejeleri näme? Surnallary nädip tertipleşdirmek üçin belli bir bellikleri we tapawutlary bermeli boldy. Bu maksat bilen hasaba alyş derejeleri girizildi. Dereje programmada kesgitlenendir. Eger ýazgy bellenen derejeden aşakdaky derejä degişli bolsa, gündelige girizilmeýär. Mysal üçin, programmany düzetmek üçin ulanylýan gündeliklerimiz bar. Adaty önümçilik işinde (programma göz öňünde tutulan maksat üçin ulanylanda) beýle ýazgylar zerur däl. Şonuň üçin hasaba alyş derejesi düzedişden has ýokary bolar. Mysal hökmünde log4j ulanyp, derejelere seredeliň. JUL-dan başga beýleki çözgütler hem şol derejeleri ulanýarlar. Ine, olar azalýar:
  • Öçürmek: hiç bir ýazgy ýazylmady, hemmesi hasaba alynmaz;
  • FATAL: programma mundan beýläk işläp bilmez we saklanar, meselem, JVM ýat ýalňyşlygy sebäpli;
  • RAL .YŞLYK: Çözülmeli meseleler ýüze çykanda ýalňyşlyk derejesi. Erroralňyşlyk programmany tutuşlygyna saklamaýar. Beýleki soraglar dogry işläp biler;
  • DUNDURYŞ: Duýduryşy öz içine alýan surnallary görkezýär. Garaşylmadyk hereket boldy, muňa garamazdan ulgam haýyşa garşy çykdy we ýerine ýetirdi;
  • INFO: programmada möhüm hereketleri ýazýan gündelik. Bular ýalňyşlyklar däl, duýduryşlar däl, ulgamyň garaşylýan hereketleri;
  • DEBUG: programmany düzetmek üçin zerur gündelikler. Ulgamyň garaşylýan zady ýerine ýetirýändigini ýa-da ulgamyň hereketini suratlandyrmak üçin: “usul1 işläp başlady”;
  • TRACE: iň pes hasaba alyş derejesi bilen düzediş üçin aşaky ähmiýetli gündelikler;
  • HEMMESI: ulgamdaky ähli ýazgylaryň ýazyljak derejesi.
Görnüşi ýaly, programmanyň haýsydyr bir ýerinde INFO hasaba alyş derejesi açyk bolsa, INFO-dan başlap FATAL-a çenli ähli derejeler hasaba alynar. Hasaba alyş derejesi FATAL bolsa, diňe şu derejeli ýazgylar ýazylar.

Surnallary ýazga almak we ibermek: Goşundy

Log4j ulanyp, bu prosese mysal hökmünde serederis: bu ýazgylary ýazga almak / ibermek üçin giň mümkinçilikleri döredýär:
  • faýla ýazmak üçin - DailyRollingFileAppender çözgüdi ;
  • programma konsolyna maglumat almak - ConsoleAppender ;
  • maglumat bazasyna gündelik ýazmak - JDBCAppender ;
  • TCP / IP - TelnetAppender arkaly geçirişe gözegçilik etmek ;
  • hasaba almagyň öndürijilige täsir etmeýändigine göz ýetirmek - AsyncAppender .
Başga birnäçe ýerine ýetiriş bar: doly sanawy şu ýerden tapyp bilersiňiz . Theeri gelende aýtsak, talap edilýän ýüz tutujy ýok bolsa, bu mesele däl. Diňe log4j-i kabul edýän “Appender” interfeýsini durmuşa geçirip, öz arzaňyzy ýazyp bilersiňiz .

Giriş düwünleri

Görkeziş üçin slf4j interfeýsini we log4j-den ýerine ýetirişini ulanarys. MainDemoKitap ýazgysyny döretmek gaty ýönekeý: hasaba alynjak synpda aşakdakylary ýazmaly :
org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MainDemo.class);
Bu, biziň üçin ýazgy döreder. Gündelige girmek üçin ýazgylaryň haýsy derejede ediljekdigini görkezýän köp usullary ulanyp bilersiňiz. Mysal üçin:
logger.trace("Method 1 started with argument={}", argument);
logger.debug("Database updated with script = {}", script);
logger.info("Application has started on port = {}", port);
logger.warn("Log4j didn't find log4j.properties. Please, provide them");
logger.error("Connection refused to host = {}", host);
Sapakdan geçsek-de, ahyrynda ýazylan paketler bilen synpyň doly ady. Bu, soňraky ýazgylary düwünlere bölüp, hasaba alyş derejesini we her düwün üçin goşundy düzüp bilersiňiz. Mysal üçin, synpyň ady: com.github.romankh3.logginglecture.MainDemo- içinde bir ýazyjy döredildi. Ine, ony giriş düwünlerine bölmek mümkin. Esasy düwün “ RootLogger” . Bu, ähli programmanyň ähli gündeligini alýan düwün. Galanlaryny aşakda görkezilişi ýaly suratlandyryp bolar: Gingurnal: näme, nädip, nirede we näme bilen?  - 4Goşundylar öz işlerini aýratyn hasaba alyş düwünlerinde düzýärler. Indi, log4j.properties-i mysal hökmünde ulanyp , olary nädip sazlamalydygyna serederis.

Log4j.properties-iň ädimme-ädim konfigurasiýasy

Indi hemme zady ädimme-ädim düzeris we näme edilip bilinjekdigini göreris:
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
Bu setir, org.apache.log4j.ConsoleAppender ýerine ýetirişini ulanýan CONSOLE ýüz tutujyny hasaba alýandygymyzy aýdýar. Bu iberiji konsola maglumat ýazýar. Indiki, bir faýla ýazjak başga bir ýüz tutujyny bellige alalyň:
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
Goşundylaryň henizem düzülmelidigini bellemelidiris. Goşundylary bellige alanymyzdan soň, düwünlerde haýsy hasaba alyş derejesiniň boljakdygyny we haýsy goşundylaryň ulanyljakdygyny kesgitläp bileris.

log4j.rootLogger = DEBUG, KONSOLE, Faýl

  • log4j.rootLogger, ähli gündeligi öz içine alýan esasy düwün düzjekdigimizi aňladýar;
  • deň belgiden soň, birinji söz ýazgylaryň haýsy derejede we has ýokary derejede ýazyljakdygyny görkezýär (biziň ýagdaýymyzda bu DEBUG);
  • soň verguldan soň ulanyljak ähli goşundylar görkezilýär.
Belli bir giriş düwünini sazlamak üçin aşakdaky ýazgyny ulanmaly:
log4j.logger.com.github.romankh3.logginglecture=TRACE, OWN, CONSOLE
belli bir düwün düzmek üçin ulanylýan ýerde log4j.logger., biziň ýagdaýymyzda, com.github.romankh3.logginglecture. indi bolsa CONSOLE ýüzleýjisini gurmak barada gürleşeliň:
# CONSOLE appender customisation
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.threshold=DEBUG
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p] : %c:%L : %m%n
Bu ýerde, ýüz tutujynyň işlejek derejesini kesgitläp biljekdigimizi görýäris. Hakyky ýagdaý: maglumat derejesi bolan habar giriş düwmesi bilen kabul edildi we özüne berlen arza berijä gowşuryldy, ýöne duýduryş derejesi we has ýokary derejeli ýüz tutujy bu gündeligi kabul etdi, ýöne onuň bilen hiç zat etmedi. Ondan soň, habardaky haýsy şablonyň boljakdygyny çözmeli. Mysalda PatternLayout ulanýaryn, ýöne ol ýerde köp çözgüt bar. Bu makalada olar aýan edilmez. Faýl goşundysyny gurmagyň mysaly:
# File appender customisation
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=./target/logging/logging.log
log4j.appender.FILE.MaxFileSize=1MB
log4j.appender.FILE.threshold=DEBUG
log4j.appender.FILE.MaxBackupIndex=2
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[ %-5p] - %c:%L - %m%n
Bu ýerde, görnüşlerden görnüşi ýaly, surnallaryň haýsy faýla ýazyljakdygyny düzüp bilersiňiz
log4j.appender.FILE.File=./target/logging/logging.log
Ordingazgy faýla gidýär logging.log. Faýl ölçegi bilen baglanyşykly kynçylyklardan gaça durmak üçin iň ýokary derejäni belläp bilersiňiz: bu ýagdaýda 1MB. MaxBackupIndex - şeýle faýllaryň näçeräk boljakdygyny aýdýar. Bu sandan köp döredilen bolsa, birinji faýl öçüriler. Gingazgylaryň düzülen hakyky mysalyna seretmek üçin GitHub-daky açyk ammarlara baryp bilersiňiz .

Netijäni jemläliň

Özüňizi suratlandyran zatlaryň hemmesini edip görüň:
  • Aboveokardaky mysaldaky ýaly öz taslamaňyzy dörediň.
  • Maveni ulanmak barada bilýän bolsaňyz, ulanarys, ýok bolsa, kitaphanany nädip birikdirmelidigini beýan edýän bir makala baglanyşyk bar .

Geliň, jemläliň

  1. Java-da haýsy çözgütleriň bardygyny gürleşdik.
  2. Belli hasaba alyş kitaphanalarynyň hemmesi diýen ýaly bir adamyň gözegçiligi astynda ýazyldy: D.
  3. Näme ýazylmalydygyny we nämäniň ýokdugyny öwrendik.
  4. Hasaba alyş derejelerini kesgitledik.
  5. Giriş düwünleri bilen tanyşdyk.
  6. Bir ýüz tutýan adamyň nämedigine we onuň nämedigine göz aýladyk.
  7. Log4j.proterties faýlyny ädimme-ädim düzdük.

Goşmaça materiallar

  1. JavaRush: gingurnal. Stektrace topuny açyň
  2. JavaRush: Logger leksiýasy
  3. Habr: Java ýazgy. Salam dünýä
  4. Habr: Java ýazgy: düýş gören waka
  5. Youtube: Golowaç kurslary. Gingurnal. 1-nji bölüm , 2-nji bölüm , 3-nji bölüm , 4-nji bölüm
  6. Log4j: iberiji
  7. Log4j: düzüliş
Beýleki makalalarymy hem görüň:
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION