Golang——10、日志處理和正則處理

日志處理和正則處理

  • 1、logx日志處理
    • 1.1、logx簡介
    • 1.2、日志初始化與配置
    • 1.3、常用方法
    • 1.4、配合defer捕獲panic
  • 2、正則處理
    • 2.1、正則表達式語法大全
    • 2.2、基本匹配
    • 2.3、常見函數使用
    • 2.4、從html提取漢字demo

1、logx日志處理

1.1、logx簡介

logxgo-zero 框架中用于日志記錄的核心包,具有以下特點:

  • 統一日志格式(帶時間、級別、調用棧)
  • 自動日志切割
  • 支持多種日志輸出模式(控制臺、文件、volume)
  • 支持鏈路追蹤(context 支持)
  • 支持日志等級控制(debug/info/error/alert)
  • 內建 panic 捕獲機制,防止程序崩潰
type LogConf struct {ServiceName         string              `json:",optional"`Mode                string              `json:",default=console,options=[console,file,volume]"`Encoding            string              `json:",default=json,options=[json,plain]"`TimeFormat          string              `json:",optional"`Path                string              `json:",default=logs"`Level               string              `json:",default=info,options=[info,error,severe]"`Compress            bool                `json:",optional"`KeepDays            int                 `json:",optional"`StackCooldownMillis int                 `json:",default=100"`MaxBackups          int                 `json:",default=0"`MaxSize             int                 `json:",default=0"`Rotation            string              `json:",default=daily,options=[daily,size]"`
}
  • ServiceName:設置服務名稱,可選。在 volume 模式下,該名稱用于生成日志文件。在 rest/zrpc 服務中,名稱將被自動設置為 restzrpc 的名稱。
  • Mode:輸出日志的模式,默認是 console
  • console 模式將日志寫到 stdout/stderr
  • file 模式將日志寫到 Path 指定目錄的文件中
  • volume 模式在 docker 中使用,將日志寫入掛載的卷中
  • Encoding: 指示如何對日志進行編碼,默認是 json
  • json模式以 json 格式寫日志
  • plain模式用純文本寫日志,并帶有終端顏色顯示
  • TimeFormat:自定義時間格式,可選。默認是 2006-01-02T15:04:05.000Z07:00
  • Path:設置日志路徑,默認為 logs
  • Level: 用于過濾日志的日志級別。默認為 info
    • info,所有日志都被寫入
    • error, info 的日志被丟棄
    • severe, infoerror 日志被丟棄,只有 severe 日志被寫入
  • Compress: 是否壓縮日志文件,只在 file 模式下工作
  • KeepDays:日志文件被保留多少天,在給定的天數之后,過期的文件將被自動刪除。對 console 模式沒有影響
  • tackCooldownMillis:多少毫秒后再次寫入堆棧跟蹤。用來避免堆棧跟蹤日志過多
  • MaxBackups: 多少個日志文件備份將被保存。0代表所有備份都被保存。當Rotation被設置為size時才會起作用。注意:KeepDays選項的優先級會比MaxBackups高,即使MaxBackups被設置為0,當達到KeepDays上限時備份文件同樣會被刪除。
  • MaxSize: 當前被寫入的日志文件最大可占用多少空間。0代表沒有上限。單位為MB。當Rotation被設置為size時才會起作用。
  • Rotation: 日志輪轉策略類型。默認為daily(按天輪轉)。
    • daily 按天輪轉。
    • size 按日志大小輪轉。

方法介紹:

  • Error, Info, Slow: 將任何類型的信息寫進日志,使用 fmt.Sprint(...) 來轉換為 string
  • Errorf, Infof, Slowf: 將指定格式的信息寫入日志
  • Errorv, Infov, Slowv: 將任何類型的信息寫入日志,用 json marshal 編碼
  • Errorw, Infow, Sloww: 寫日志,并帶上給定的 key:value 字段
  • WithContext:將給定的 ctx 注入日志信息,例如用于記錄 trace-idspan-id
  • WithDuration: 將指定的時間寫入日志信息中,字段名為 duration

logx快速使用示例:

package mainimport "github.com/zeromicro/go-zero/core/logx"func main() {logx.Info("服務啟動...")logx.Errorf("出現錯誤: %v", "連接失敗")
}

在這里插入圖片描述
注意:如果不現實設置,默認采用console模式,輸出到控制臺。


