افزودن رنگ به خروجی گزارش Logging Libraries In Go

ورود به سیستم بخشی جدایی ناپذیر از توسعه نرم افزار است که به توسعه دهندگان بینش ارزشمندی در مورد رفتار و عملکرد برنامه های کاربردی خود ارائه می دهد. در زبان برنامهنویسی Go، کتابخانههای گزارشگیری مختلف، مانند بسته لاگ کتابخانه استاندارد یا گزینههای شخص ثالث مانند logrus، zap و zerolog، تولید خروجی گزارش را تسهیل میکنند. در حالی که هدف اصلی ثبتنام انتقال اطلاعات است، پیامهای سیاه و سفید سنتی گاهی اوقات تشخیص سریع اطلاعات حیاتی در میان دریایی از سیاههها را دشوار میسازد.
نیاز به رنگ آمیزی سیاهههای مربوط
اولویت بندی و برجسته سازی: رنگ را می توان برای اولویت بندی و برجسته کردن اطلاعات مهم استفاده کرد. به عنوان مثال، پیامهای خطا یا گزارشهای هشدار را میتوان با رنگهای جلبکننده توجه مانند قرمز یا زرد نشان داد و زمانی که مشکلی نیاز به توجه فوری دارد، فوراً آشکار میشود. این امر پاسخگویی سریعتر به مشکلات احتمالی را تسهیل می کند.
خوانایی پیشرفته: رنگ ها می توانند خوانایی کلی پیام های گزارش را با افزودن ساختار و سلسله مراتب بصری بهبود بخشند. تمایز بین سطوح گزارش، مُهرهای زمانی و اطلاعات متنی شهودیتر میشود، که منجر به تجربه کاربرپسندتری در طول تجزیه و تحلیل گزارش و عیبیابی میشود.
اشکال زدایی کاربر پسند: توسعه دهندگان زمان قابل توجهی را صرف تعامل با لاگ ها در حین اشکال زدایی می کنند. ثبت رنگ با این امکان به توسعه دهندگان امکان می دهد تا اطلاعات مربوطه، خطاها یا الگوهای مربوطه را در خروجی های گزارش به سرعت شناسایی کنند، به تجربه اشکال زدایی کاربر پسندتر کمک می کند و در نتیجه فرآیند اشکال زدایی را تسریع می بخشد.
پشتیبانی از رنگ آمیزی کلمات کلیدی سطح ورود به سیستم
تقریباً تمام کتابخانههای گزارشگیری گزینهای را برای فعال کردن رنگبندی برای کلمات کلیدی سطح گزارش مانند اطلاعات، اشکالزدایی، هشدار و خطا ارائه میدهند.
در مورد Zap، می توانید از تابع CapitalColorLevelEncoder برای دستیابی به این اثر استفاده کنید.
در اینجا مثالی از نحوه پیکربندی Zap برای فعال کردن سطوح گزارش رنگی آورده شده است:
logCfg := zap.NewDevelopmentConfig()
logCfg.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
سیاهههای متنی
در سیستمهای پیچیده و موقعیتهای اشکالزدایی دشوار، افزودن جزئیات اضافی به پیامهای گزارش بسیار مهم است. این اطلاعات اضافی، مانند مقادیر متغیر، مُهرهای زمانی، و شناسههای کاربری، به توسعهدهندگان کمک میکند تا آنچه را که در زمانهای خاص در برنامه اتفاق میافتد درک کنند. ثبت متنی پیامهای گزارش را با اتصال آنها به جفتهای کلید-مقدار پویا افزایش میدهد و انعطافپذیری بیشتری نسبت به فرمتهای ثابت میدهد. این روش در هنگام اشکالزدایی بسیار مفید است، و باعث میشود مسائل اصلی را سریعتر پیدا کنید و نحوه اجرای برنامه را درک کنید.
توجه: برای پیگیری،
با اجرای mkdir color-logs و cd color-logs برای تغییر دایرکتوری acolor-logsdirectory ایجاد کنید.
یک ماژول را با rungo mod init example.com/color-logs شروع کنید، در اینجا ما از “example.com/color-logs” به عنوان مسیر ماژول استفاده کرده ایم.
در ویرایشگر متن خود، فایلی ایجاد کنید که در آن کد خود را بنویسید و itmain.go را فراخوانی کنید.
اطمینان حاصل کنید که وابستگی های لازم را با اجرای برنامه getbefore اجرا کنید و main.go را اجرا کنید.
در اینجا نمونه ای از نحوه نمایش گزارش های متنی در کتابخانه ثبت zerolog آورده شده است:
package main
import "github.com/rs/zerolog/log"
func main() {
log.Debug().
Str("Scale", "833 cents").
Float64("Interval", 833.09).
Msg("Fibonacci is everywhere")
}
// output:
// {"level":"debug","Scale":"833 cents","Interval":833.09,"time":"2024-01-24T22:01:03+05:30","message":"Fibonacci is everywhere"}
عدم پشتیبانی بومی از سیاهههای مربوط به رنگ
در حالی که گزارش متنی ابزار قدرتمندی برای افزایش اطلاعات فراهم می کند، بازنمایی بصری این زمینه اغلب تک رنگ باقی می ماند. متأسفانه، بسیاری از کتابخانههای گزارشگیری ذاتاً از رنگآمیزی اجزای کلیدی و ارزشی در ورودیهای گزارش پشتیبانی نمیکنند. این عدم وجود فرصتی را برای توسعه دهندگان از دست می دهد تا از نشانه های بصری برای شناسایی سریع و تمایز اطلاعات حیاتی استفاده کنند و مانع کارایی تجزیه و تحلیل گزارش و فرآیندهای اشکال زدایی شوند.
بیایید ببینیم اگر بخواهیم رنگی را به ورود به متن zap اضافه کنیم چه اتفاقی میافتد:
package main
import (
"github.com/fatih/color"
"go.uber.org/zap"
)
func main() {
PlainLogger, _:= zap.NewDevelopment()
var HighlightGreen = color.New(color.FgGreen).SprintFunc()
PlainLogger.Info("test log", zap.String(HighlightGreen("key"), "value"))
}
خروجی تولید شده به صورت زیر خواهد بود:
2024-01-24T22:23:16.356+0530 INFO zap-logging/main.go:66 گزارش آزمایشی {“\u001b[32mkey\u001b[0m”: “value”}
The reason why the ANSI escape code for colour formatting are not interpreted is because of the way the EncoderEntry function is implemented in zapcore package.
We will now discuss how to solve this misinterpretation.
Colouring contextual logs
The primary cause of the mentioned problem lies with the default encoder, which can be either “json” or “console.” To address this, we’ll begin by crafting our own encoder.
1.Lets create a custom encoder named colorConsoleEncoder will be initialized by NewColorConsole:
type colorConsoleEncoder struct {
*zapcore.EncoderConfig
zapcore.Encoder
}
func NewColorConsole(cfg zapcore.EncoderConfig) (enc zapcore.Encoder) {
return colorConsoleEncoder{
EncoderConfig: &cfg,
// Using the default ConsoleEncoder can avoid rewriting interfaces such as ObjectEncoder
Encoder: zapcore.NewConsoleEncoder(cfg),
}
}
2.We will then register our encoder using RegisterEncoder function
func init() {
_ = zap.RegisterEncoder("colorConsole", func(config zapcore.EncoderConfig) (zapcore.Encoder, error) {
return NewColorConsole(config), nil
})
}
3.The misinterpretation issue discussed earlier is associated with the EncodeEntry function within the Encoder interface of the zapcore package. To address this, it is necessary to override this function.
// EncodeEntry overrides ConsoleEncoder's EncodeEntry
func (c colorConsoleEncoder) EncodeEntry(ent zapcore.Entry, fields []zapcore.Field) (buf *buffer.Buffer, err error) { buff, err := c.Encoder.EncodeEntry(ent,fields) // از پیاده سازی موجود zap استفاده کنید if err !=nil { return nil, err } bytesArr := bytes.Replace(buff.Bytes()، []بایت ("\\u001b")، []byte("\u001b")، -1) buff.Reset() buff.AppendString(string(bytesArr)) بازگشت buff، err }
این تابع از اجرای EncodeEntry موجود از فیلد Encoder تعبیه شده استفاده می کند، اما یک تصحیح با استفاده از bytes.Replace معرفی می کند. هدف این است که رخدادهای “\u001b” (که نشان دهنده یک اسلش تحت اللفظی به دنبال کاراکترهای “u001b” است) با کد فرار ANSI “\u001b” (نماینده نویسه فرار) جایگزین شود. این تنظیم کنترل دقیق کدهای فرار ANSI را در طول رمزگذاری ورود به گزارش تضمین میکند و امکان رنگبندی مورد نظر را بدون ایجاد اختلال در عملکرد کلی سیستم گزارشگیری فراهم میکند.
4. اکنون می توانیم یک تابع setupLogger ایجاد کنیم که از رمزگذار ثبت شده استفاده می کند و یک لاگر با رنگ بندی تولید می کند.
func setupLogger() *zap.Logger {
logCfg := zap.NewDevelopmentConfig()
logCfg.Encoding = "colorConsole"
logger, _ := logCfg.Build()
return logger
}
5. برای دیدن اثر یک Log بنویسید
func main() {
ColorLogger := setupLogger()
var HighlightGreen = color.New(color.FgGreen).SprintFunc()
var HighlightYellow = color.New(color.FgYellow).SprintFunc()
ColorLogger.Info("test log", zap.String(HighlightGreen("key"), HighlightYellow("value")))
}
برای اجرای کد کامل، دستورات زیر را در ترمینال خود اجرا کنید:
git clone https://github.com/AkashKumar7902/coloring-log-output
cd coloring-log-output
go run main.go
در حالی که ما به طور خاص این جنبه را برای کتابخانه گزارشگیری Zap پوشش دادهایم، راهحلهای قابل مقایسه را میتوان برای سایر کتابخانههای گزارشگیری نیز شناسایی کرد 🙂
با تشکر و رنگ آمیزی مبارک 🎨 !
سوالات متداول
آیا می توانم پیام های ثبت کد رنگی را در Go انجام دهم؟
بله، رنگآمیزی پیامهای گزارش خوانایی را بهبود میبخشد و به اولویتبندی اطلاعات حیاتی کمک میکند. کتابخانه های محبوب مانند Zap و zerolog پشتیبانی داخلی را ارائه می دهند یا امکان سفارشی سازی از طریق رمزگذارهای سفارشی را فراهم می کنند.
آیا باید رنگ آمیزی را به سیاهههای متنی اضافه کنم؟
رنگآمیزی گزارشهای متنی (جفتهای کلید-مقدار) اشکالزدایی را سریعتر میکند. شما به راحتی می توانید جزئیات مربوطه را تشخیص دهید و بین مقادیر تفاوت قائل شوید که منجر به شناسایی سریعتر مشکل می شود.
چگونه می توانم یک رمزگذار سفارشی برای لاگ های رنگ آمیزی ایجاد کنم؟
در حالی که برخی از کتابخانه ها به طور پیش فرض رنگ بندی را ارائه می دهند، می توانید برای دستیابی به کنترل بیشتر یک رمزگذار سفارشی ایجاد کنید. این معمولاً شامل نادیده گرفتن تابع EncodeEntry برای مدیریت صحیح کدهای فرار ANSI است.