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

2025-06-09 16:50

本文主要是介绍Golang 日志处理和正则处理的操作方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考...

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 服务中,名称将被自动设置为 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", "连接失败")
}

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

注意:如果不现实设置,默认采用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、常用方法

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

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

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

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、正则表达式语法大全

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

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

2.2、基本匹配

使用regexp.MatchString()函数来判断是否含有对应的字符串或数组。

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

其中第一个参数是正则表达式,第二参数表示要匹配的字符串。

简单匹配字符串:

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

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

第二个参数表示匹配的数量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)
	}
}

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

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

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

注意:由于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)
}

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

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]
}

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

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 日志处理和正则处理的文章就介绍到这了,更多相关Golang 日志处理和正则处理内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Golang 日志处理和正则处理的操作方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154968

相关文章

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Java 日志中 Marker 的使用示例详解

《Java日志中Marker的使用示例详解》Marker是SLF4J(以及Logback、Log4j2)提供的一个接口,它本质上是一个命名对象,你可以把它想象成一个可以附加到日志语句上的标签或戳... 目录什么是Marker?为什么使用Markejavascriptr?1. 精细化的过滤2. 触发特定操作3

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日