1.2、日志初始化與配置

package mainimport "github.com/zeromicro/go-zero/core/logx"func main() {logx.MustSetup(logx.LogConf{ServiceName: "user-api",Mode:        "file",Path:        "./logs",Level:       "info",KeepDays:    7,Encoding:    "plain",})defer logx.Close()logx.Info("服務初始化完成")
}

1.3、常用方法

在這里插入圖片描述

package mainimport "github.com/zeromicro/go-zero/core/logx"func main() {logx.Info("服務器初始化完成...")logx.Infof("%s", "服務器初始化完成...")logx.Debug(1, 2, 3, []int{1, 2, 3}, "hello world")logx.Debugf("測試%s-%d", "DEBUG", 1)logx.Error("錯誤日志-1", "錯誤日志-2")logx.Errorf("%s-%d", "錯誤日志", 3)logx.Alert("嚴重警告日志...")
}

在這里插入圖片描述


1.4、配合defer捕獲panic

package mainimport "github.com/zeromicro/go-zero/core/logx"func test() {defer func() {if err := recover(); err != nil {logx.Error(err)}}()panic("出錯...")
}func main() {test()
}

2、正則處理

Golang中通過regexp包支持正則表達式操作,使用前需要導入該包。

import "regexp"

2.1、正則表達式語法大全

在這里插入圖片描述

在這里插入圖片描述

2.2、基本匹配

使用regexp.MatchString()函數來判斷是否含有對應的字符串或數組。
在這里插入圖片描述
其中第一個參數是正則表達式,第二參數表示要匹配的字符串。

簡單匹配字符串:

package mainimport ("fmt""regexp"
)func main() {str := "hello,world"ok, _ := regexp.MatchString("hello", str)if ok {fmt.Println("字符串中包含hello")} else {fmt.Println("字符串中不包含hello")}
}

匹配字符串中是否包含數字:

package mainimport ("fmt""regexp"
)func main() {str := "cost: ¥20"ok, _ := regexp.MatchString("[0-9]+", str)if ok {fmt.Println("字符串中包含數字...")} else {fmt.Println("字符串中不包含數字...")}
}

2.3、常見函數使用

一般還會配合 regexp.MustCompile 來使用,傳入一個正則表達式,返回一個 *MustCompile 對象。調用該函數要保證正則表達式是正確的,否則直接引發panic。

1、FindAllString:查找所有匹配數字返回

package mainimport ("fmt""regexp"
)func main() {str := "今日消費內容: ¥20, ¥10, ¥15, ¥5, ¥55"re := regexp.MustCompile(`\d+`)slice := re.FindAllString(str, -1)fmt.Println(slice)
}

在這里插入圖片描述
第二個參數表示匹配的數量n,如果傳入<0的數表示沒有數量限制。

2、FindString:查找第一個匹配的子串

package mainimport ("fmt""regexp"
)func main() {str := "123 abc 456"re := regexp.MustCompile(`\d+`)res := re.FindString(str)fmt.Println(res) // 123
}

3、FindStringSubmatch:返回匹配的子串和分組

package mainimport ("fmt""regexp"
)func main() {str := "日期: 2025-06-06"re := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)slice := re.FindStringSubmatch(str)for k, v := range slice {fmt.Printf("slice[%d]: %v\n", k, v)}
}

在這里插入圖片描述

4、SubexpNames:命名并編號的捕獲分組

