Go语学习笔记 - 配置文件使用、日志配置 | Web框架Gin(二)

简介: Go语学习笔记 - 配置文件使用、日志配置 | Web框架Gin(二)

接着上一篇的文章构建的项目:Go语学习笔记 - 环境安装、接口测试 | Web框架Gin(一)_剑客阿良_ALiang的博客-CSDN博客


只是简单的把GET和POST接口的使用测试了一下。


我还是想按照正常的项目结构调整一下,这篇笔记主要是三个部分:调整项目目录结构、增加配置文件使用、增加日志配置,很常规而且也是每个项目都需要用到的。


项目地址:github地址


项目结构调整

说先对项目目录结构调整一下,按照我自己的开发习惯,增加了几个目录。


项目结构如下图:

image.png



解释一下目录结构


app/constants:主要放置一些常量

app/controllers:控制层,熟悉java的不多说。

app/errors:异常定义目录

app/pojo:结构体定义文件,主要是接口请求的结构体和接口返回的结构体,或者自定义的结构体。

app/router:路由文件

app/services:服务实现逻辑目录

app/utils:工具文件目录

config/log:日志配置文件目录,后面会讲到怎么使用。

config/toml:配置文件使用,后面会讲到怎么使用。

main.go作为程序的主入口。


配置文件使用

在我们项目结构中,经常会使用到配置文件。配置文件里面会记录像mysql用户名、端口、redis配置信息等等内容。下面先配置一下toml_config.go,来对config.toml配置文件读取。


image.png

下面是toml_config.go的内容


package toml
import (
  "fmt"
  "github.com/spf13/viper"
)
type TomlConfig struct {
  AppName string
  Log     LogConfig
}
// 日志保存地址
type LogConfig struct {
  Path  string
  Level string
}
var c TomlConfig
func init() {
  // 设置文件名
  viper.SetConfigName("config")
  // 设置文件类型
  viper.SetConfigType("toml")
  // 设置文件路径,可以多个viper会根据设置顺序依次查找
  viper.AddConfigPath(".")
  viper.AutomaticEnv()
  err := viper.ReadInConfig()
  if err != nil {
  panic(fmt.Errorf("fatal error config file: %s", err))
  }
  viper.Unmarshal(&c)
}
func GetConfig() TomlConfig {
  return c
}

需要安装几个库,命令如下:


go get github.com/natefinch/lumberjack

go get go.uber.org/zap/zapcore

注意,在go文件中,init方法在加载该文件所在包的时候会默认执行。


我们看一下配置的内容,主要是日志级别和存放地址。


image.png


验证的话,等下面日志配置好了一起看一下。


日志配置

下面继续配置一下日志,也可以看到配置文件里面配置的日志级别和存放地址都是日志的配置项。


主要在config/log下的logger.go文件,配置了日志相关内容。


image.png


logger.go的内容如下


