首页 > 其他分享 >Go Web 实战:如何创建项目及增加日志功能

Go Web 实战:如何创建项目及增加日志功能

时间:2022-10-25 13:31:07浏览次数:44  
标签:Web string ... DefaultLogger func Go 日志

Go Web 实战:如何创建项目及增加日志功能_项目实战

从本文开始,我们来看一下如何从零搭建一个 Go 项目。

回顾一下基础的 Go 项目运行过程

首先,新建一个 ​​sports​​ 的文件,然后键入此文件目录下,选择在终端中打开,使用如下命令初始化项目:

go mod init sports

Go Web 实战:如何创建项目及增加日志功能_日志输出_02

然后,我们创建一个 ​​main.go​​ 的文件,写入如下代码:

package main

import "fmt"

func writeMessage() {
fmt.Println("Let's Go")
}

func main() {
writeMessage()
}

回到终端,编译并执行我们的项目:

go run .

就像之前第一次写一个 ​​HelloWorld​​ 项目一样,​​run​​ 命令会成功编译并执行我们的 ​​Println()​​ 内的字符串 Let's Go,输出结果如下:

$ go run .
Let's Go

创建一些基本的项目功能

众所周知,Web 应用有一些基础的服务和功能如日志、文件配置等等。所以我们可以为 ​​sports​​ 项目提供一些基本的服务,这些服务将为运行网络应用程序提供基础。

创建日志接口 Logger

先来实现第一个服务器功能——日志。Go 标准库中的 ​​log​​ 包为创建日志提供了一套非常用户友好的基本功能,但在实际开发过程中,仍需要一些额外的功能来筛选一些信息详情。

创建 ​​sports/logging​​ 文件夹,然后在这个文件夹下面创建一个 ​​logging.go​​ 文件,然后写入如下代码:

package logging

type LogLevel int

const (
Trace LogLevel = iota
Debug
Information
Warning
Fatal
None
)

type Logger interface {
Trace(string)
Tracef(string, ...interface{})

Debug(string)
Debugf(string, ...interface{})

Info(string)
Infof(string, ...interface{})

Warn(string)
Warnf(string, ...interface{})

Panic(string)
Panicf(string, ...interface{})
}

上面的代码定义了 ​​Logger​​ 接口,并具体声明了具体的日志消息的具体方法,分别有着不同的日志级别,​​LogLevel​​ 从 ​​Trace​​ 到 ​​Fatal​​ 。值得注意的是也有一个无级别的 ​​None​​, 意味着没有日志输出。

对于每个级别的重要性,​​Logger​​ 接口定义两个方法:

  • 一个用于接受简单字符串的方法,如Debug
  • 一个用于接收模板字符串和占位符值的方法,如Debugf

将日志功能定义为接口的好处是:在需要更改或替换功能时,只需要更改实现,我们的调用接口并不需要改变;接口也使得功能作为服务提供给应用程序。

Logger 接口的具体实现

日志接口定义好了之后,我们来创建具体的 ​​Logger​​ 接口的实现。

创建一个 ​​logger_default.go​​ 的文件,然后写入如下的代码:

package logging

import (
"fmt"
"log"
)

type DefaultLogger struct {
minLevel LogLevel
loggers map[LogLevel]*log.Logger
triggerPanic bool
}

func (l *DefaultLogger) MinLogLevel() LogLevel {
return l.minLevel
}

func (l *DefaultLogger) write(level LogLevel, message string) {
if l.minLevel <= level {
l.loggers[level].Output(2, message)
}
}

func (l *DefaultLogger) Trace(msg string) {
l.write(Trace, msg)
}

func (l *DefaultLogger) Tracef(template string, vals ...interface{}) {
l.write(Trace, fmt.Sprintf(template, vals...))
}

func (l *DefaultLogger) Debug(msg string) {
l.write(Debug, msg)
}

func (l *DefaultLogger) Debugf(template string, vals ...interface{}) {
l.write(Debug, fmt.Sprintf(template, vals...))
}

func (l *DefaultLogger) Info(msg string) {
l.write(Information, msg)
}

func (l *DefaultLogger) Infof(template string, vals ...interface{}) {
l.write(Information, fmt.Sprintf(template, vals...))
}

func (l *DefaultLogger) Warn(msg string) {
l.write(Warning, msg)
}

func (l *DefaultLogger) Warnf(template string, vals ...interface{}) {
l.write(Warning, fmt.Sprintf(template, vals...))
}

func (l *DefaultLogger) Panic(msg string) {
l.write(Fatal, msg)
if l.triggerPanic {
panic(msg)
}
}

