123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- package glog
- import (
- "bytes"
- "context"
- "time"
- )
- // Handler is function handler for custom logging content outputs.
- type Handler func(ctx context.Context, in *HandlerInput)
- // HandlerInput is the input parameter struct for logging Handler.
- type HandlerInput struct {
- Logger *Logger // Logger.
- Ctx context.Context // Context.
- Buffer *bytes.Buffer // Buffer for logging content outputs.
- Time time.Time // Logging time, which is the time that logging triggers.
- TimeFormat string // Formatted time string, like "2016-01-09 12:00:00".
- Color int // Using color, like COLOR_RED, COLOR_BLUE, etc.
- Level int // Using level, like LEVEL_INFO, LEVEL_ERRO, etc.
- LevelFormat string // Formatted level string, like "DEBU", "ERRO", etc.
- CallerFunc string // The source function name that calls logging.
- CallerPath string // The source file path and its line number that calls logging.
- CtxStr string // The retrieved context value string from context.
- Prefix string // Custom prefix string for logging content.
- Content string // Content is the main logging content that passed by you.
- IsAsync bool // IsAsync marks it is in asynchronous logging.
- handlerIndex int // Middleware handling index for internal usage.
- }
- // Next calls the next logging handler in middleware way.
- func (i *HandlerInput) Next() {
- if len(i.Logger.config.Handlers)-1 > i.handlerIndex {
- i.handlerIndex++
- i.Logger.config.Handlers[i.handlerIndex](i.Ctx, i)
- } else {
- defaultHandler(i.Ctx, i)
- }
- }
- // String returns the logging content formatted by default logging handler.
- func (i *HandlerInput) String(withColor ...bool) string {
- formatWithColor := false
- if len(withColor) > 0 {
- formatWithColor = withColor[0]
- }
- return i.getDefaultBuffer(formatWithColor).String()
- }
- func (i *HandlerInput) getDefaultBuffer(withColor bool) *bytes.Buffer {
- buffer := bytes.NewBuffer(nil)
- if i.TimeFormat != "" {
- buffer.WriteString(i.TimeFormat)
- }
- if i.LevelFormat != "" {
- if withColor {
- i.addStringToBuffer(buffer, i.Logger.getColoredStr(
- i.Logger.getColorByLevel(i.Level), i.LevelFormat,
- ))
- } else {
- i.addStringToBuffer(buffer, i.LevelFormat)
- }
- }
- if i.Prefix != "" {
- i.addStringToBuffer(buffer, i.Prefix)
- }
- if i.CtxStr != "" {
- i.addStringToBuffer(buffer, i.CtxStr)
- }
- if i.CallerFunc != "" {
- i.addStringToBuffer(buffer, i.CallerFunc)
- }
- if i.CallerPath != "" {
- i.addStringToBuffer(buffer, i.CallerPath)
- }
- if i.Content != "" {
- i.addStringToBuffer(buffer, i.Content)
- }
- i.addStringToBuffer(buffer, "\n")
- return buffer
- }
- func (i *HandlerInput) getRealBuffer(withColor bool) *bytes.Buffer {
- if i.Buffer.Len() > 0 {
- return i.Buffer
- }
- return i.getDefaultBuffer(withColor)
- }
- // defaultHandler is the default handler for logger.
- func defaultHandler(ctx context.Context, in *HandlerInput) {
- buffer := in.Logger.doDefaultPrint(ctx, in)
- if in.Buffer.Len() == 0 {
- in.Buffer = buffer
- }
- }
- func (i *HandlerInput) addStringToBuffer(buffer *bytes.Buffer, strings ...string) {
- for _, s := range strings {
- if buffer.Len() > 0 {
- buffer.WriteByte(' ')
- }
- buffer.WriteString(s)
- }
- }
|