لغة Go بالأمثلة: تسجيل الأحداث

توفر مكتبة Go القياسية أدوات مباشرة لإخراج السجلات من برامج Go، باستخدام الحزمة log للخرج الحر، والحزمة log/slog للخرج المنظم.

package main
import (
    "bytes"
    "fmt"
    "log"
    "os"
    "log/slog"
)
func main() {

يستخدم مجرد استدعاء دوال مثل Println من الحزمة log مسجّل الأحداث _القياسي_، المهيأ مسبقًا لإخراج سجلات مناسبة إلى os.Stderr. تؤدي أساليب إضافية مثل Fatal* أو Panic* إلى خروج البرنامج بعد التسجيل.

    log.Println("standard logger")

يمكن إعداد مسجّلات الأحداث باستخدام خيارات تحدد صيغة خرجها. تكون خيارات log.Ldate وlog.Ltime مفعلة افتراضيًا في المسجّل القياسي، وهي مجمعة في log.LstdFlags. يمكننا مثلًا تغيير خياراته لإخراج الوقت بدقة الميكروثانية.

    log.SetFlags(log.LstdFlags | log.Lmicroseconds)
    log.Println("with micro")

يدعم أيضًا إخراج اسم الملف ورقم السطر الذي استُدعيت منه دالة log.

    log.SetFlags(log.LstdFlags | log.Lshortfile)
    log.Println("with file/line")

قد يفيد إنشاء مسجّل أحداث مخصص وتمريره. عند إنشاء مسجّل جديد، يمكننا تعيين بادئة لتمييز خرجه من خرج المسجّلات الأخرى.

    mylog := log.New(os.Stdout, "my:", log.LstdFlags)
    mylog.Println("from mylog")

يمكننا تعيين البادئة لمسجّلات الأحداث الموجودة، بما فيها المسجّل القياسي، باستخدام الأسلوب SetPrefix.

    mylog.SetPrefix("ohmy:")
    mylog.Println("from mylog")

يمكن أن تكون لمسجّلات الأحداث أهداف خرج مخصصة؛ إذ يصلح أي io.Writer.

    var buf bytes.Buffer
    buflog := log.New(&buf, "buf:", log.LstdFlags)

يكتب هذا الاستدعاء خرج السجل في buf.

    buflog.Println("hello")

سيعرضه هذا فعليًا على الخرج القياسي.

    fmt.Print("from buflog:", buf.String())

توفر الحزمة slog خرج سجلات منظمًا. ويكون تسجيل الأحداث بصيغة JSON مباشرًا مثلًا.

    jsonHandler := slog.NewJSONHandler(os.Stderr, nil)
    myslog := slog.New(jsonHandler)
    myslog.Info("hi there")

يمكن أن يحتوي خرج slog، إضافة إلى الرسالة، على أي عدد من أزواج key=value.

    myslog.Info("hello again", "key", "val", "age", 25)
}

هذا خرج نموذجي؛ يعتمد التاريخ والوقت الناتجان على وقت تشغيل المثال.

$ go run logging.go
2023/08/22 10:45:16 standard logger
2023/08/22 10:45:16.904141 with micro
2023/08/22 10:45:16 logging.go:40: with file/line
my:2023/08/22 10:45:16 from mylog
ohmy:2023/08/22 10:45:16 from mylog
from buflog:buf:2023/08/22 10:45:16 hello

قُسّم هذا الخرج على عدة أسطر لتوضيح عرضه على الموقع، لكنه يُخرج في الواقع في سطر واحد.

{"time":"2023-08-22T10:45:16.904166391-07:00",
 "level":"INFO","msg":"hi there"}
{"time":"2023-08-22T10:45:16.904178985-07:00",
    "level":"INFO","msg":"hello again",
    "key":"val","age":25}

المثال التالي: .