ホームページ  >  記事  >  バックエンド開発  >  Golang はログ監査を実装します

Golang はログ監査を実装します

WBOY
WBOYオリジナル
2023-05-15 10:39:371026ブラウズ

ビジネスの継続的な発展に伴い、システムログと監査ログの重要性はますます高まっています。ロギング システムの長期的な開発には、効率的で信頼性の高いテクノロジーに加え、十分な柔軟性と拡張性が必要です。近年、効率的なプログラミング言語としての golang は、ログ監査においても独自の利点を示しています。この記事では、golang がログ監査をどのように実装しているかを紹介します。

1. ログ監査における golang の利点

1. コルーチン

Golang はコルーチン (ゴルーチン) の特徴を持ち、大量の同時実行プログラムを簡単に作成できます。これにより、同時トラフィックが多い状況下でもデータのセキュリティと整合性を確保し、マルチスレッド下でのさまざまな煩雑で危険な要因を回避できます。

2. ガベージ コレクション メカニズム

golang には、メモリを自動的に管理できる独自のガベージ コレクション メカニズムがあります。このメカニズムにより、メモリ リークの問題が解決されるだけでなく、プログラマのメモリ管理と処理が軽減され、プログラミングの効率が向上します。

3. クロスプラットフォーム機能

Golang のコードはプラットフォーム間でコンパイルできるため、非常に便利です。同時に、golang は、Windows、Linux、macOS などの主流のオペレーティング システムを含むさまざまなオペレーティング システムもサポートしており、さまざまなプラットフォームのニーズを満たすことができます。

4. パフォーマンスの最適化

golang のパフォーマンスは非常に優れており、他の言語に比べて速度と実行効率が高くなります。これは、高い同時実行下でもシステムのパフォーマンスを低下させることなくシステムのパフォーマンスを維持でき、インターフェイスの応答速度を確保し、システムの可用性と安定性を向上させることができることを意味します。

2. golang でログ監査を実装するための具体的な方法

1. ログ システムの設計

Golang は通常、ログ監査を実装するときに次の側面を考慮する必要があります。

    ログ レコードの形式: ログ システムは、ログ レコードを解析し、指定された形式に従って変換して保存できる必要があります。
  • データベース操作: golang の ORM フレームワークを使用することで、データベースの操作とデータの保存と読み取りを簡単に行うことができます。
  • 認証: ログ監査システムでは、特定の操作を監査するために認証が必要です。
  • ログクエリ: ログシステムのクエリ要件については、合理的なクエリ条件とクエリ方法を設計する方法を検討する必要があります。
  • ログ ストレージ: ログ データの整合性とセキュリティを確保するには、適切なストレージ方法を選択する必要があります。
2. logrus ライブラリを使用してロギングを実装する

golang では、logrus は、複数のログ出力メソッドをサポートし、豊富な API インターフェイスを提供する非常に人気のあるロギング フレームワークです。簡単に言えば、logrus は、高度にカスタマイズ可能なログ ソリューションを提供できるログ ライブラリです。

logrus は、次のレベルのログ出力をサポートします:

    trace
  • debug
  • info
  • warn
  • error
  • fatal
  • panic
logrus を使用すると、ログの記録、出力、管理が簡単に実現できます。出力レベル、ファイルへの出力、別のマシンへの出力など。この柔軟性により、golang はログ監査に理想的な選択肢となります。

3. 監査ログ システムの実装

シンプルな監査ログ システムを実装してみましょう。ユーザーの操作ログを記録し、データベースに蓄積することで管理者による監査を容易にするシステムです。

まず、golang Web サービス環境を構築するために、ルーティングを処理するためにサードパーティのライブラリ Gorilla/Mux を使用できます。ルーティングを実装した後、ログイン、ログアウト、クエリなどのインターフェイスごとに異なるハンドラー関数を定義する必要があります。

各インターフェースを処理した後、監査ログの記録を実装しましょう。 logrus ライブラリを使用してログを記録するには、まずログをコンソールまたは他の外部ファイルに出力できるログ プロセッサを定義します。

logrus.SetLevel(logrus.TraceLevel)

logrus.SetOutput(os.Stdout)

