Golang日志处理和正则处理的操作方法

Written by

in

文章目录
  • Golang中通过regexp包支持正则表达式操作,使用前需要导入该包。 import “regexp”
  • 目录
    • 1、logx日志处理
      • 1.1、logx简介
      • 1.2、日志初始化与配置
      • 1.3、常用方法
      • 1.4、配合defer捕获panic
    • 2、正则处理
      • 2.1、正则表达式语法大全
      • 2.2、基本匹配
      • 2.3、常见函数使用
      • 2.4、从html提取汉字demo

    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 服务中,名称将被自动设置为 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:设置日志路径,默认为 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, Info, 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模式,输出到控制台。

    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("服务初始化完成")
    }

    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("严重警告日志...")
    }

    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()
    }

    Golang中通过regexp包支持正则表达式操作,使用前需要导入该包。

    import "regexp"

    使用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("字符串中不包含数字...")
    	}
    }

    一般还会配合 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的数表示没有数量限制。

    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]: %vn", 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: %sn", 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]
    }

    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("提取出的中文内容:", res)
    }

    到此这篇关于Golang 日志处理和正则处理的文章就介绍到这了,更多相关Golang 日志处理和正则处理内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • golang框架gin的日志处理和zap lumberjack日志使用方式
    • Golang正则表达式判断手机号或身份证方法实例
    • Golang爬虫及正则表达式的实现示例
    • Golang 正则匹配效率详解
    • 浅析golang 正则表达式
    • golang使用正则表达式解析网页

    站内搜索