Teknologian jakaminen

Lokinkeruukäytännöt projekteissa: teknologiat, työkalut ja parhaat käytännöt

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


✨✨Kiitos kaikille tuestanne Toivotan kaikille ruudun edessä oleville ystäville onnea joka päivä. ✨✨
🎈🎈作者主页: todellakin🎈🎈

Sisällysluettelo

esittely

1. Valitse sopiva kirjauskehys

2. Määritä lokikehys

3. Käytä asianmukaisia ​​lokitasoja

1. Yleiskatsaus lokitasoihin

2. Valitse sopiva lokitaso (ota esimerkkinä logbkck)

3. Säädä lokitasoja dynaamisesti

4. Yhdistetty lokin kontekstitietoihin

1. SLF4J MDC:n käyttö

2. Log4j 2:n ThreadContextin käyttäminen

3. Hyödynnä kontekstuaalista tietoa

5. Reaaliaikainen seuranta ja keskitetty tallennus

1. ELK Stack (Elasticsearch, Logstash, Kibana)

2. Määritä Logstash keräämään lokeja

3. Käytä Kibanaa visualisointiin ja analysointiin

4. Splunk

5. Keskitetty tallennus ja skaalautuvuus

Johtopäätös

6. Lokin rullaus ja arkistointi

1. Määritä lokikehyksen rullaava strategia

2. Vieritys tiedoston koon mukaan

3. Mukauta vieritysstrategiaa

4. Arkistoi vanhat lokitiedostot

Johtopäätös


esittely

Nykyaikaisessa ohjelmistokehityksessä lokikirjaus on kriittinen osa järjestelmän vakauden varmistamista, vianetsintää ja suorituskyvyn seurantaa. Tässä artikkelissa perehdytään käytännön kokemuksiin lokinkeruusta projekteissa ja esitellään lokinkeruutekniikoita, työkaluja ja joitain Java-projekteissa yleisesti käytettyjä parhaita käytäntöjä.

1. Valitse sopiva kirjauskehys

Java-projekteissa sopivan lokikehyksen valitseminen on ensimmäinen askel lokin keräämisessä. Yleisiä kirjauskehyksiä ovat Log4j, Logback ja SLF4J. Tässä on joitain huomioita kehyksen valinnassa:

  • esitys: Tietyt puitteet voivat toimia paremmin suorituskyvyn suhteen, joten valitse sopiva projektisi tarpeiden mukaan.
  • joustavuus: Jotkin puitteet tarjoavat joustavampia konfigurointi- ja tulostusvaihtoehtoja sopeutuakseen erilaisiin sovellusskenaarioihin.
  • Yhteisön tuki: Valitse kehys, jossa on aktiivinen yhteisön tuki ja jatkuvat päivitykset varmistaaksesi, että ongelmat ratkaistaan ​​oikea-aikaisesti ja pääset käyttämään uusimpia ominaisuuksia.

2. Määritä lokikehys

Kun olet valinnut lokikehyksen, se on konfiguroitava asianmukaisesti vastaamaan projektin tarpeita. Yleisesti ottaen määritystiedostot ovat yleensä XML- tai ominaisuustiedostoja, jotka sisältävät tietoa lokitasoista, tulostusmuodoista, kohdepaikoista jne.

Kun otetaan esimerkkinä Logback, yksinkertainen asetustiedostoesimerkki on seuraava:

  1. <!-- logback.xml -->
  2. <configuration>
  3. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  4. <encoder>
  5. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  6. </encoder>
  7. </appender>
  8. <appender name="FILE" class="ch.qos.logback.core.FileAppender">
  9. <file>logs/myapp.log</file>
  10. <encoder>
  11. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  12. </encoder>
  13. </appender>
  14. <logger name="com.example" level="DEBUG"/>
  15. <root level="INFO">
  16. <appender-ref ref="CONSOLE"/>
  17. <appender-ref ref="FILE"/>
  18. </root>
  19. </configuration>

Yllä oleva konfiguraatio määrittelee kaksi liitettä, toinen konsolin ulostulolle ja toinen tiedostotulolle, ja määrittää lokin tason ja tulostusmuodon.

3. Käytä asianmukaisia ​​lokitasoja

