本文主要是介绍Golang 日志处理和正则处理的操作方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考...
1、logx日志处理
1.1、logx简介
logx
是 go-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 服务中,名称将被自动设置为 rest 或 zrpc 的名称。
- Mode:输出日志的模式,默认是 console
- console 模式将日志写到 stdout/stderr
- file 模式将日志写到 Path 指定目录的文件中
- volume 模式在 docker 中使用,将日志写入挂载的卷中
- Encoding: 指示如android何对日志进行编码,默认是 json
- json模式以 json 格式写日志
- plain模式用纯文本写日志,并带有终端颜色显示
- TimeFormat:自定义时间格式,可选。默认是 2006-01-02T15:04:05.000Z07:00
- Path:设置日志路径,默认为 logs
- Level: 用于过滤日志的日志级别。默认为 info
- info,所有日志都被写入
- error, info 的日志被丢弃
- severe, info 和 error 日志被丢弃,只有 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, www.chinasem.cnInfo, Slow: 将任何类型的信息写进日志,使用 fmt.Sprint(...) 来转换为 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("服务启动...") logx.Errorf("出现错误: %v", "连接失败") }
注意:如果不现实设置,默认采用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("服务初始化完成") }
1.3、常用方法
package main import "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 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包支持正则表达式操作,使用前需要导入该包。
import "regexp"
2.1、正则表达式语法大全
2.2、基本匹配
使用regexp.MatchString()函数来判断是否含有对应的字符串或数组。
其中第一个参数是正则表达式,第二参数表示要匹配的字符串。
简单匹配字符串:
package main import ( "fmt" "regexp" ) func main() { str := "hello,world" ok, _ := regexp.MatchString("hello", str) if ok { fmt.Println("字符串中包含hello") } else { fmt.Println("字符串中不包含hello") } }
匹配字符串中是否包含数字:
package main import ( "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 main import ( "fmt" "regexp" ) func main() { str := "今日消费内容: 20, 10, 15, 5, 55" re := regexp.MustCompile(`\d+`) slice := re.FindAllString(str, -1) fmt.Println(slice) }
第二个参数表示匹配的数量n,如果传入<0的数表示没有数php量限制。
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" "rphpegexp" ) 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 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
packaghttp://www.chinasem.cne 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("提取出的中文内容:", res)
}
到此这篇关于Golang 日志处理和正则处理的文章就介绍到这了,更多相关Golang 日志处理和正则处理内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于Golang 日志处理和正则处理的操作方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!