自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

掌握結(jié)構(gòu)化日志記錄:全面指南

開發(fā) 前端
結(jié)構(gòu)化日志記錄代表了日志記錄實踐的范式轉(zhuǎn)變,提供了增強的可讀性、可搜索性和分析能力。通過采用結(jié)構(gòu)化日志記錄并利用Slog等工具和日志中間件,開發(fā)人員可以簡化日志管理,深入洞察應(yīng)用程序行為,并加快故障排除工作。擁抱結(jié)構(gòu)化日志記錄使開發(fā)人員能夠釋放他們?nèi)罩緮?shù)據(jù)的全部潛力,提升他們的應(yīng)用程序監(jiān)控和調(diào)試工作流程。

在當(dāng)今復(fù)雜的軟件生態(tài)系統(tǒng)中,應(yīng)用程序日志非常寶貴。它們允許開發(fā)者窺視應(yīng)用程序的內(nèi)部,了解系統(tǒng)內(nèi)部的真實情況。但是,傳統(tǒng)的非結(jié)構(gòu)化日志數(shù)據(jù)有很多不足之處。這些混亂的文本塊無法提供完整的畫面。要真正發(fā)揮日志的力量,我們需要采取更加深思熟慮的方法 - 一種為了消費而設(shè)計的日志生成方式。

引言

這就是結(jié)構(gòu)化日志記錄登場的時刻。這種現(xiàn)代日志記錄范式提供了解鎖應(yīng)用程序日志更深層次洞察力的缺失部分。與不透明的文本流不同,結(jié)構(gòu)化日志在每條日志聲明中嵌入重要的上下文元數(shù)據(jù)。這種機器可讀的數(shù)據(jù)支持強大的搜索、過濾、分析和可視化。

通過結(jié)構(gòu)化日志記錄,麻煩的錯誤和性能問題不會隱藏太久。應(yīng)用程序行為的趨勢和異常變得更加明顯。將日志數(shù)據(jù)解析并引入分析工具變得簡單。簡而言之,結(jié)構(gòu)化日志記錄為應(yīng)用程序日志記錄的狂野世界帶來了理智、理解和透明度。

對于構(gòu)建復(fù)雜、關(guān)鍵任務(wù)軟件的開發(fā)者來說,結(jié)構(gòu)化日志記錄是觀測性的必備工具。這篇博文深入探討了結(jié)構(gòu)化日志記錄的關(guān)鍵概念及其為何應(yīng)成為今天工程團隊的最佳實踐。我們將探索各種語言和框架的流行結(jié)構(gòu)化日志記錄庫。通過理解結(jié)構(gòu)化日志記錄,你將提升設(shè)計、構(gòu)建和監(jiān)控在真實世界條件下運行良好的應(yīng)用程序的能力。日志記錄的未來已經(jīng)到來 - 讓我們一起探索吧!

什么是結(jié)構(gòu)化日志記錄?

結(jié)構(gòu)化日志記錄是一種現(xiàn)代的應(yīng)用程序日志記錄方法,旨在使日志數(shù)據(jù)更加可用。它通過輸出結(jié)構(gòu)化格式的日志聲明,而不是非結(jié)構(gòu)化的純文本,來工作。

每條日志行包含鍵值對和標(biāo)準(zhǔn)化字段,而不是自由格式的消息。例如,一個Web請求日志可能有像“timestamp”、“l(fā)atency”、“request_id”、“user_id”、“endpoint”等字段。這提供了關(guān)于日志聲明的關(guān)鍵上下文。

所有相關(guān)的元數(shù)據(jù)都直接在日志行本身中,而不是埋藏在周圍的文本中。這種機器可讀的結(jié)構(gòu)支持強大的搜索、過濾、聚合和可視化。結(jié)構(gòu)化日志數(shù)據(jù)無縫集成到數(shù)據(jù)管道和分析工具中。

結(jié)構(gòu)化日志記錄的好處:

結(jié)構(gòu)化日志記錄的好處巨大。當(dāng)你可以通過請求ID或用戶ID過濾日志時,調(diào)試會變得更快。可以通過諸如延遲或CPU時間這樣的字段監(jiān)控性能模式和趨勢。限速和聚合變得簡單。上下文數(shù)據(jù)有助于調(diào)查問題。