Asianmukaisten kirjaustasojen käyttäminen projektissasi on yksi avaintekijöistä, joilla varmistetaan kirjausjärjestelmäsi maksimaalinen tehokkuus. Sopivan lokitason valitseminen voi varmistaa, että eri ympäristöissä ja vaiheissa saadaan sopiva taso yksityiskohtaisia ​​lokitietoja, samalla kun vältetään liian monta tai liian vähän lokeja järjestelmän suorituskyvyn ja ylläpidettävyyden parantamiseksi.

1. Yleiskatsaus lokitasoihin

Java-lokikehyksessä yleisiä lokitasoja ovat:

  1. JÄLJITTÄÄ: Tarjoaa yksityiskohtaisimmat lokitiedot, joita käytetään usein virheenkorjaukseen.
  2. DEBUG: Tarjoaa yksityiskohtia virheenkorjausta varten, sopii kehitys- ja testiympäristöihin.
  3. TIEDOT: Tarjoaa tärkeitä ajonaikaisia ​​tietoja, jotka osoittavat, että sovellus toimii oikein.
  4. VAROITTAA: Osoittaa mahdollisia ongelmia, jotka saattavat vaatia huomiota, mutta jotka eivät vaikuta ohjelman normaaliin toimintaan.
  5. VIRHE: Osoittaa, että on tapahtunut virhe ja lisäkäsittely saattaa olla tarpeen.

2. Valitse sopiva lokitaso (ota esimerkkinä logbkck)

  1. Käytä DEBUGia kehitysvaiheen aikana: Käytä kehitysvaiheessa DEBUG-tasoa saadaksesi yksityiskohtaisempia lokitietoja, joiden avulla kehittäjät voivat seurata ja korjata koodia.

  1. public class ExampleClass {
  2. private static final Logger logger = LoggerFactory.getLogger(ExampleClass.class);
  3. public void someMethod() {
  4. // ...
  5. logger.debug("Debug information for developers");
  6. // ...
  7. }
  8. }

Tuotantoympäristö käyttää INFOa: Aseta tuotantoympäristössä lokitasoksi INFO varmistaaksesi, että kriittiset ajonaikaiset tiedot kirjataan lokiin ja vähennät samalla ylimääräisiä virheenkorjaustietoja.

Varoitus ja virheiden käsittely: Käytä mahdollisia ongelmia ja virhetilanteita varten WARN- ja ERROR-tasoja. Nämä kirjaustasot auttavat tiimejä nopeasti tunnistamaan ja ratkaisemaan järjestelmän ongelmat.

3. Säädä lokitasoja dynaamisesti

Jotkin lokikehykset mahdollistavat lokitason dynaamisen säätämisen ajon aikana, mikä voi olla hyödyllistä säädettäessä kirjauksen monimuotoisuutta käynnistämättä sovellusta uudelleen.

Käyttämällä asianmukaisia ​​lokitasoja kehitystiimit voivat paremmin tasapainottaa tiedon yksityiskohtia ja suorituskykyä, mikä varmistaa optimaaliset kirjaustulokset eri ympäristöissä ja skenaarioissa.

4. Yhdistetty lokin kontekstitietoihin

Lokin kontekstitietojen yhdistäminen lisää kontekstitietoja lokitietueisiin ymmärtääksesi paremmin lokitapahtumien taustaa. Tämä on hyödyllistä seurata tiettyjä pyyntöjä, käyttäjäistuntoja tai muita liiketoimintaprosesseja. Java-projekteissa yleinen käytäntö on käyttää SLF4J:n MDC:tä (Mapped Diagnostic Context) tai Log4j 2:n ThreadContextia lokin kontekstitietojen lisäämiseen.

1. SLF4J MDC:n käyttö

SLF4J:n MDC mahdollistaa avainarvotietojen lisäämisen lokikontekstiin pyynnön tai liiketoimintaprosessin sisällä, jotta ne säilyvät koko käsittelyn ajan.

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. import org.slf4j.MDC;
  4. public class RequestContextLogger {
  5. private static final Logger logger = LoggerFactory.getLogger(RequestContextLogger.class);
  6. public void processRequest(String requestId, String userId) {
  7. try {
  8. // 将请求ID和用户ID放入日志上下文
  9. MDC.put("requestId", requestId);
  10. MDC.put("userId", userId);
  11. // 处理请求
  12. logger.info("Processing request");
  13. // ...
  14. } catch (Exception e) {
  15. logger.error("Error processing request", e);
  16. } finally {
  17. // 清理日志上下文,确保不影响其他请求
  18. MDC.clear();
  19. }
  20. }
  21. }

2. Log4j 2:n ThreadContextin käyttäminen

