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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;导致代码提示错误、编译失败等问题。本文将详细分析该问题的常…