Golang 日志處理和正則處理的操作方法
1、logx日志處理
1.1、logx簡介
logx
是 go-zero
框架中用于日志記錄的核心包,具有以下特點:
- 統(tǒng)一日志格式(帶時間、級別、調(diào)用棧)
- 自動日志切割
- 支持多種日志輸出模式(控制臺、文件、volume)
- 支持鏈路追蹤(context 支持)
- 支持日志等級控制(debug/info/error/alert)
- 內(nèi)建 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:設(shè)置服務(wù)名稱,可選。在 volume 模式下,該名稱用于生成日志文件。在 rest/zrpc 服務(wù)中,名稱將被自動設(shè)置為 rest 或 zrpc 的名稱。
- Mode:輸出日志的模式,默認是 console
- console 模式將日志寫到 stdout/stderr
- file 模式將日志寫到 Path 指定目錄的文件中
- volume 模式在 docker 中使用,將日志寫入掛載的卷中
- Encoding: 指示如何對日志進行編碼,默認是 json
- json模式以 json 格式寫日志
- plain模式用純文本寫日志,并帶有終端顏色顯示
- TimeFormat:自定義時間格式,可選。默認是 2006-01-02T15:04:05.000Z07:00
- Path:設(shè)置日志路徑,默認為 logs
- Level: 用于過濾日志的日志級別。默認為 info
- info,所有日志都被寫入
- error, info 的日志被丟棄
- severe, info 和 error 日志被丟棄,只有 severe 日志被寫入
- Compress: 是否壓縮日志文件,只在 file 模式下工作
- KeepDays:日志文件被保留多少天,在給定的天數(shù)之后,過期的文件將被自動刪除。對 console 模式?jīng)]有影響
- tackCooldownMillis:多少毫秒后再次寫入堆棧跟蹤。用來避免堆棧跟蹤日志過多
- MaxBackups: 多少個日志文件備份將被保存。0代表所有備份都被保存。當Rotation被設(shè)置為size時才會起作用。注意:KeepDays選項的優(yōu)先級會比MaxBackups高,即使MaxBackups被設(shè)置為0,當達到KeepDays上限時備份文件同樣會被刪除。
- MaxSize: 當前被寫入的日志文件最大可占用多少空間。0代表沒有上限。單位為MB。當Rotation被設(shè)置為size時才會起作用。
- Rotation: 日志輪轉(zhuǎn)策略類型。默認為daily(按天輪轉(zhuǎn))。
- daily 按天輪轉(zhuǎn)。
- size 按日志大小輪轉(zhuǎn)。
方法介紹:
Error, Info, Slow: 將任何類型的信息寫進日志,使用 fmt.Sprint(...) 來轉(zhuǎn)換為 string
Errorf, Infof, Slowf: 將指定格式的信息寫入日志
Errorv, Infov, Slowv: 將任何類型的信息寫入日志,用 json marshal 編碼
Errorw, Infow, Sloww: 寫日志,并帶上給定的 key:value 字段
WithContext:將給定的 ctx 注入日志信息,例如用于記錄 trace-id 和 span-id
WithDuration: 將指定的時間寫入日志信息中,字段名為 duration
logx快速使用示例:
package main import "github.com/zeromicro/go-zero/core/logx" func main() { logx.Info("服務(wù)啟動...") logx.Errorf("出現(xiàn)錯誤: %v", "連接失敗") }
注意:如果不現(xiàn)實設(shè)置,默認采用console模式,輸出到控制臺。
1.2、日志初始化與配置
package main import "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("服務(wù)初始化完成") }
1.3、常用方法
package main import "github.com/zeromicro/go-zero/core/logx" func main() { logx.Info("服務(wù)器初始化完成...") logx.Infof("%s", "服務(wù)器初始化完成...") 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 main import "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包支持正則表達式操作,使用前需要導(dǎo)入該包。
import "regexp"
2.1、正則表達式語法大全
2.2、基本匹配
使用regexp.MatchString()函數(shù)來判斷是否含有對應(yīng)的字符串或數(shù)組。
其中第一個參數(shù)是正則表達式,第二參數(shù)表示要匹配的字符串。
簡單匹配字符串:
package main import ( "fmt" "regexp" ) func main() { str := "hello,world" ok, _ := regexp.MatchString("hello", str) if ok { fmt.Println("字符串中包含hello") } else { fmt.Println("字符串中不包含hello") } }
匹配字符串中是否包含數(shù)字:
package main import ( "fmt" "regexp" ) func main() { str := "cost: ¥20" ok, _ := regexp.MatchString("[0-9]+", str) if ok { fmt.Println("字符串中包含數(shù)字...") } else { fmt.Println("字符串中不包含數(shù)字...") } }
2.3、常見函數(shù)使用
一般還會配合 regexp.MustCompile
來使用,傳入一個正則表達式,返回一個 *MustCompile
對象。調(diào)用該函數(shù)要保證正則表達式是正確的,否則直接引發(fā)panic。
1、FindAllString
:查找所有匹配數(shù)字返回
package main import ( "fmt" "regexp" ) func main() { str := "今日消費內(nèi)容: ¥20, ¥10, ¥15, ¥5, ¥55" re := regexp.MustCompile(`\d+`) slice := re.FindAllString(str, -1) fmt.Println(slice) }
第二個參數(shù)表示匹配的數(shù)量n,如果傳入<0的數(shù)表示沒有數(shù)量限制。
2、FindString
:查找第一個匹配的子串
package main import ( "fmt" "regexp" ) func main() { str := "123 abc 456" re := regexp.MustCompile(`\d+`) res := re.FindString(str) fmt.Println(res) // 123 }
3、FindStringSubmatch
:返回匹配的子串和分組
package main import ( "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 main import ( "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返回的是匹配串和對應(yīng)分組,所以下標應(yīng)該從1開始。
5、ReplaceAllString
:字符串替換
package main import ( "fmt" "regexp" ) func main() { str := "今日消費: ¥20, ¥30, ¥10, ¥5, ¥15" re := regexp.MustCompile(`\d+`) res := re.ReplaceAllString(str, "**") fmt.Println(res) }
6、Split
:按正則分割字符串
package main import ( "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 main import ( "fmt" "io" "os" "regexp" ) func main() { file, err := os.Open("index.html") defer file.Close() if err != nil { fmt.Println(err) return } var str []byte var 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 string for _, v := range slice { res += v } fmt.Println("提取出的中文內(nèi)容:", res) }
到此這篇關(guān)于Golang 日志處理和正則處理的文章就介紹到這了,更多相關(guān)Golang 日志處理和正則處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go 自定義package包設(shè)置與導(dǎo)入操作
這篇文章主要介紹了Go 自定義package包設(shè)置與導(dǎo)入操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05golang通過gorm操作sqlite設(shè)置主鍵自增的步驟
這篇文章主要介紹了golang通過gorm操作sqlite設(shè)置主鍵自增的詳細步驟,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09golang使用excelize庫操作excel文件的方法詳解
Excelize是Go語言編寫的用于操作Office Excel文檔基礎(chǔ)庫,基于ECMA-376,ISO/IEC 29500國際標準,下面這篇文章主要給大家介紹了關(guān)于golang使用excelize庫操作excel文件的相關(guān)資料,需要的朋友可以參考下2022-11-11Go語言服務(wù)器開發(fā)實現(xiàn)最簡單HTTP的GET與POST接口
這篇文章主要介紹了Go語言服務(wù)器開發(fā)實現(xiàn)最簡單HTTP的GET與POST接口,實例分析了Go語言http包的使用技巧,需要的朋友可以參考下2015-02-02