Go в примери: Отчети

package main

Стандартната библиотека на Го предоставя прости пособия за извеждане на съобщения относно работата на програмите. Пакетът log1 ни дава възможност да извеждаме такива съобщения в свободен вид, а пакетът log/slog в структуриран вид.


  1. log file – файл дневник, файл с отчет (за дейността на програмата)
import (
    "bytes"
    "fmt"
    "log"
    "log/slog"
    "os"
)
func main() {

Просто извикваме функции като Println от пакета log, който е предварително настроен да извежда съобщения в os.Stderr. Допълнителните функции като Fatal* или Panic* ще прекратят програмата след като изведат съобщения в предварително настроения дневник.

    log.Println("стандартния отчетник")

Отчетниците1 могат да бъдат настройвани чрез флагове, определящи изгледа на записите. На стандартния отчетник по подразбиране са му включени флаговете log.Ldate и log.Ltime. Можем да променим флаговете, така че да се извежда времето с точност до микросекунда.


  1. logger – буквално отчетник (който попълва отчет в дневник)
    log.SetFlags(log.LstdFlags | log.Lmicroseconds)
    log.Println("с микросекунди")

log също може да извежда името на файла и реда, където е извикана отчитащата функция.

    log.SetFlags(log.LstdFlags | log.Lshortfile)
    log.Println("с файл и ред")

Може да ви е от полза да създадете приспособен отчетник и да го подавате наоколо. Когато създаваме нов отчетник, можем да да настроим представка, с която да се отличават неговите записи от тези на други отчетници.

    моят := log.New(os.Stdout, "мой:", log.LstdFlags)
    моят.Println("от мен")

Можем да задаваме представка на вече съществуващи отчетници (включително и на стандартния) с метода SetPrefix.

    моят.SetPrefix("моят:")
    моят.Println("от моя")

Отчетниците могат да бъдат създадени с целеви изход; всеки склад, осъществяващ взаимодействието io.Writer, е подходящ.

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

Това извиквне пише изхода си в buf.

    buflog.Println("здрасти")

А това извикване извежда складираните в buf записи на стандартния изход.

    fmt.Print("от 'buflog':", buf.String())

Пакетът slog предоставя структурирано извеждане на записите. Например лесно извежда записите във вид на JSON.

    jsonHandler := slog.NewJSONHandler(os.Stderr, nil)
    myslog := slog.New(jsonHandler)
    myslog.Info("хей, здравей")

Освен самия отчетен запис, изходът от slog може да съдържа произволен брой двойки ключ=запис.

    myslog.Info("здрасти пак", "ключ", "стойност",
        "възраст", 25)
}

Примерен изход: датата и времето зависят от това, кога е бил пуснат примера.

$ go run logging.go
2026/05/18 12:30:56 стандартния отчетник
2026/05/18 12:30:56.665801 с микросекунди
2026/05/18 12:30:56 logging.go:45: с файл и ред
мой:2026/05/18 12:30:56 от мен
моят:2026/05/18 12:30:56 от моя
от 'buflog':buf:2026/05/18 12:30:56 здрасти

Тези записи се пренасят на нов ред с цел по-добро представяне на сайта; в действителност се извежда по един запис на ред.

{"time":"2026-05-18T12:30:56.665856473+03:00",
    "level":"INFO","msg":"хей, здравей"}
{"time":"2026-05-18T12:30:56.665879347+03:00",
    "level":"INFO","msg":"здрасти пак",
    "ключ":"стойност","възраст":25}

Следващ пример: .