func (l *DefaultLogger) Panicf(template string, vals ...interface{}) {
formattedMsg := fmt.Sprintf(template, vals...)
l.write(Fatal, formattedMsg)
if l.triggerPanic {
panic(formattedMsg)
}
}

​NewDefaultLogger()​​ 函数创建一个具有最小严重程度日志 ​​DefaultLogger​​ 和 ​​log.Loggers​​ 将消息写入标准输出。

最终我们的目录结构如下:

Go Web 实战:如何创建项目及增加日志功能_项目实战_03

测试日志功能

为了做一个简单的测试,我们可以修改最开始的 ​​main()​​ 函数,以便查看日志功能是否能成功打印出日志消息,回到 ​​main.go​​ ,写入如下代码:

package main

import (
// "fmt"
"sports/logging"
)

func writeMessage(logger logging.Logger) {
// fmt.Println("Let's Go")
logger.Info("Let's Go, logger")
}

func main() {

var logger logging.Logger = logging.NewDefaultLogger(logging.Information)
writeMessage(logger)
}

由 ​​NewDefaultLogger​​ 创建的最小日志级别被设置为 ​​Information​​,这意味着更低的日志级别(​​Trace​​ 和 ​​Debug​​)将被忽略,再次编译和执行 ​​sports​​ 项目,就会看到本地的日志输出,可能你按照我的操作只会时间戳不同,如下:

$ go run .
11:46:55 INFO Let's Go, logger

终端结果如图所示:

Go Web 实战:如何创建项目及增加日志功能_项目实战_04

总结

到了本文的总结时刻了,为了学习 Go Web 项目,本文先回顾了一下 Go 项目的初始化构建和运行过程,然后往我们的 ​​sports​​ 项目中添加了一个日志功能,逐步完善日志接口和实现,最后在主函数中进行了一个简单的日志输出测试。

希望本文能对你有所帮助,如果喜欢本文,可以点个关注。

这里是宇宙之一粟,下一篇文章见!

宇宙古今无有穷期,一生不过须臾,当思奋争。

标签:Web,string,...,DefaultLogger,func,Go,日志
From: https://blog.51cto.com/yuzhou1su/5794619

相关文章

  • Python日志收集
    """1、设置日志的收集级别2、可以将日志输出到文件和控制台3、以下这些方法:info()debug()error()warning()critical()额外拓展:单例模式""......
  • weblogic洞若观火第7篇之开发应用系统
    引言上一篇文章,主要讲解了weblogic的手工操作被管理节点。在本篇文章中,我们接着介绍:常用的开发工具、安装开发工具、编写一套最简单的java应用系统。要开发应用系统,必然要......
  • 安装go开发包、配置GOPATH、GO项目结构目录介绍、go语言IDE选择
    安装go开发包下载安装包网址:https://golang.google.cn/然后点击安装就行配置GOPATH找一个自己的磁盘,新建一个go文件夹,然后在计算机属性里的高级设置里面配置GOPATH然......
  • Webpack中的plugin插件机制
    大家有没有遇到过这些问题:webpack打包之后的文件没有压缩静态文件要手动拷贝到输出目录代码中写了很多环境判断的多余代码上一篇「webpack核心特性」loader说到......
  • B/S使用WebUploader做大文件的分块和断点续传
    ​ 一、功能性需求与非功能性需求要求操作便利,一次选择多个文件和文件夹进行上传;支持PC端全平台操作系统,Windows,Linux,Mac支持文件和文件夹的批量下载,断点续传。刷......
  • 安装python的Django时,无法在PyCharm下的terminal进入虚拟环境的问题
    今日将网上他人django源码拉取下来,准备好用anconda工具来新建一个虚拟环境。等环境搭建好之后,打开pycharm发现在terminal中使用无法进入到虚拟环境中。在网上搜索了一番,终......
  • Web和Web标准
    Web、网页、浏览器WebWeb(WorldWideWeb)即全球广域网,也称为万维网。我们常说的Web端就是网页端。网页网页是构成网站的基本元素。网页主要由文字、图像和超链接等元素......
  • WebSocket的简单使用
    WebSocket的简单使用ws_ht(){leturl=window._CONFIG['wsURL']//console.log('后台WS开始连接')//实例化socketthis.socket_ht=newWe......
  • 认识Web和Web标准
    Web、网页、浏览器WebWeb(WorldWideWeb)即全球广域网,也称为万维网。我们常说的Web端就是网页端。网页网页是构成网站的基本元素。网页主要由文字、图像和超链接等元素......
  • html5使用WebUploader做大文件的分块和断点续传
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用......