總的來說,結(jié)構(gòu)化日志記錄導(dǎo)致更高質(zhì)量的日志數(shù)據(jù),提供了更深入的洞察應(yīng)用程序行為。它從將日志記錄作為一個事后想法轉(zhuǎn)變?yōu)獒槍οM和價值進行優(yōu)化的日志。任何嚴(yán)肅的應(yīng)用程序都可以通過采用結(jié)構(gòu)化日志記錄最佳實踐獲得觀測性超能力。

設(shè)置日志級別

日志記錄的一個關(guān)鍵方面是設(shè)置適當(dāng)?shù)娜罩炯墑e來控制日志輸出的詳細(xì)程度。常見的日志級別包括DEBUG、INFO、WARNING、ERROR和FATAL,每個級別在傳達事件的嚴(yán)重性方面都有特定的用途。配置日志級別確保只捕獲相關(guān)信息,提高日志清晰度并減少噪音。

import "github.com/sirupsen/logrus"

// 使用期望的日志級別配置日志記錄器
logrus.SetLevel(logrus.InfoLevel)

如何使用日志級別映射:

日志級別映射是日志記錄器及其相應(yīng)日志級別之間的映射。這種映射允許開發(fā)人員微調(diào)不同組件或環(huán)境的日志級別。通過根據(jù)上下文自定義日志級別,開發(fā)人員可以優(yōu)先處理關(guān)鍵信息并抑制不那么重要的日志。

var loggerLevels = map[string]logrus.Level{
    "module1": logrus.DebugLevel,
    "module2": logrus.InfoLevel,
}

func getLogger(module string) *logrus.Logger {
    logger := logrus.New()
    logger.SetLevel(loggerLevels[module])
    return logger
}

為不同環(huán)境使用不同日志級別的好處:

為各種環(huán)境(如開發(fā)、測試和生產(chǎn))采用不同的日志級別提供了幾個優(yōu)勢。在開發(fā)中,詳細(xì)的日志記錄有助于調(diào)試工作,而在生產(chǎn)中,最小化日志詳細(xì)程度可以節(jié)省資源并簡化日志分析。根據(jù)每個環(huán)境調(diào)整日志級別優(yōu)化了日志記錄行為,提高了操作效率。

使用結(jié)構(gòu)化日志記錄

實現(xiàn)結(jié)構(gòu)化日志記錄涉及集成支持結(jié)構(gòu)化日志格式的日志記錄庫。通過利用像Go中的Slog這樣的庫,開發(fā)人員可以無縫過渡到結(jié)構(gòu)化日志記錄并解鎖其好處。結(jié)構(gòu)化日志記錄庫提供了用于格式化、過濾和豐富日志數(shù)據(jù)的強大功能,使開發(fā)人員能夠深入洞察他們的應(yīng)用程序。

import "github.com/sirupsen/logrus"

// 使用logrus的結(jié)構(gòu)化日志記錄示例
logger := logrus.New()
logger.WithFields(logrus.Fields{
    "user":    "john.doe",
    "action":  "login",
    "success": true,
}).Info("用戶成功登錄")

如何實現(xiàn)自定義日志處理程序

自定義日志處理程序通過使開發(fā)人員能夠自定義日志輸出和行為來擴展日志記錄庫的功能。無論是添加額外的元數(shù)據(jù)、將日志發(fā)送到外部服務(wù)還是實現(xiàn)自定義日志格式化,自定義日志處理程序都提供了根據(jù)特定要求定制日志記錄解決方案的靈活性。

上下文日志記錄

上下文日志記錄通過向日志條目添加上下文信息(如請求ID、用戶標(biāo)識符和時間戳)來豐富日志條目。這些額外的元數(shù)據(jù)通過提供每個日志事件的關(guān)鍵上下文來增強日志的可追溯性,并簡化根本原因分析。將上下文日志記錄與中間件集成,允許開發(fā)人員自動將上下文注入日志

條目,簡化日志生成和分析。

如何使用日志中間件將上下文信息附加到日志中:

日志中間件與Web框架無縫集成,捕獲特定于請求的信息并將其注入日志條目中。通過將中間件納入請求處理管道,開發(fā)人員可以自動將上下文數(shù)據(jù)(如請求ID和用戶代理)附加到日志消息中。這種方法提高了日志的可理解性,并促進了日志與特定應(yīng)用程序交互之間的關(guān)聯(lián)。