Log4j 2 tarjoaa ThreadContextin, joka on samanlainen kuin SLF4J:n MDC ja joka voi myös tallentaa säikeen laajuuden avainarvoparien kontekstitietoja.

  1. import org.apache.logging.log4j.LogManager;
  2. import org.apache.logging.log4j.Logger;
  3. import org.apache.logging.log4j.ThreadContext;
  4. public class RequestContextLogger {
  5. private static final Logger logger = LogManager.getLogger(RequestContextLogger.class);
  6. public void processRequest(String requestId, String userId) {
  7. try {
  8. // 将请求ID和用户ID放入日志上下文
  9. ThreadContext.put("requestId", requestId);
  10. ThreadContext.put("userId", userId);
  11. // 处理请求
  12. logger.info("Processing request");
  13. // ...
  14. } catch (Exception e) {
  15. logger.error("Error processing request", e);
  16. } finally {
  17. // 清理日志上下文,确保不影响其他请求
  18. ThreadContext.clearAll();
  19. }
  20. }
  21. }

3. Hyödynnä kontekstuaalista tietoa

Lokin kontekstuaalisen tiedon sisällyttämisen etuna on, että voit yhdistää toisiinsa liittyviä lokitapahtumia, mikä helpottaa tietyn pyynnön tai käyttäjän toimintojen kulun jäljittämistä. Esimerkiksi hajautetussa järjestelmässä koko pyyntöjen käsittelyprosessi voidaan jäljittää useissa palveluissa lisäämällä lokiin yksilöllinen pyyntötunnus.

  1. public class DistributedService {
  2. private static final Logger logger = LoggerFactory.getLogger(DistributedService.class);
  3. public void processDistributedRequest(String requestId) {
  4. try {
  5. MDC.put("requestId", requestId);
  6. // 处理分布式请求
  7. logger.info("Processing distributed request");
  8. // ...
  9. } catch (Exception e) {
  10. logger.error("Error processing distributed request", e);
  11. } finally {
  12. MDC.clear();
  13. }
  14. }
  15. }

Yhdistämällä asiayhteyteen liittyviä tietoja lokitietueet eivät enää ole yksittäisiä tapahtumia, vaan ne ovat orgaanisesti yhteydessä toisiinsa, mikä tarjoaa tehokkaamman työkalun järjestelmän vianmääritykseen ja suorituskyvyn optimointiin.

5. Reaaliaikainen seuranta ja keskitetty tallennus

Reaaliaikainen seuranta ja keskitetty tallennus ovat tärkeitä lokinhallinnan näkökohtia projektissa. Näiden keinojen avulla tiimi voi seurata järjestelmän toimintatilaa reaaliajassa, havaita mahdolliset ongelmat ja suorittaa vianmäärityksen tarvittaessa. Java-projekteissa yleisesti käytettyjä työkaluja ovat ELK Stack (Elasticsearch, Logstash, Kibana), Splunk jne.

1. ELK Stack (Elasticsearch, Logstash, Kibana)

ELK Stack on joukko avoimen lähdekoodin työkaluja lokien keräämiseen, tallentamiseen ja visualisointiin.

  • Joustohaku: Käytetään suurten lokitietojen tallentamiseen ja hakemiseen. Se tarjoaa tehokkaat haku- ja analysointiominaisuudet reaaliaikaisille tiedoille.

  • Logstash: Käytetään lokin keräämiseen, suodattamiseen ja edelleenlähettämiseen. Logstash voi normalisoida lokitiedot eri lähteistä ja lähettää ne Elasticsearchille tallennettavaksi.

  • Kibana: Tarjoaa intuitiivisen käyttöliittymän Elasticsearchiin tallennettujen lokitietojen kyselyyn, visualisointiin ja analysointiin. Kibanan avulla tiimit voivat luoda koontinäyttöjä, kaavioita ja analysoida lokitietoja perusteellisesti.

2. Määritä Logstash keräämään lokeja

Logstashin määrittäminen projektissa keräämään lokeja on kriittinen vaihe ELK Stackille. Logstash tukee useita tulolähteitä ja tulostuskohteita, jotka voidaan määrittää yksinkertaisten konfigurointitiedostojen avulla.

  1. # logstash.conf
  2. input {
  3. file {
  4. path => "/path/to/your/application.log"
  5. start_position => "beginning"
  6. }
  7. }
  8. filter {
  9. # 可添加过滤规则
  10. }
  11. output {
  12. elasticsearch {
  13. hosts => ["localhost:9200"]
  14. index => "your_index_name"
  15. }
  16. }