package mainimport ("fmt""regexp"
)func main() {str := "今日日期: 2025-06-06"re := regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})`)res := re.FindStringSubmatch(str)names := re.SubexpNames()for i, name := range names {if i > 0 {fmt.Printf("%s: %s\n", name, res[i])}}}

在這里插入圖片描述
注意:由于FindStringSubmatch返回的是匹配串和對應分組,所以下標應該從1開始。

5、ReplaceAllString:字符串替換

package mainimport ("fmt""regexp"
)func main() {str := "今日消費: ¥20, ¥30, ¥10, ¥5, ¥15"re := regexp.MustCompile(`\d+`)res := re.ReplaceAllString(str, "**")fmt.Println(res)
}

在這里插入圖片描述

6、Split:按正則分割字符串

package mainimport ("fmt""regexp"
)func main() {re := regexp.MustCompile(`[,\s;]+`)parts := re.Split("a, b; c d", -1)fmt.Println(parts) // [a b c d]
}

在這里插入圖片描述


2.4、從html提取漢字demo

package mainimport ("fmt""io""os""regexp"
)func main() {file, err := os.Open("index.html")defer file.Close()if err != nil {fmt.Println(err)return}var str []bytevar tmp = make([]byte, 128)for {n, err := file.Read(tmp)if err == io.EOF {break}if err != nil {fmt.Println(err)}str = append(str, tmp[:n]...)}re := regexp.MustCompile(`[\p{Han}]+`)slice := re.FindAllString(string(str), -1)var res stringfor _, v := range slice {res += v}fmt.Println("提取出的中文內容:", res)
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83154.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LeetCode】3309. 連接二進制表示可形成的最大數值(遞歸|回溯|位運算)

LeetCode 3309. 連接二進制表示可形成的最大數值&#xff08;中等&#xff09; 題目描述解題思路Java代碼 題目描述 題目鏈接&#xff1a;LeetCode 3309. 連接二進制表示可形成的最大數值&#xff08;中等&#xff09; 給你一個長度為 3 的整數數組 nums。 現以某種順序 連接…

C++八股 —— 單例模式

文章目錄 1. 基本概念2. 設計要點3. 實現方式4. 詳解懶漢模式 1. 基本概念 線程安全&#xff08;Thread Safety&#xff09; 線程安全是指在多線程環境下&#xff0c;某個函數、類或代碼片段能夠被多個線程同時調用時&#xff0c;仍能保證數據的一致性和邏輯的正確性&#xf…

軟件工程:如何做好軟件產品

1、什么是產品 從項目到產品 產品&#xff1a;滿足行業共性需求的標準產品。即要能夠做到配置化的開發&#xff0c;用同一款產品最大限度地滿足不同客戶的需求&#xff0c;同時讓產品具有可以快速響應客戶需求變化的能力。 好的產品一定吸收了多個項目的共性&#xff0c;一定是…

Cinnamon修改面板小工具圖標

Cinnamon開始菜單-CSDN博客 設置模塊都是做好的&#xff0c;比GNOME簡單得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…

sqlsugar WhereIF條件的大于等于和等于查出來的坑

一、如下圖所示&#xff0c;當我用 .WhereIF(input.Plancontroltype > 0, u > u.Plancontroltype (DnjqPlancontroltype)input.Plancontroltype) 這里面用等于的時候&#xff0c;返回結果一條數據都沒有。 上圖中生成的SQL如下&#xff1a; SELECT id AS Id ,code AS …

centos 7 部署awstats 網站訪問檢測

一、基礎環境準備&#xff08;兩種安裝方式都要做&#xff09; bash # 安裝必要依賴 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 設置 Apache 開機自啟 systemctl start httpd # 啟動 Apache二、安裝 AWStats&#xff0…

React從基礎入門到高級實戰:React 實戰項目 - 項目四:企業級儀表盤

React 實戰項目&#xff1a;企業級儀表盤 歡迎來到 React 開發教程專欄 的第 29 篇&#xff01;在前 28 篇文章中&#xff0c;我們從 React 的基礎概念逐步深入到高級技巧&#xff0c;涵蓋了組件設計、狀態管理、路由配置、性能優化和實時通信等核心內容。這一次&#xff0c;我…

STM32----IAP遠程升級

一、概述&#xff1a; IAP&#xff0c;全稱是“In-Application Programming”&#xff0c;中文解釋為“在程序中編程”。IAP是一種對通過微控制器的對外接口&#xff08;如USART&#xff0c;IIC&#xff0c;CAN&#xff0c;USB&#xff0c;以太網接口甚至是無線射頻通道&#…

模擬搭建私網訪問外網、外網訪問服務器服務的實踐操作

目錄 實驗環境 實踐要求 一、準備工作 1、準備四臺虛擬機&#xff0c;分別標號 2、 防火墻額外添加兩塊網卡&#xff0c;自定義網絡連接模式 3、 關閉虛擬機的圖形管理工具 4、關閉防火墻 5、分別配置四臺虛擬機的IP地址&#xff0c;此處舉一個例子&#xff08;使用的臨…

刪除遠程已經不存在但本地仍然存在的Git分支

1. 獲取遠程分支列表 首先&#xff0c;確保你獲取了遠程倉庫的最新分支信息&#xff1a; git fetch -p -p 參數會自動清理本地倉庫中那些在遠程已經被刪除的分支的引用。 2. 查看本地分支與遠程分支的對比 運行以下命令來查看哪些本地分支沒有對應的遠程分支&#xff1a; …

GIT(AI回答)

在Git中&#xff0c;git push 命令主要用于將本地分支的提交推送到?遠程倉庫?&#xff08;如GitHub、GitLab等&#xff09;。如果你希望將本地分支的改動同步到另一個?本地分支?&#xff0c;這不是 git push 的設計目的。以下是正確的替代方法&#xff1a; 方法1&#xff1…

深入剖析AI大模型:大模型時代的 Prompt 工程全解析

今天聊的內容&#xff0c;我認為是AI開發里面非常重要的內容。它在AI開發里無處不在&#xff0c;當你對 AI 助手說 "用李白的風格寫一首關于人工智能的詩"&#xff0c;或者讓翻譯模型 "將這段合同翻譯成商務日語" 時&#xff0c;輸入的這句話就是 Prompt。…

React - 組件通信

組件通信 概念&#xff1a;組件通信就是組件之間數據傳遞&#xff0c;根據組件嵌套關系不同&#xff0c;有不同的通信方法 父傳子 —— 基礎實現 實現步驟 父組件傳遞數據 - 在子組件標簽上綁定屬性子組件接收數據 - 子組件通過props參數接收數據 聲明子組件并使用 //聲明子…

RKNN開發環境搭建2-RKNN Model Zoo 環境搭建

目錄 1.簡介2.環境搭建2.1 啟動 docker 環境2.2 安裝依賴工具2.3 下載 RKNN Model Zoo2.4 RKNN模型轉化2.5編譯C++1.簡介 RKNN Model Zoo基于 RKNPU SDK 工具鏈開發, 提供了目前主流算法的部署例程. 例程包含導出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程. ??本…

計算機視覺頂刊《International Journal of Computer Vision》2025年5月前沿熱點可視化分析

追蹤計算機視覺領域的前沿熱點是把握技術發展方向、推動創新落地的關鍵&#xff0c;分析這些熱點&#xff0c;不僅能洞察技術趨勢&#xff0c;更能為科研選題和工程實踐提供重要參考。本文對計算機視覺頂刊《International Journal of Computer Vision》2025年5月前沿熱點進行了…

互聯網大廠Java求職面試:云原生與微服務架構的深度探討

互聯網大廠Java求職面試&#xff1a;云原生與微服務架構的深度探討 第一輪提問 面試官&#xff1a; “鄭薪苦&#xff0c;假設我們要設計一個大規模電商平臺的微服務架構&#xff0c;你會如何設計其訂單服務&#xff1f;” 鄭薪苦&#xff1a; “首先&#xff0c;我會采用…

STM32實戰:數字音頻播放器開發指南

基于STM32的數字音頻播放器/效果器是個很棒的項目&#xff01;這涉及到多個嵌入式開發的關鍵技術點。下面我為你拆解實現方案和關鍵學習內容&#xff1a; 系統架構概覽 [SD Card] -> [File System (FATFS)] -> [Audio Decoder (WAV/MP3)] -> [DSP Processing (EQ, R…

基于TurtleBot3在Gazebo地圖實現機器人遠程控制

1. TurtleBot3環境配置 # 下載TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…

【Vue】scoped+組件通信+props校驗

【scoped作用及原理】 【作用】 默認寫在組件中style的樣式會全局生效, 因此很容易造成多個組件之間的樣式沖突問題 故而可以給組件加上scoped 屬性&#xff0c; 令樣式只作用于當前組件的標簽 作用&#xff1a;防止不同vue組件樣式污染 【原理】 給組件加上scoped 屬性后…

IDEA 中 Maven Dependencies 出現紅色波浪線的原因及解決方法

在使用 IntelliJ IDEA 開發 Java 項目時&#xff0c;尤其是基于 Maven 的項目&#xff0c;開發者可能會遇到 Maven Dependencies 中出現紅色波浪線的問題。這種現象通常表示項目依賴未能正確解析或下載&#xff0c;導致代碼提示錯誤、編譯失敗等問題。本文將詳細分析該問題的常…