[コード記事]独自のgolangフレームワークを最初から段階的に構築します(3)

前回の記事では、プロジェクトの基本的なディレクトリ構造を設定しました。では、私の考えを見てみましょう。

  1. エントリファイルを作成します。
  2. 構成、ログディレクトリを指定します。
  3. データベース、キュー、キャッシュコンポーネントディレクトリを指定します。
  4. データ処理用のコントローラディレクトリを作成します。
  5. パブリック関数などのその他の項目を指定します。

次に、この順序でコードを入力します。

エントリーファイル

func main()  {
    config.InitConfig()
    logger.InitLogger()
}

とりあえず実装の詳細を無視して、最初に設定とログを初期化する必要があります。まずログを見てみましょう。Uberのzapログライブラリを選択しました。ログモジュールの書き方を見てみましょうか?

ログ

package logger

import (
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "gopkg.in/natefinch/lumberjack.v2"
)

var l *zap.Logger

func InitLogger(logPath, logLevel string) error {
    hook := lumberjack.Logger{
        Filename:   logPath,
        MaxSize:    1024,
        MaxBackups: 3,
        MaxAge:     7,
        Compress:   true,
    }
    w := zapcore.AddSync(&hook)

    var level zapcore.Level
    switch logLevel {
    case "debug":
        level = zap.DebugLevel
    case "info":
        level = zap.InfoLevel
    case "error":
        level = zap.ErrorLevel
    default:
        level = zap.DebugLevel
    }

    encoderConfig := zap.NewProductionEncoderConfig()
    encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
    core := zapcore.NewCore(
        zapcore.NewConsoleEncoder(encoderConfig),
        w,
        level,
    )

    l = zap.New(core)

    return nil
}

func GetLogger() *zap.Logger {
    return l
}

まず、タイプ* zap.Loggerのパッケージレベルのグローバル変数lを定義し、InitLoggerとGetLoggerという2つの関数を作成します。zapはログのアーカイブをサポートしていないため、LumberjackフックがログをアーカイブするためにInitLoggerで定義されています。InitLoggerメソッドには、logPathとlogLevelの2つの入力パラメーターがあることがわかります。一般的に、これらのパラメーターは構成ファイルに配置する必要があります。その後、構成を書き込みます。

構成

config.jsonファイルを作成して、構成を保存します:
config.json:

{
  "log_config": {
    "log_path": "{your_path}",
    "log_level": "debug"
  }
}

次に、config.goで対応する構造を作成し、InitConfigメソッドとGetConfigメソッドを定義します。InitConfigメソッドでは、構成ファイルの内容を読み取って構造に解析し、エラーメッセージがある場合はエラーを処理します。 、エラーメッセージを1つのレイヤーにラップして、将来のエラーの場所を特定します。InitConfigには、構成ファイルのパスである入力パラメーターがあり、このパラメーターはコマンドラインから取得します。
config.go:

package config

import (
    "encoding/json"
    "github.com/pkg/errors"
    "io/ioutil"
)

type LogConfig struct {
    LogPath string `json:"log_path"`
    LogLevel string `json:"log_level"`
}

type Config struct {
    LogConfig LogConfig `json:"log_config"`
} 

var conf Config

func InitConfig(configPath string) error {
    configFile, err := ioutil.ReadFile(configPath)
    if err != nil {
        err = errors.Wrap(err, "Read config file failed.")
        return err
    }
    err = json.Unmarshal(configFile, &conf)
    if err != nil {
        err = errors.Wrap(err, "Unmarshal config file failed.")
        return err
    }
    return nil
}

func GetConfig() Config {
    return conf
}

もちろん、この構成以外にも、データベース、キャッシュ、その他の構成は追加されていませんが、急いではありません。最初にルートを見つけ、その後の構成をひょうたんに従ってペイントできます。

エントリファイルを調整する

さて、ログと設定の初期化はおおまかに書かれています。戻ってエントリファイルの調整を見てみましょう。

package main

import (
    "flag"
    "fmt"
    "github.com/TomatoMr/awesomeframework/config"
    "github.com/TomatoMr/awesomeframework/logger"
    "os"
)

func main()  {
    var configPath string
    flag.StringVar(&configPath, "config", "", "配置文件路径")
    flag.Parse()

    if configPath == "" {
        fmt.Printf("Config Path must be assigned.")
        os.Exit(1)
    }

    var err error
    err = config.InitConfig(configPath)
    if err != nil {
        fmt.Printf("Init config failed. Error is %v", err)
        os.Exit(1)
    }

    logConfig := config.GetConfig().LogConfig

    err = logger.InitLogger(logConfig.LogPath, logConfig.LogLevel)
    if err != nil {
        fmt.Printf("Init logger failed. Error is %v", err)
        os.Exit(1)
    }
    
    logger.GetLogger().Info("Init success.")
}

エントリファイルを調整し、コマンドラインから構成ファイルのパスを取得して、構成とログを初期化し、最終的に初期化結果を出力しました。

それをテストする

まず、コンパイルします。

$ go build 

次に、config.jsonファイルのlog_pathを変更し、コマンドラインで構成ファイルのパスを指定します。

$ awesomeframework --config={$your_path}/config.json

最後に、操作が正常でないことを確認します。ログファイルは次のように出力されます。

2020-01-19T20:41:57.506+0800	info	Init success.

まとめ

これまでのところ、構成とログを初期化しており、データベースとその他のコンポーネントの初期化を開始します。今日のコードhttps://github.com/TomatoMr/awesomeframeworkにあります
つづく...


私の公開番号onepunchgoに注目してください。

画像

元の記事を20件公開 Likes0 訪問数768

おすすめ

転載: blog.csdn.net/qq_31362439/article/details/104049169