Tämä esimerkki määrittää Logstash-syöttölaajennuksen valvomaan määritetyn polun lokitiedostoja ja tulostamaan ne Elasticsearchille. Suodatinosio voi lisätä lisäsääntöjä jäsentää, suodattaa tai lisätä lisätietoja lokeihin.

3. Käytä Kibanaa visualisointiin ja analysointiin

Kibana tarjoaa intuitiivisen käyttöliittymän, johon pääsee verkkoselaimen kautta. Kibanassa voit luoda koontinäyttöjä, kaavioita ja suorittaa monimutkaisia ​​kyselyitä ja analyyseja.

Kibanan avulla voit helposti:

  • reaaliaikainen seuranta: Tarkastele reaaliaikaisia ​​lokitietoja ja ymmärrä järjestelmän toimintatila milloin tahansa.

  • Ongelmien karttoittaminen: Hae lokeista tiettyjen kriteerien perusteella löytääksesi mahdollisten ongelmien perimmäisen syyn.

  • Suorituskykyanalyysi: Käytä kaavioita ja visualisointityökaluja analysoidaksesi järjestelmän suorituskyvyn pullonkauloja.

4. Splunk

Splunk on toinen laajalti käytetty lokinhallintatyökalu, joka tarjoaa all-in-one-ratkaisun lokien keräämiseen, etsimiseen, analysointiin ja visualisointiin.

  • Tukkikokoelma: Splunk tukee lokitietojen keräämistä useista lähteistä (tiedostot, tietokannat, verkkoliikenne jne.).

  • Reaaliaikainen haku ja analyysi: Tarjoaa reaaliaikaisia ​​haku- ja analyysitoimintoja, tukee monimutkaisia ​​kyselyitä ja näyttää hakutulokset visuaalisen käyttöliittymän kautta.

  • Hallintapaneelit ja raportit: Käyttäjät voivat luoda mukautettuja kojetauluja ja raportteja järjestelmän suorituskyvyn seurantaa ja analysointia varten.

5. Keskitetty tallennus ja skaalautuvuus

Sekä ELK Stackissa että Splunkissa on tehokkaat keskitetyt tallennusmekanismit, jotka voivat tallentaa suuria määriä lokitietoja. Tämä keskitetty tallennus ei ainoastaan ​​helpota lokien hakua ja analysointia, vaan tarjoaa myös järjestelmälle skaalautuvuuden ja pystyy käsittelemään suuria sovelluslokeja.

Johtopäätös

Reaaliaikainen seuranta ja keskitetty tallennus ovat avainasemassa projektin vakauden ja suorituskyvyn varmistamisessa. Käyttämällä työkaluja, kuten ELK Stack ja Splunk, projektitiimi voi seurata lokeja reaaliajassa monimutkaisissa järjestelmäympäristöissä ja suorittaa oikea-aikaista vianetsintää ja suorituskyvyn optimointia. Näiden työkalujen teho ei ainoastaan ​​paranna tiimin tehokkuutta, vaan tarjoaa myös projekteille paremman ylläpidettävyyden ja skaalautuvuuden.

6. Lokin rullaus ja arkistointi

Lokin rullaus ja arkistointi ovat tärkeitä käytäntöjä projektissa. Se varmistaa lokitiedostojen järkevän hallinnan, ehkäisee ylimääräisten lokitiedostojen aiheuttamia säilytysongelmia ja auttaa ylläpitämään järjestelmän normaalia toimintaa. Seuraavassa on joitain yleisiä käytäntöjä lokin rullauksen ja arkistoinnin toteuttamiseksi Java-projekteissa.

1. Määritä lokikehyksen rullaava strategia

Useimmat lokikehykset tarjoavat rullattavia strategioita, jotka voidaan määrittää määritystiedostojen kautta. Nämä käytännöt määrittävät, milloin siirrytään uusiin lokitiedostoihin ja milloin vanhat lokitiedostot poistetaan. Kun otetaan esimerkkinä Logback, määritä rullaava perusstrategia:

  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  2. <file>logs/myapp.log</file>
  3. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  4. <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
  5. <maxHistory>30</maxHistory>
  6. </rollingPolicy>
  7. <encoder>
  8. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  9. </encoder>
  10. </appender>