package log
import (
  "os"
  "github.com/natefinch/lumberjack"
  "go.uber.org/zap"
  "go.uber.org/zap/zapcore"
)
type Field = zap.Field
var (
  Logger  *zap.Logger
  String  = zap.String
  Any     = zap.Any
  Int     = zap.Int
  Float32 = zap.Float32
)
// logpath 日志文件路径
// loglevel 日志级别
func InitLogger(logpath string, loglevel string) {
  // 日志分割
  hook := lumberjack.Logger{
  Filename:   logpath, // 日志文件路径,默认 os.TempDir()
  MaxSize:    100,     // 每个日志文件保存100M,默认 100M
  MaxBackups: 30,      // 保留30个备份,默认不限
  MaxAge:     7,       // 保留7天,默认不限
  Compress: true, // 是否压缩,默认不压缩
  }
  write := zapcore.AddSync(&hook)
  // 设置日志级别
  // debug 可以打印出 info debug warn
  // info  级别可以打印 warn info
  // warn  只能打印 warn
  // debug->info->warn->error
  var level zapcore.Level
  switch loglevel {
  case "debug":
  level = zap.DebugLevel
  case "info":
  level = zap.InfoLevel
  case "error":
  level = zap.ErrorLevel
  case "warn":
  level = zap.WarnLevel
  default:
  level = zap.InfoLevel
  }
  encoderConfig := zapcore.EncoderConfig{
  TimeKey:        "time",
  LevelKey:       "level",
  NameKey:        "logger",
  CallerKey:      "linenum",
  MessageKey:     "msg",
  StacktraceKey:  "stacktrace",
  LineEnding:     zapcore.DefaultLineEnding,
  EncodeLevel:    zapcore.LowercaseLevelEncoder,  // 小写编码器
  EncodeTime:     zapcore.ISO8601TimeEncoder,     // ISO8601 UTC 时间格式
  EncodeDuration: zapcore.SecondsDurationEncoder, //
  EncodeCaller:   zapcore.FullCallerEncoder,      // 全路径编码器
  EncodeName:     zapcore.FullNameEncoder,
  }
  // 设置日志级别
  atomicLevel := zap.NewAtomicLevel()
  atomicLevel.SetLevel(level)
  var writes = []zapcore.WriteSyncer{write}
  // 如果是开发环境,同时在控制台上也输出
  if level == zap.DebugLevel {
  writes = append(writes, zapcore.AddSync(os.Stdout))
  }
  core := zapcore.NewCore(
  zapcore.NewConsoleEncoder(encoderConfig),
  // zapcore.NewJSONEncoder(encoderConfig),
  zapcore.NewMultiWriteSyncer(writes...), // 打印到控制台和文件
  // write,
  level,
  )
  // 开启开发模式,堆栈跟踪
  caller := zap.AddCaller()
  // 开启文件及行号
  development := zap.Development()
  // 设置初始化字段,如:添加一个服务器名称
  filed := zap.Fields(zap.String("application", "test-gin"))
  // 构造日志
  Logger = zap.New(core, caller, development, filed)
  Logger.Info("Logger init success")
}

需要安装依赖包,命令如下


go get github.com/spf13/viper

在main.go文件增加logger的初始化加载,看看配置文件和日志是否都生效了。


main.go增加下面的代码


image.png


看一下执行的日志


2022-05-31T21:27:54.964+0800    info   D:/goProject/learn-gin/config/log/logger.go:90 Logger init success    {"application": "test-gin"}

2022-05-31T21:27:54.964+0800   info   D:/goProject/learn-gin/main.go:31  hahahah    {"application": "test-gin"}

2022-05-31T21:27:54.964+0800   info   D:/goProject/learn-gin/main.go:32  config {"application": "test-gin", "config": {"AppName":"learn-gin","Log":{"Path":"logs/learn.log","Level":"debug"}}}

可以看到配置文件内容的打印,还有日志的打印效果,OK,舒服了。


小结

这有几个点要注意下:


1、init()和main()方法是golang默认的两个方法,不需要我们调用,程序执行会自动寻找项目中的这俩方法。如果引入了一个包,会优先执行引入包的init方法,再执行自己包内的init方法。


2、如果go项目构建是报错:missing go.sum entry for module providing package xxxxx


执行一下命令:


go build -mod=mod

本笔记主要解决我几个强迫症问题,但是没解决完,后面再说。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
428 2
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
890 4
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `<appender>` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `<logger>` 和 `<root>` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3450 1
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
833 1
|
运维 监控 安全
EventLog Analyzer:高效的Web服务器日志监控与审计解决方案
ManageEngine EventLog Analyzer是一款企业级Web服务器日志监控与审计工具,支持Apache、IIS、Nginx等主流服务器,实现日志集中管理、实时威胁检测、合规报表生成及可视化分析,助力企业应对安全攻击与合规挑战,提升运维效率。
705 1
|
存储 Linux Apache
在CentOS上配置SVN至Web目录的自动同步
通过上述配置,每次当SVN仓库中提交新的更改时,`post-commit`钩子将被触发,SVN仓库的内容会自动同步到指定的Web目录,从而实现代码的连续部署。
407 16
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
存储 JSON Go
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
496 10
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
721 20