次に、インターフェイスの処理プロセス中に、各ユーザーの操作を記録する必要があります。 、具体的にはどのように記録すればよいのでしょうか?ログ形式テンプレートとログ オブジェクトを定義することで、ユーザーの操作を記録できます。ログを定義するとき、ユーザーのログインのユーザー名と IP アドレス、アクセスされたインターフェイスとリクエスト メソッドが記録されます。これにより、監査ログを記録するのが非常に便利になります。

ログ オブジェクト定義:

type AuditLog struct {

ID uint64
Username string
IPAddress string
Method string
Path string
CreatedAt time.Time

}

ログ形式:

func (auditLog *AuditLog) String () string {

// format the log into json format
buf := bytes.NewBuffer(nil)

// begin log format
buf.WriteString("{")
buf.WriteString(fmt.Sprintf(""id":"%d",", auditLog.ID))
buf.WriteString(fmt.Sprintf(""username":"%s",", auditLog.Username))
buf.WriteString(fmt.Sprintf(""ip_address":"%s",", auditLog.IPAddress))
buf.WriteString(fmt.Sprintf(""method":"%s",", auditLog.Method))
buf.WriteString(fmt.Sprintf(""path":"%s",", auditLog.Path))
buf.WriteString(fmt.Sprintf(""created_at":%d", auditLog.CreatedAt.Unix()))
// end log format
buf.WriteString("}")

return buf.String()

}

レコード監査ログ:

func AuditingLogMiddleware(next http.Handler) http.Handler {

return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    start := time.Now()

    var username string
    var ok bool

    // 根据实际场景修改,这里以token作为身份认证方式
    if token := r.Header.Get("Authorization"); token != "" {
        tokenParts := strings.Split(token, " ")

        if len(tokenParts) == 2 {
            tokenType := tokenParts[0]
            tokenContent := tokenParts[1]

            // 根据实际场景修改,这里假设发放的Token为JWT
            if tokenType == "Bearer" {
                claims, err := util.ParseJwtToken(util.JwtKey, tokenContent)
                if err == nil {
                    username, ok = claims["username"].(string)
                }
            }
        }
    }

    // 添加审计日志
    auditLog := &AuditLog{
        Username:  username, // 登录的用户名
        IPAddress: r.RemoteAddr, // 客户端IP地址
        Method:    r.Method, // http请求类型(GET、POST、PUT、DELETE……)
        Path:      r.URL.Path, // 请求的URL路径
        CreatedAt: time.Now(), // 日志创建时间
    }

    logrus.Trace(auditLog)

    // Call the next handler, which can be another middleware in the chain, or the final handler.
    next.ServeHTTP(w, r)

    // 审计log耗时
    end := time.Now()

    diff := end.Sub(start)
    logrus.Tracef("log time to response: %dms", int64(diff/time.Millisecond))
})

}

ログを記録した後、データベースにログを書き込む必要があります。ここでは、データベースを操作するためのORMフレームワークとしてgormを使用することを想定しています。

GORM は SQL データベース用の軽量 ORM ライブラリで、MySQL、PostgreSQL、Sqlite3 およびその他のデータベースをサポートします。

func DatabaseUri(ユーザー、パスワード、データベース、ホスト、ポート文字列) 文字列 {

return fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, host, port, database)

}

func SetupDB() エラー {

var err error

dbUri := DatabaseUri("root", "", "log_audit", "localhost", "3306")
db, err = gorm.Open(mysql.Open(dbUri), &gorm.Config{
    Logger: &logger.Default{},
})

if err != nil {
    panic("failed to connect database")
}

// 定义migration 操作等

return nil

}

SetupDB はデータベースを操作するための初期化関数であり、データベースを操作する前に必ず接続する必要があるため、必ず main 関数で最初に呼び出してください。

AuditLogMiddleware を呼び出す関数をサービス ルートに登録する必要があります。必要に応じてさまざまな監査要件を満たします。ビジネス ニーズは、kafka、nats、フォローアップ用のnsqなど 非同期処理。

この時点で、golang のログ監査の実装は完了です。上記の方法により、効率的で信頼性の高いロギング システムと監査モジュールを golang に実装することができ、ビジネス開発の強固な基盤を築き、システムの信頼性とセキュリティをより確実に確保できます。

以上がGolang はログ監査を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。