Yllä oleva kokoonpano käyttääTimeBasedRollingPolicy, joka rullaa lokitiedoston ajan mukaan.maxHistoryMäärittää säilytettävien historiallisten lokitiedostojen määrän, jotka ylittävät tämän määrän, poistetaan.

2. Vieritys tiedoston koon mukaan

Joskus rullaaminen ei välttämättä riitä, ja sinun on myös rullattava lokitiedoston koon perusteella. Tämä voidaan saavuttaa määrittämällä tiedostokoko:

  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  2. <file>logs/myapp.log</file>
  3. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  4. <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  5. <maxFileSize>5MB</maxFileSize>
  6. <maxHistory>30</maxHistory>
  7. </rollingPolicy>
  8. <encoder>
  9. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  10. </encoder>
  11. </appender>

Yllä oleva kokoonpano käyttääSizeAndTimeBasedRollingPolicy, joka rullaa lokitiedostoja tiedoston koon ja ajan perusteella.maxFileSizeMäärittää kunkin lokitiedoston enimmäiskoon.

3. Mukauta vieritysstrategiaa

Joskus projektit saattavat joutua rullaamaan lokit mukautettujen olosuhteiden perusteella. Harkitse tässä tapauksessa mukautetun vieritysstrategian käyttöönottoa. Esimerkiksi rullaavat lokitiedostot tiettyjen liiketoimintasääntöjen perusteella:

  1. public class CustomRollingPolicy extends TimeBasedRollingPolicy<ILoggingEvent> {
  2. // 实现自定义的滚动逻辑
  3. }

Käytä sitten mukautettua vieritysstrategiaa asetustiedostossa:

  1. <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  2. <file>logs/myapp.log</file>
  3. <rollingPolicy class="com.example.CustomRollingPolicy">
  4. <!-- 自定义配置 -->
  5. </rollingPolicy>
  6. <encoder>
  7. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  8. </encoder>
  9. </appender>

4. Arkistoi vanhat lokitiedostot

Lokitiedostojen rullaamisen lisäksi myös vanhojen lokitiedostojen arkistointi on yleinen käytäntö. Tämä voidaan saavuttaa siirtämällä vanhoja lokitiedostoja säännöllisesti arkistohakemistoon, jotta ne eivät vie liikaa levytilaa.

Tai käytä ohjelmallista lähestymistapaa sen toteuttamiseen Java-koodissa:

  1. import java.io.File;
  2. import java.nio.file.Files;
  3. import java.nio.file.Path;
  4. import java.nio.file.StandardCopyOption;
  5. import java.time.LocalDate;
  6. import java.time.format.DateTimeFormatter;
  7. public class LogArchiver {
  8. public static void archiveLogFile(String logFileName, String archiveDirectory) {
  9. String currentDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  10. File logFile = new File(logFileName);
  11. File archiveDir = new File(archiveDirectory);
  12. if (!archiveDir.exists()) {
  13. archiveDir.mkdirs();
  14. }
  15. Path sourcePath = logFile.toPath();
  16. Path targetPath = new File(archiveDir, logFile.getName() + "." + currentDate + ".log").toPath();
  17. try {
  18. Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

Kutsuttiin säännöllisiin tehtäviinarchiveLogFileTätä menetelmää voidaan käyttää lokitiedostojen arkistointiin.

Ottamalla käyttöön lokin rullauksen ja arkistoinnin projektit voivat hallita lokitiedostoja tehokkaammin ja varmistaa järjestelmän hyvän suorituskyvyn pitkiä aikoja. Tämä ei ole hyödyllinen vain vianmäärityksessä, vaan myös vaatimustenmukaisuusvaatimusten täyttämisessä.

Johtopäätös

Valitsemalla sopivan lokikehyksen, määrittämällä sen asianmukaisesti, käyttämällä asianmukaisia ​​lokitasoja ja yhdistämällä kontekstitietoja, projektit voivat rakentaa tehokkaan lokijärjestelmän, joka tarjoaa vahvan tuen vianmääritykseen, suorituskyvyn optimointiin ja järjestelmän valvontaan. Samaan aikaan reaaliaikainen valvonta ja keskitetty tallennus tarjoavat tiimeille kätevämpiä tapoja seurata järjestelmän tilaa. Huolellinen hakkuu ei ole vain tekninen käytäntö projektikehityksessä, vaan myös tärkeä tae tiimin kokonaistehokkuuden ja projektin laadun parantamiselle.