Dengan perkembangan perniagaan yang berterusan, kepentingan log sistem dan log audit juga semakin meningkat. Pembangunan jangka panjang sistem pembalakan memerlukan teknologi yang cekap dan boleh dipercayai, serta fleksibiliti dan skalabiliti yang mencukupi. Dalam beberapa tahun kebelakangan ini, golang, sebagai bahasa pengaturcaraan yang cekap, juga telah menunjukkan kelebihan unik dalam pengauditan log Artikel ini akan memperkenalkan cara golang melaksanakan pengauditan log.
1. Kelebihan golang dalam pengauditan log
1 Coroutine
Golang mempunyai ciri goroutine dan boleh mencipta sejumlah besar program pelaksanaan serentak , yang membolehkannya. untuk memastikan keselamatan dan integriti data di bawah trafik serentak yang tinggi dan mengelakkan pelbagai faktor menyusahkan dan berbahaya di bawah multi-threading.
2. Mekanisme kutipan sampah
golang mempunyai mekanisme kutipan sampah sendiri yang boleh menguruskan memori secara automatik. Mekanisme ini bukan sahaja menyelesaikan masalah kebocoran memori, tetapi juga mengurangkan pengurusan dan pemprosesan memori pengaturcara, meningkatkan kecekapan pengaturcaraan.
3. Merentas platform
Kod Golang boleh disusun merentas platform, yang sangat mudah. Pada masa yang sama, golang juga menyokong pelbagai sistem pengendalian, termasuk sistem pengendalian arus perdana seperti Windows, Linux, macOS, dll., yang boleh memenuhi keperluan platform yang berbeza.
4. Pengoptimuman prestasi
Prestasi golang sangat baik, kelajuan dan kecekapan pelaksanaannya lebih tinggi daripada bahasa lain. Ini bermakna prestasi sistem boleh dikekalkan di bawah keadaan konkurensi yang tinggi, kelajuan tindak balas antara muka dapat dipastikan, dan ketersediaan dan kestabilan sistem boleh dipertingkatkan.
2. Kaedah khusus untuk melaksanakan pengauditan log di golang
1 Reka bentuk sistem log
Golang secara amnya perlu mengambil kira aspek berikut semasa melaksanakan pengauditan log:
2. Gunakan perpustakaan logrus untuk melaksanakan pengelogan
Dalam golang, logrus ialah rangka kerja pengelogan yang sangat popular yang menyokong berbilang kaedah keluaran log dan menyediakan antara muka API yang kaya. Ringkasnya, logrus ialah perpustakaan pembalakan yang boleh menyediakan penyelesaian pembalakan yang sangat disesuaikan.
logrus menyokong tahap output log berikut:
Menggunakan logrus boleh merakam, mengeluarkan dan mengurus log dengan mudah Sebagai contoh, kita boleh menyesuaikan format output, tahap Output, output ke fail, output ke mesin lain, dsb. Fleksibiliti ini menjadikan golang sebagai pilihan ideal untuk pengauditan log.
3. Laksanakan sistem log audit
Mari laksanakan sistem log audit yang mudah. Sistem ini boleh merekodkan log operasi pengguna dan menyimpannya dalam pangkalan data, memudahkan pentadbir menjalankan audit.
Pertama sekali, untuk membina persekitaran perkhidmatan web golang, kami boleh menggunakan gorila/mux perpustakaan pihak ketiga untuk mengendalikan penghalaan. Selepas melaksanakan penghalaan, kita perlu menentukan fungsi pengendali yang berbeza untuk setiap antara muka, seperti log masuk, log keluar, pertanyaan, dsb.
Selepas memproses setiap antara muka, mari laksanakan rakaman log audit. Kita boleh menggunakan perpustakaan logrus untuk merekodkan log mula-mula menentukan pemproses log, yang boleh mengeluarkan log ke konsol atau fail luaran yang lain.
logrus.SetLevel(logrus.TraceLevel)
logrus.SetOutput(os.Stdout)
Kemudian, dalam proses memproses antara muka, kita perlu merekodkan operasi setiap pengguna , khususnya Bagaimana ia perlu direkodkan? Anda boleh merekodkan operasi pengguna dengan menentukan templat format log dan objek log. Apabila kami mentakrifkan log, kami akan merekodkan nama pengguna dan alamat IP log masuk pengguna, serta antara muka yang diakses dan kaedah permintaan. Ini menjadikannya sangat mudah untuk merekodkan log audit.
Takrif objek log:
taip struct AuditLog {
ID uint64 Username string IPAddress string Method string Path string CreatedAt time.Time
}
Format log:
func (auditLog *AuditLog) Rentetan () rentetan {
// 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()
}
Rekod log audit:
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)) })
}
Selepas merekod log, kita perlu menulis log ke pangkalan data. Di sini kami menganggap bahawa gorm digunakan sebagai rangka kerja ORM untuk mengendalikan pangkalan data.
GORM ialah perpustakaan ORM yang ringan untuk pangkalan data SQL, menyokong MySQL, PostgreSQL, Sqlite3 dan pangkalan data lain.
func DatabaseUri(pengguna, kata laluan, pangkalan data, hos, rentetan port) {
return fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, host, port, database)
}
func SetupDB() ralat {
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
}
Ingat untuk memanggil SetupDB terlebih dahulu dalam fungsi utama, kerana ia adalah fungsi permulaan untuk mengendalikan pangkalan data, dan anda perlu memastikan untuk menyambung kepadanya sebelum mengendalikan pangkalan data.
Fungsi memanggil AuditLogMiddleware perlu didaftarkan dalam laluan perkhidmatan untuk memenuhi keperluan audit yang berbeza mengikut keperluan. dsb. untuk pemprosesan Asynchronous susulan.
Pada ketika ini, pelaksanaan pengauditan log di golang selesai. Melalui kaedah di atas, kami boleh melaksanakan sistem pembalakan dan modul audit yang cekap dan boleh dipercayai di golang, meletakkan asas yang kukuh untuk pembangunan perniagaan kami dan memastikan kebolehpercayaan dan keselamatan sistem dengan lebih baik.
Atas ialah kandungan terperinci Golang melaksanakan pengauditan log. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!