在日志中擁有請求ID對調(diào)試目的的重要性:

請求ID作為單個請求的唯一標(biāo)識符,有助于在分布式系統(tǒng)中進行請求跟蹤和調(diào)試。在日志條目中包含請求ID使開發(fā)人員能夠追蹤請求在各個組件中的流動,并識別瓶頸或錯誤。有了請求ID,故障排除變得更加容易,因為開發(fā)人員可以關(guān)聯(lián)不同服務(wù)的日志,并重建每個請求的執(zhí)行路徑。

存儲您的日志

應(yīng)用程序日志的存儲方式可能成就或破壞日志數(shù)據(jù)的有用性。選擇最佳存儲解決方案需要評估規(guī)模、速度、保留需求和訪問模式等因素。對于嚴(yán)肅的生產(chǎn)系統(tǒng)來說,簡單地記錄到本地文本文件的日子已經(jīng)一去不復(fù)返了。現(xiàn)代應(yīng)用程序需要強大的后端基礎(chǔ)設(shè)施,以有效地利用日志。

對于小規(guī)模用例,本地文件系統(tǒng)存儲提供了簡單性和易訪問性。但隨著數(shù)據(jù)量、用戶和基礎(chǔ)設(shè)施的增長,管理性、耐用性和聚合能力在管理性、耐用性和聚合能力方面出現(xiàn)了局限性。這就是集中式日志服務(wù)大放異彩的地方。

云托管平臺,如AWS CloudWatch日志和Datadog,提供了從多樣化基礎(chǔ)設(shè)施自動實時日志聚合的功能。彈性可伸縮性、細(xì)粒度訪問控制和強大的分析功能使得可以獲得可操作的洞察力。然而,隨著數(shù)據(jù)量的增加,成本也會增加。

開源日志存儲,如Elasticsearch、Kafka和Redis,在本地或跨云環(huán)境中提供了類似的好處。它們可以集成到可擴展的日志管道中。但它們需要專業(yè)知識來操作、調(diào)整和保護。

法規(guī)合規(guī)性也應(yīng)指導(dǎo)日志存儲選擇。一些框架,如HIPAA,規(guī)定了數(shù)據(jù)保護、保留政策和訪問審計,這些并非所有解決方案都完全支持。

通過評估其獨特的工作負(fù)載需求,DevOps團隊可以選擇日志存儲架構(gòu),以獲得最佳效用。本地文件的尾部提供了簡單性,而基于云的分析揭示了隱藏的應(yīng)用程序洞察力。結(jié)合兩種方法將兩全其美。

推薦存儲日志的地方(文件、Cloudwatch、Data Dog):

對于中小型應(yīng)用程序,將日志文件存儲在本地可以是一個好選擇。這在開發(fā)環(huán)境中提供了簡單性。日志文件可以實時跟蹤并直接訪問以進行檢查。然而,隨著應(yīng)用程序規(guī)模和復(fù)雜性的增長,本地日志文件變得更難管理。

以下是在Go中將消息記錄到文件的簡單示例:

package main

import (
  "log"


  "os"
)

func main() {

  // 打開日志文件
  f, err := os.OpenFile("app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
  if err != nil {
    log.Fatal(err)
  }

  // 設(shè)置日志記錄器以記錄到文件
  logger := log.New(f, "", log.LstdFlags)

  // 記錄消息
  logger.Println("啟動應(yīng)用程序...")
  logger.Printf("日志消息:%s", "Hello World")

  // 關(guān)閉文件
  f.Close()

}

關(guān)鍵步驟是:

  1. 使用os.OpenFile()打開一個用于寫入的文件。這將追加并在需要時創(chuàng)建文件。
  2. 創(chuàng)建一個寫入打開文件的log.Logger。
  3. 調(diào)用像Println()和Printf()這樣的logger方法來記錄消息。
  4. 完成后關(guān)閉文件。

這會將消息記錄到app.log文件中。文件輪轉(zhuǎn)、日志分割和其他增強功能可以在這個基本日志記錄之上添加。

對于規(guī)模較大的生產(chǎn)系統(tǒng),AWS CloudWatch日志等基于云的日志聚合服務(wù)變得更加可取。CloudWatch提供了自動化的日志收集、高度可擴展的存儲以及與其他AWS服務(wù)的集成。監(jiān)控、警報和流式傳輸?shù)狡渌麛?shù)據(jù)平臺等有用功能是可用的。通過日志過期策略等功能,成本可以優(yōu)化。

