Go では、ログ記録は非常に重要な側面です。アプリケーションを開発するときは、必要に応じて調査やトラブルシューティングができるように、アプリケーションの動作を 1 か所に記録する必要があります。標準ライブラリのログ パッケージは、いくつかの基本的なログ機能を提供しますが、実際のアプリケーションでは、より複雑で高度なログ ツールが必要になる場合があります。ここでカスタム ログが役に立ちます。
この記事では、Go でカスタム ログを使用する方法を学びます。
標準ライブラリのログ パッケージはすでに基本的なログのニーズを満たすことができますが、ログ パッケージには制限があることに注意してください。より低いレベルのよりカスタマイズされたコントロールが必要になる場合があります。したがって、サードパーティ パッケージ「zap」を使用してカスタム ロガーを作成します。
zap を使用するには、最初にそれをインストールする必要があります。これは次のコマンドで実行できます:
go get -u go.uber.org/zap
インストールが完了したら、基本的なロガーを作成できます:
package main import "go.uber.org/zap" func main() { logger, err := zap.NewProduction() if err != nil { panic(err) } logger.Info("Hello, world!") }
上記のサンプル コードでは、NewProduction() 関数を使用して運用レベルのロガーを作成します。
もちろん、これだけではニーズを満たすのに十分ではありません。独自のロガーを定義する必要があります。 zap.NewDevelopment() または zap.NewProduction() を使用して汎用ロガーを作成できますが、複雑なアプリケーションの場合はカスタム ロガーの作成が必要になる場合があります。
次のコード例では、「myLogger」という名前のカスタム ロガーを定義します。
package main import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func main() { cfg := zap.Config{ Encoding: "console", Level: zap.NewAtomicLevelAt(zapcore.DebugLevel), OutputPaths: []string{"stdout"}, ErrorOutputPaths: []string{"stderr"}, EncoderConfig: zapcore.EncoderConfig{ TimeKey: "timestamp", MessageKey: "message", CallerKey: "caller", EncodeTime: zapcore.ISO8601TimeEncoder, EncodeDuration: zapcore.StringDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, }, } logger, err := cfg.Build() if err != nil { panic(err) } logger.Debug("Debug message") logger.Info("Info message") logger.Warn("Warn message") logger.Error("Error message") }
上の例では、最初に「cfg」という名前のカスタム ロガー構成構造を定義します。設定構造には、出力形式、ログ レベル、出力場所など、ロガーに必要なすべてのパラメータが含まれています。
次に、 cfg.Build() 関数を使用してロガーを作成します。これにより、ログ メッセージの印刷に使用できるカスタム設定を備えたロガーが得られます。上の例では、さまざまなレベルのログ メッセージを出力しました。
カスタム ロガーの重要な機能は、コンテキスト情報を追加する機能です。コンテキスト情報を追加すると、何が起こったのかをより深く理解し、問題を迅速に特定できます。
次の例では、logger.With() 関数を使用して、「user_id」という名前のコンテキスト フィールドを追加します。
package main import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func main() { cfg := zap.Config{ Encoding: "console", Level: zap.NewAtomicLevelAt(zapcore.DebugLevel), OutputPaths: []string{"stdout"}, ErrorOutputPaths: []string{"stderr"}, EncoderConfig: zapcore.EncoderConfig{ TimeKey: "timestamp", MessageKey: "message", CallerKey: "caller", EncodeTime: zapcore.ISO8601TimeEncoder, EncodeDuration: zapcore.StringDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, }, } logger, err := cfg.Build() if err != nil { panic(err) } userId := "user123" logger = logger.With(zap.String("user_id", userId)) logger.Info("Info message") }
上の例では、logger.With() を使用します。関数は新しいロガーを作成します。これには、値「user123」を持つ「user_id」というコンテキスト フィールドが含まれます。
これは、どのユーザーがシステムを使用しているかを簡単に把握し、ユーザー関連の問題のトラブルシューティングを行うことができるため、実際のアプリケーションで非常に役立ちます。
デフォルトでは、カスタム ロガーはメッセージを stdout に記録します。ただし、実際のアプリケーションでは、ログの管理と展開を容易にするために、ログ メッセージをファイルに記録する必要があります。
zap ロガーは、ファイル、stdout、stderr などの複数の出力タイプを提供します。アプリケーションに応じて、出力のタイプを選択できます。
次の例では、ファイルにログを記録しています:
package main import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func main() { cfg := zap.Config{ Encoding: "console", Level: zap.NewAtomicLevelAt(zapcore.DebugLevel), OutputPaths: []string{"myapp.log"}, ErrorOutputPaths: []string{"myapp.log"}, EncoderConfig: zapcore.EncoderConfig{ TimeKey: "timestamp", MessageKey: "message", CallerKey: "caller", EncodeTime: zapcore.ISO8601TimeEncoder, EncodeDuration: zapcore.StringDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, }, } logger, err := cfg.Build() if err != nil { panic(err) } logger.Info("Testing log file...") }
上の例では、OutputPaths フィールドと ErrorOutputPaths フィールドにファイル パスを指定しています。これにより、ロガーはログを書き込みます。メッセージを myapp.log ファイルに送信します。
要約すると、カスタム ロガーは、実際のアプリケーションのニーズを満たすことができるように、より高い柔軟性とカスタマイズ機能を提供します。カスタム ロガーを使用すると、特定の情報を簡単に記録でき、必要に応じてログ データの処理と分析が容易になります。
以上がGo でカスタム ログを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。