最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Go語言中配置文件使用與日志配置

 更新時間:2022年06月01日 09:02:42   作者:劍客阿良_ALiang  
這篇文章主要為大家詳細講解一下Go語言中調(diào)整項目目錄結(jié)構(gòu)、增加配置文件使用和增加日志配置的方法,文中示例代碼講解詳細,需要的可以參考一下

接著上一篇的文章構(gòu)建的項目:Go語學習筆記 - 環(huán)境安裝、接口測試

只是簡單的把GET和POST接口的使用測試了一下。

我還是想按照正常的項目結(jié)構(gòu)調(diào)整一下,這篇筆記主要是三個部分:調(diào)整項目目錄結(jié)構(gòu)、增加配置文件使用、增加日志配置,很常規(guī)而且也是每個項目都需要用到的。

項目地址:github地址 

項目結(jié)構(gòu)調(diào)整

說先對項目目錄結(jié)構(gòu)調(diào)整一下,按照我自己的開發(fā)習慣,增加了幾個目錄。

項目結(jié)構(gòu)如下圖:

解釋一下目錄結(jié)構(gòu)

  • app/constants:主要放置一些常量
  • app/controllers:控制層,熟悉java的不多說。
  • app/errors:異常定義目錄
  • app/pojo:結(jié)構(gòu)體定義文件,主要是接口請求的結(jié)構(gòu)體和接口返回的結(jié)構(gòu)體,或者自定義的結(jié)構(gòu)體。
  • app/router:路由文件
  • app/services:服務實現(xiàn)邏輯目錄
  • app/utils:工具文件目錄
  • config/log:日志配置文件目錄,后面會講到怎么使用。
  • config/toml:配置文件使用,后面會講到怎么使用。
  • main.go作為程序的主入口。

配置文件使用

在我們項目結(jié)構(gòu)中,經(jīng)常會使用到配置文件。配置文件里面會記錄像mysql用戶名、端口、redis配置信息等等內(nèi)容。下面先配置一下toml_config.go,來對config.toml配置文件讀取。

下面是toml_config.go的內(nèi)容

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會根據(jù)設置順序依次查找
    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方法在加載該文件所在包的時候會默認執(zhí)行。

我們看一下配置的內(nèi)容,主要是日志級別和存放地址。

驗證的話,等下面日志配置好了一起看一下。

日志配置

下面繼續(xù)配置一下日志,也可以看到配置文件里面配置的日志級別和存放地址都是日志的配置項。

主要在config/log下的logger.go文件,配置了日志相關內(nèi)容。

logger.go的內(nèi)容如下

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}
    // 如果是開發(fā)環(huán)境,同時在控制臺上也輸出
    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,
    )
    // 開啟開發(fā)模式,堆棧跟蹤
    caller := zap.AddCaller()
    // 開啟文件及行號
    development := zap.Development()
    // 設置初始化字段,如:添加一個服務器名稱
    filed := zap.Fields(zap.String("application", "test-gin"))
    // 構(gòu)造日志
    Logger = zap.New(core, caller, development, filed)
    Logger.Info("Logger init success")
}

需要安裝依賴包,命令如下

go get github.com/spf13/viper

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

main.go增加下面的代碼

看一下執(zhí)行的日志

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

可以看到配置文件內(nèi)容的打印,還有日志的打印效果,OK,舒服了。

小結(jié)

這有幾個點要注意下:

1、init()和main()方法是golang默認的兩個方法,不需要我們調(diào)用,程序執(zhí)行會自動尋找項目中的這倆方法。如果引入了一個包,會優(yōu)先執(zhí)行引入包的init方法,再執(zhí)行自己包內(nèi)的init方法。

2、如果go項目構(gòu)建是報錯:missing go.sum entry for module providing package xxxxx

執(zhí)行一下命令:

go build -mod=mod

到此這篇關于詳解Go語言中配置文件使用與日志配置的文章就介紹到這了,更多相關Go語言日志配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go 中燒腦的接口及空接口

    Go 中燒腦的接口及空接口

    在Go語言的實際編程中,幾乎所有的數(shù)據(jù)結(jié)構(gòu)都圍繞接口展開,接口是Go語言中所有數(shù)據(jù)結(jié)構(gòu)的核心,這篇文章主要介紹了Go 中燒腦的接口,需要的朋友可以參考下
    2024-02-02
  • Go語言中的sync包同步原語最新詳解

    Go語言中的sync包同步原語最新詳解

    Go語言在sync包中提供了一套多才多藝的同步機制,以及用于管理對共享資源的并發(fā)訪問的原子操作,了解這些工具并為您的并發(fā)需求選擇合適的工具是編寫高效可靠的并發(fā)Go程序的關鍵,這篇文章主要介紹了Go語言中的`sync`包同步原語,需要的朋友可以參考下
    2023-12-12
  • Golang性能優(yōu)化的技巧分享

    Golang性能優(yōu)化的技巧分享

    性能優(yōu)化的前提是滿足正確可靠、簡潔清晰等質(zhì)量因素,針對?Go語言特性,本文為大家整理了一些Go語言相關的性能優(yōu)化建議,感興趣的可以了解一下
    2023-07-07
  • Go項目中添加生成時間與版本信息的方法

    Go項目中添加生成時間與版本信息的方法

    本文主要介紹了Go項目中添加生成時間與版本信息的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • go語言實現(xiàn)AES加密的方法

    go語言實現(xiàn)AES加密的方法

    這篇文章主要介紹了go語言實現(xiàn)AES加密的方法,實例分析了Go語言的加密技巧,需要的朋友可以參考下
    2015-03-03
  • 關于Golang中for-loop與goroutine的問題詳解

    關于Golang中for-loop與goroutine的問題詳解

    這篇文章主要給大家介紹了關于Golang中for-loop與goroutine問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用golang具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • 詳解Go語言中的Slice鏈式操作

    詳解Go語言中的Slice鏈式操作

    這篇文章主要為大家詳細介紹了Go語言中的Slice鏈式操作的相關知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • vscode配置go開發(fā)環(huán)境的實戰(zhàn)過程

    vscode配置go開發(fā)環(huán)境的實戰(zhàn)過程

    vscode配置go的開發(fā)環(huán)境很簡單,下面這篇文章主要給大家介紹了關于vscode配置go開發(fā)環(huán)境的實戰(zhàn)過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • Golang 如何解析和生成json

    Golang 如何解析和生成json

    這篇文章主要介紹了Golang 如何解析和生成json,幫助大家更好的理解和學習golang,感興趣的朋友可以了解下
    2020-09-09
  • Go語言線程安全之互斥鎖與讀寫鎖

    Go語言線程安全之互斥鎖與讀寫鎖

    這篇文章主要介紹了Go語言線程安全之互斥鎖與讀寫鎖,互斥鎖是為了并發(fā)的安全,在多個goroutine共同工作的時候,對于共享的數(shù)據(jù)十分不安全,而讀寫鎖效率革命,使用鎖的時候,安全與效率往往需要互相轉(zhuǎn)換,下文詳細內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02

最新評論

莒南县| 泸州市| 彭山县| 东丰县| 荔浦县| 贺州市| 延安市| 新民市| 三明市| 泊头市| 榆树市| 郎溪县| 龙岩市| 桦甸市| 金平| 江安县| 寿光市| 淅川县| 华容县| 北川| 特克斯县| 怀宁县| 固镇县| 北票市| 泽州县| 卢氏县| 铁岭县| 莱阳市| 民县| 永吉县| 洞头县| 长沙市| 扎囊县| 图们市| 库尔勒市| 防城港市| 体育| 金昌市| 澎湖县| 双流县| 那坡县|