以下是如何在Go中將應(yīng)用程序日志發(fā)送到AWS CloudWatch日志的示例:

package main

import (
  "github.com/aws/aws-sdk-go/aws"
  "github.com/aws/aws-sdk-go/aws/session"
  "github.com/aws/aws-sdk-go/service/cloudwatchlogs"

  "log"
)

func main() {

  // 創(chuàng)建CloudWatch日志客戶端
  sess := session.Must(session.NewSessionWithOptions(session.Options{
    SharedConfigState: session.SharedConfigEnable,
  }))

  svc := cloudwatchlogs.New(sess)

  // 日志組和流名稱
  logGroupName := "myAppLogs"
  logStreamName := "appLogStream"
  
  // 如果它們不存在,則創(chuàng)建日志組和流
  svc.CreateLogGroup(&cloudwatchlogs.CreateLogGroupInput{
    LogGroupName: aws.String(logGroupName), 
  })

  svc.CreateLogStream(&cloudwatchlogs.CreateLogStreamInput{
    LogGroupName: aws.String(logGroupName),
    LogStreamName: aws.String(logStreamName),
  })

  // 記錄消息
  logger := log.New(os.Stdout, "", log.LstdFlags) 
  logger.Println("應(yīng)用程序啟動")

  // 將日志發(fā)送到CloudWatch
  _, err := svc.PutLogEvents(&cloudwatchlogs.PutLogEventsInput{ 
    LogGroupName: aws.String(logGroupName),
    LogStreamName: aws.String(logStreamName),
    // 此處添加日志事件
  })

  if err != nil {
    logger.Printf("發(fā)送日志時出錯:%v\n", err)
  }
}

關(guān)鍵步驟是:

  1. 使用AWS SDK創(chuàng)建CloudWatch日志客戶端。
  2. 如果它們還不存在,則創(chuàng)建日志組和流。
  3. 本地記錄消息。
  4. 使用PutLogEvents API調(diào)用將日志事件發(fā)送到CloudWatch。

這允許將應(yīng)用程序日志發(fā)送到CloudWatch,無需管理文件上傳。其他功能,如Kinesis流攝取、報警、保留等,也可以配置。

其他托管日志管理平臺,如Datadog、Logz.io、SumoLogic等,也為大型或關(guān)鍵任務(wù)系統(tǒng)提供了強大的企業(yè)功能。高級分析、可視化、歸檔功能和基于機器學(xué)習(xí)的警報規(guī)則很常見。它們允許跨本地、云和混合環(huán)境集中日志。成本根據(jù)引入的數(shù)據(jù)量而變化。

以下是如何使用其Go庫將日志從Go應(yīng)用程序發(fā)送到Datadog的示例:

package main

import (
  "github.com/DataDog

/datadog-go/statsd"
  datadog "github.com/DataDog/datadog-go/v5/datadog"
)

func main() {

  // 創(chuàng)建Datadog客戶端
  ddClient, err := datadog.NewClient("<DATADOG_API_KEY>", "<DATADOG_APP_KEY>")

  if err != nil {
    log.Fatal(err) 
  }

  // 創(chuàng)建statsd客戶端
  statsd := statsd.New("127.0.0.1:8125")

  // 記錄一些指標(biāo)
  statsd.Gauge("requests.count", 100, []string{"version:1.0"}, 1) 

  // 發(fā)送日志
  ddClient.Logs.Send(&datadog.LogsPayload{
    Series: []datadog.LogsSeries{
      {
        Context: "application",
        Source: "go",
        Service: "app",
        Status: datadog.LogsStatusInfo,
        Tags: []string{"env:dev"}, 
        Logs: []datadog.LogsMessage{
          {
            Message:   "App started",
            Timestamp: datadog.CurrentEpochTime(),
          },
        },
      },
    },
  })

}

