JavaRush /Java Blog /Random-TL /Bakit kailangan ang pag-log?

Bakit kailangan ang pag-log?

Nai-publish sa grupo
Kamusta! Kapag nagsusulat ng mga lektura, lalo kong napapansin kung ang isang partikular na paksa ay tiyak na gagamitin sa tunay na gawain. Bakit kailangan mong mag-log - 1 Kaya, PANSIN! Ang paksang tatalakayin namin ngayon ay tiyak na magiging kapaki-pakinabang sa iyo sa lahat ng iyong mga proyekto mula sa unang araw ng trabaho. Pag-uusapan natin ang tungkol sa pag-log. Ang paksang ito ay hindi naman mahirap (masasabi kong madali). Ngunit sa una mong trabaho ay magkakaroon na ng sapat na stress para harapin pa rin ang mga halatang bagay, kaya mas mainam na lubusan itong ayusin ngayon :) Kaya, magsimula na tayo. Ano ang pag-log? Ang pag-log ay pagtatala ng data sa isang lugar tungkol sa pagpapatakbo ng isang programa. Ang lugar kung saan nakasulat ang data na ito ay tinatawag na " log ". Dalawang tanong ang lumitaw nang sabay-sabay: saan at anong data ang naitala? Magsimula tayo sa "saan". Maaari mong i-record ang data ng pagpapatakbo ng program sa maraming iba't ibang lugar. Halimbawa, sa panahon ng iyong pag-aaral madalas kang naglalabas ng data sa console gamit ang System.out.println(). Ito ay tunay na pag-log, kahit na ang pinakasimpleng isa. Siyempre, hindi ito masyadong maginhawa para sa kliyente o pangkat ng suporta sa produkto: halatang ayaw nilang i-install ang IDE at subaybayan ang console :) Mayroon ding mas pamilyar na format para sa pag-record ng impormasyon - sa isang text file. Mas madali para sa mga tao na basahin ang mga ito sa ganitong paraan, at tiyak na mas madaling iimbak! Ngayon ang pangalawang tanong: anong data tungkol sa pagpapatakbo ng programa ang dapat maitala sa log? Ngunit narito ang lahat ay nakasalalay sa iyo! Ang Java logging system ay napaka-flexible. Maaari mong i-configure ito sa paraang ang buong progreso ng iyong programa ay mai-log. Sa isang banda, ito ay mabuti. Ngunit sa kabilang banda, isipin kung anong laki ng Facebook o Twitter logs ang maaaring maabot kung ang lahat ay nakasulat doon. Ang ganitong malalaking kumpanya ay malamang na may kakayahang mag-imbak kahit na ang dami ng impormasyong ito. Ngunit isipin kung gaano kahirap maghanap ng impormasyon tungkol sa isang kritikal na error sa mga log ng 500 gigabytes ng teksto? Ito ay mas masahol pa sa isang karayom ​​sa isang dayami. Samakatuwid, ang pag-log in sa Java ay maaaring i-configure upang ang data ng error lamang ang nakasulat sa log (log). O kahit tungkol lang sa mga kritikal na pagkakamali! Bagaman, ang pagsasabi ng "pag-log in sa Java" ay hindi ganap na tama. Ang katotohanan ay ang pangangailangan para sa pag-log ay lumitaw sa mga programmer bago ang pag-andar na ito ay idinagdag sa wika. At sa oras na may sariling logging library ang Java, lahat ay gumagamit na ng log4j library. Ang kasaysayan ng paglitaw ng pag-log in sa Java ay talagang napakahaba at nagbibigay-kaalaman; sa iyong paglilibang, maaari mong basahin ang post na ito sa Habré . Sa madaling salita, ang Java ay may sariling logging library, ngunit halos walang gumagamit nito :) Nang maglaon, nang lumitaw ang iba't ibang mga library ng pag-log, at ang lahat ng mga programmer ay nagsimulang gumamit ng iba't ibang mga library, lumitaw ang isang problema sa pagiging tugma. Upang maiwasan ang mga tao na gawin ang parehong bagay gamit ang isang dosenang iba't ibang mga aklatan na may iba't ibang mga interface, nilikha ang slf4j abstraction framework(“Service Logging Facade Para sa Java”). Ito ay tinatawag na abstracting dahil kahit na gumagamit ka ng slf4j classes at tinatawag ang kanilang mga pamamaraan, sa ilalim ng hood mayroon silang lahat ng nakaraang logging frameworks na tumatakbo: log4j, standard java.util.logging at iba pa. Kung kasalukuyang kailangan mo ng ilang partikular na tampok ng log4j na wala sa ibang mga aklatan, ngunit hindi mo nais na mahigpit na iugnay ang proyekto sa partikular na aklatan na ito, gamitin lamang ang slf4j. At "hilahin" na niya ang mga pamamaraan ng log4j. Kung magbago ang iyong isip at magpasya na hindi mo na kailangan ang mga feature ng log4j, kailangan mo lang i-configure muli ang "wrapper" (iyon ay, slf4j) para gumamit ng isa pang library. Ang iyong code ay hindi titigil sa pagtatrabaho, dahil dito tinatawagan mo ang mga pamamaraan ng slf4j, at hindi ng isang partikular na library. Isang maliit na digression. Para gumana ang mga sumusunod na halimbawa, kailangan mong i-download ang slf4j library mula dito , at ang log4j library mula dito . Susunod, kailangan naming i-unpack ang archive at idagdag ang mga jar file na kailangan namin sa classpath sa pamamagitan ng Intellij IDEA. Mga item sa menu: File -> Istraktura ng Proyekto -> Mga Aklatan Piliin ang mga kinakailangang garapon at idagdag ang mga ito sa proyekto (maraming garapon sa mga archive na na-download namin, tingnan ang mga kailangan mo sa mga larawan) Bakit kailangan mong mag-log - 2Bakit kailangan mong mag-log - 3Tandaan - ang pagtuturo na ito ay para sa mga mga estudyanteng hindi marunong gumamit ng Maven. Kung alam mo kung paano gamitin ito, mas mainam na subukang magsimula dito: kadalasan ay mas madali. Kung gumagamit ka ng Maven , idagdag ang dependency na ito:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
Mahusay, inayos namin ang mga setting :) Tingnan natin kung paano gumagana ang slf4j. Paano natin matitiyak na ang progreso ng programa ay naitala sa isang lugar? Para dito kailangan namin ng dalawang bagay - isang logger at isang appender . Magsimula tayo sa una. Ang logger ay isang bagay na ganap na namamahala sa pag-iingat ng talaan . Ang paglikha ng isang logger ay napakadali: ginagawa ito gamit ang isang static na pamamaraan - LoggerFactory.getLogger(). Bilang isang parameter sa pamamaraan, kailangan mong ipasa ang isang klase na ang gawain ay mai-log. Patakbuhin natin ang aming code:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
Output ng console: ERROR StatusLogger Walang nakitang file ng configuration ng Log4j 2. Paggamit ng default na configuration (mga error lang sa pag-log sa console), o mga configuration na ibinigay ng user gamit ang programmatically. Itakda ang system property na 'log4j2.debug' para ipakita ang Log4j 2 internal initialization logging. Tingnan ang https://logging.apache.org/log4j/2.x/manual/configuration.html para sa mga tagubilin kung paano i-configure ang Log4j 2 15:49:08.907 [pangunahing] ERROR MyTestClass - May naganap na error sa program! Ano ang nakikita natin dito? Una naming nakita ang isang mensahe ng error. Lumitaw ito dahil kulang kami sa mga kinakailangang setting. Samakatuwid, ang aming logger ay maaari na lamang mag-output ng mga mensahe ng error (ERROR) at sa console lamang. Ang pamamaraan logger.info()ay hindi naisakatuparan. Ngunit logger.error()ito ay gumana! Ipinapakita ng console ang kasalukuyang petsa, ang paraan kung saan nangyari ang error ( main), ang salitang ERROR at ang aming mensahe! Ang ERROR ay ang antas ng pag-log. Sa pangkalahatan, kung ang isang log entry ay minarkahan ng salitang ERROR, nangangahulugan ito na may naganap na error sa puntong iyon sa programa. Kung ang isang entry ay minarkahan ng salitang INFO, nangangahulugan ito na ito ay kasalukuyang impormasyon lamang tungkol sa normal na operasyon ng programa. Ang SLF4J library ay may kaunting iba't ibang antas ng pag-log na nagbibigay-daan sa iyong flexible na i-configure ang pag-log. Napakadaling pamahalaan ang mga ito: ang lahat ng kinakailangang lohika ay kasama na sa klase Logger. Kailangan mo lamang tawagan ang mga kinakailangang pamamaraan. Kung gusto mong mag-post ng regular na mensahe, tawagan ang logger.info(). Maling mensahe - logger.error(). Magpakita ng babala - logger.warn() Ngayon ay pag-usapan natin ang appender . Ang appender ay ang lugar kung saan dumarating ang iyong data. Maaari mong sabihin na ang kabaligtaran ng isang data source ay "punto B." Bilang default, ang data ay output sa console. Pakitandaan na sa nakaraang halimbawa ay hindi namin kinailangang mag-configure ng anuman: ang teksto ay lumabas sa mismong console, ngunit ang logger mula sa log4j library ay maaari lamang mag-output ng mga mensahe sa antas ng ERROR sa console. Malinaw na mas maginhawa para sa mga tao na magbasa ng mga log mula sa isang text file at mag-imbak ng mga log sa parehong mga file. Upang baguhin ang default na gawi ng logger, kailangan naming i-configure ang aming file appender . Upang magsimula, kailangan mong lumikha ng log4j.xml file sa mismong src folder , o sa resources folder, kung gumagamit ka ng Maven, o sa resources folder, kung sakaling gumamit ka ng Maven. Pamilyar ka na sa xml format, kamakailan ay nagkaroon kami ng lecture tungkol dito :) Ito ang magiging nilalaman nito:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
It doesn't look particular complicated :) Pero pag-usapan pa rin natin ang mga nilalaman.
<Configuration status="INFO">
Ito ang tinatawag na status-logger. Hindi ito nauugnay sa aming logger at ginagamit ito sa loob ng log4j. Maaari mong itakda ang status=”TRACE” sa halip na status=”INFO”, at lahat ng impormasyon tungkol sa panloob na mga gawain ng log4j ay ilalabas sa console (naglalabas ang status-logger ng data sa console, kahit na ang aming appender para sa programa ay file. -batay). Hindi natin ito kailangan ngayon, kaya iiwan na natin ang lahat.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Dito ginagawa namin ang aming appender. Isinasaad ng tag <File>na isa itong file. name="MyFileAppender"- ang pangalan ng aming appender. fileName="C:\Users\Username\Desktop\testlog.txt"— path sa log file kung saan isusulat ang lahat ng data. append="true"— kung kinakailangan bang magsulat ng karagdagang data sa dulo ng file. Sa aming kaso ito ang mangyayari. Kung itatakda sa false , ang mga lumang nilalaman ng log ay tatanggalin sa tuwing magsisimulang muli ang programa. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- Ito ang mga setting ng pag-format. Dito maaari naming gamitin ang mga regular na expression upang i-customize ang format ng teksto sa aming log.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Dito namin tinukoy ang antas ng pag-log (antas ng ugat). Mayroon kaming nakatakdang antas ng INFO: iyon ay, ang lahat ng mga mensahe sa mga antas na mas mataas kaysa sa INFO (ayon sa talahanayan na aming tiningnan sa itaas) ay hindi isasama sa log. Magkakaroon tayo ng 3 mensahe sa ating programa: isang INFO, isang WARN at isang ERROR. Sa kasalukuyang configuration, lahat ng 3 mensahe ay isusulat sa log. Kung babaguhin mo ang antas ng ugat sa ERROR, ang huling mensahe lamang mula sa LOGGER.error() ang mai-log. Bilang karagdagan, ang isang link sa appender ay nakalagay dito. Upang gumawa ng ganoong link, kailangan mong <Root>gumawa ng tag sa loob ng tag <ApprenderRef>at idagdag ang parameter dito ref=”Name твоего аппендера”. Ginawa namin ang pangalan ng appender dito, kung sakaling nakalimutan mo: <File name="MyFileAppender" At narito ang code ng aming programa!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
Siyempre, ito ay medyo baluktot (ang pagkuha ng RuntimeException ay isang pangkaraniwang ideya), ngunit ito ay perpekto para sa aming mga layunin :) Patakbuhin natin ang aming pamamaraan nang main()4 na beses nang sunud-sunod at tingnan ang aming testlog.txt file. Hindi na kailangang likhain ito nang maaga: awtomatiko itong gagawin ng library. Lahat ay gumana! :) Ngayon ay mayroon kang naka-configure na logger. Maaari kang makipaglaro sa ilang mga program na isinulat mo kanina, pagdaragdag ng mga tawag sa logger sa lahat ng pamamaraan, at tingnan ang resultang log :) Para sa karagdagang pagbabasa, lubos kong inirerekomenda ang artikulong ito . Doon, ang paksa ng pag-log ay tinalakay nang malalim, at hindi ito madaling basahin sa isang upuan. Ngunit naglalaman ito ng maraming kapaki-pakinabang na karagdagang impormasyon. Halimbawa, matututunan mo kung paano i-configure ang isang logger upang makalikha ito ng bagong text file kung ang aming testlog.txt file ay umabot sa isang tiyak na laki :) At ito na ang katapusan ng aming aralin! Ngayon natutunan mo ang tungkol sa isang napakahalagang paksa, at ang kaalamang ito ay tiyak na magiging kapaki-pakinabang sa iyo sa iyong trabaho sa hinaharap. Sa muling pagkikita! :)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION