前回の記事では、プロジェクトの基本的なディレクトリ構造を設定しました。では、私の考えを見てみましょう。
- エントリファイルを作成します。
- 構成、ログディレクトリを指定します。
- データベース、キュー、キャッシュコンポーネントディレクトリを指定します。
- データ処理用のコントローラディレクトリを作成します。
- パブリック関数などのその他の項目を指定します。
次に、この順序でコードを入力します。
エントリーファイル
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に注目してください。