關(guān)鍵步驟是:

  1. 使用API和應(yīng)用密鑰創(chuàng)建Datadog客戶端。
  2. 創(chuàng)建Statsd客戶端以獲取自定義指標(biāo)。
  3. 通過客戶端將指標(biāo)和日志發(fā)送到Datadog的平臺。

這允許從Go應(yīng)用程序發(fā)送指標(biāo)和日志到Datadog的平臺,進行監(jiān)控和分析。

對于微服務(wù)架構(gòu),建議使用分布式日志管道。每個應(yīng)用程序本地記錄日志并流式傳輸?shù)街醒刖酆掀鳎鏚afka或Fluentd。這避免了中央依賴或瓶頸。Graylog和ELK堆棧等開源選項在這里表現(xiàn)良好。

總之,在選擇日志存儲解決方案時,評估規(guī)模、成本、團隊技能和法規(guī)要求等因素。從本地文件開始簡單,然后根據(jù)需要演變?yōu)樵品?wù)或自我管理平臺。這在易用性和強大性之間為系統(tǒng)增長的長期日志管理平衡。

結(jié)論

結(jié)構(gòu)化日志記錄代表了日志記錄實踐的范式轉(zhuǎn)變,提供了增強的可讀性、可搜索性和分析能力。通過采用結(jié)構(gòu)化日志記錄并利用Slog等工具和日志中間件,開發(fā)人員可以簡化日志管理,深入洞察應(yīng)用程序行為,并加快故障排除工作。擁抱結(jié)構(gòu)化日志記錄使開發(fā)人員能夠釋放他們?nèi)罩緮?shù)據(jù)的全部潛力,提升他們的應(yīng)用程序監(jiān)控和調(diào)試工作流程。

關(guān)鍵點回顧:

  • 結(jié)構(gòu)化日志記錄將日志消息組織成標(biāo)準(zhǔn)化格式,提高了可讀性和分析性。設(shè)置適當(dāng)?shù)娜罩炯墑e確保只捕獲相關(guān)信息,優(yōu)化了日志清晰度和效率。
  • 使用像Go中的Slog這樣的結(jié)構(gòu)化日志記錄庫可以無縫集成并解鎖高級日志記錄功能。
  • 上下文日志記錄通過添加額外的元數(shù)據(jù)來豐富日志條目,便于故障排除和根本原因分析。
  • 選擇正確的日志存儲解決方案取決于可擴展性、可訪問性和合規(guī)性要求等因素。
責(zé)任編輯:武曉燕 來源: 技術(shù)的游戲
相關(guān)推薦

2009-10-15 14:31:25

結(jié)構(gòu)化綜合布線系統(tǒng)

2024-10-08 10:57:04

2023-03-29 21:06:53

數(shù)據(jù)中心

2023-10-07 00:10:27

日志格式函數(shù)

2018-04-03 14:00:03

結(jié)構(gòu)化數(shù)據(jù)非結(jié)構(gòu)化數(shù)據(jù)數(shù)據(jù)庫

2023-12-26 09:00:00

Java結(jié)構(gòu)化并發(fā)開發(fā)

2021-12-12 08:37:18

結(jié)構(gòu)化數(shù)據(jù)非結(jié)構(gòu)化數(shù)據(jù)數(shù)據(jù)

2023-06-28 11:49:56

Linux命令

2024-05-27 00:32:45

2023-12-25 15:00:18

結(jié)構(gòu)化布線光纖

2024-02-01 13:30:53

Go語言開發(fā)

2009-10-15 13:49:23

結(jié)構(gòu)化布線系統(tǒng)

2009-10-21 15:20:28

結(jié)構(gòu)化布線技術(shù)

2011-03-01 09:39:51

結(jié)構(gòu)化布線

2022-07-04 22:08:52

結(jié)構(gòu)化數(shù)據(jù)谷歌

2023-07-25 17:21:20

綜合布線結(jié)構(gòu)化布線

2012-02-08 15:54:05

ibmdw

2009-10-16 12:55:27

結(jié)構(gòu)化布線系統(tǒng)

2009-10-15 14:07:12

結(jié)構(gòu)化布線系統(tǒng)

2011-08-24 13:34:34

Oracle
點贊
收藏

51CTO技術(shù)棧公眾號