log

package
v0.0.0-...-04cfb28 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 22, 2020 License: MIT Imports: 10 Imported by: 0

README

一、日志文件切割

package main

import (
	"fmt"
	"github.com/nothollyhigh/kiss/log"
	"io"
	"os"
	"time"
)

func main() {
	fileWriter := &log.FileWriter{
		RootDir:     "./logs/" + time.Now().Format("20060102150405/"), //日志根目录,每次启动新建目录
		DirFormat:   "200601021504/",                                  //按时间格式分割日志文件子目录,""则不拆分子目录;此处测试按分钟
		FileFormat:  "20060102150405.log",                             //按时间格式切割日志文件,此处测试按秒
		MaxFileSize: 1024 * 256,                                       //按最大size切割日志文件
		EnableBufio: false,                                            //是否启用bufio,重要日志建议不开启
	}

	out := io.MultiWriter(os.Stdout, fileWriter)
	log.SetOutput(out)

	log.SetLevel(log.LEVEL_WARN)

	i := 0
	for {
		i++
		log.Debug(fmt.Sprintf("log %d", i))
		log.Info(fmt.Sprintf("log %d", i))
		log.Warn(fmt.Sprintf("log %d", i))
		log.Error(fmt.Sprintf("log %d", i))
	}
}

二、在gin中使用kiss log

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/nothollyhigh/kiss/log"
	"os"
	"time"
)

func main() {
	router := gin.New()

	router.Use(func(c *gin.Context) {
		start := time.Now()
		path := c.Request.URL.Path
		raw := c.Request.URL.RawQuery

		c.Next()

		end := time.Now()
		latency := end.Sub(start)
		clientIP := c.ClientIP()
		method := c.Request.Method
		statusCode := c.Writer.Status()
		comment := c.Errors.ByType(gin.ErrorTypePrivate).String()
		if raw != "" {
			path = path + "?" + raw
		}
		logLevel := log.LEVEL_INFO
		if latency > time.Second {
			logLevel = log.LEVEL_WARN
		}

		fmt.Fprintf(os.Stdout, log.LogWithFormater(logLevel, log.DefaultLogDepth-1, log.DefaultLogTimeLayout, "| %3d | %13v | %15s | %-7s %s\n%s",
			statusCode,
			latency,
			clientIP,
			method,
			path,
			comment,
		))
	})

	//gin.SetMode(gin.ReleaseMode)

	n := 0
	router.GET("/hello", func(c *gin.Context) {
		n++
		if n%2 == 1 {
			time.Sleep(time.Second)
		}
		c.String(200, "hello")
	})

	router.Run(":8080")
}

三、zap文件切割等

package main

import (
	klog "github.com/nothollyhigh/kiss/log"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
	"time"
)

func main() {
	url := "www.sample.com"

	{
		w := &klog.FileWriter{
			RootDir:     "./logs/",      //日志根目录
			DirFormat:   "20060102/",    //日志根目录下按天分割子目录
			FileFormat:  "20060102.log", //日志文件命名规则,按天切割文件
			MaxFileSize: 0,              //单个日志文件最大size,0则不限制size
			EnableBufio: false,          //是否开启bufio
		}

		conf := zap.NewProductionEncoderConfig()
		conf.EncodeTime = zapcore.ISO8601TimeEncoder
		// conf.EncodeTime = zapcore.EpochMillisTimeEncoder
		// conf.EncodeTime = zapcore.RFC3339TimeEncoder
		// conf.EncodeTime = zapcore.RFC3339NanoTimeEncoder
		core := zapcore.NewCore(
			zapcore.NewConsoleEncoder(conf),
			// zapcore.NewJSONEncoder(conf),
			zapcore.NewMultiWriteSyncer(w, os.Stdout),
			zap.DebugLevel,
		)
		logger := zap.New(core)
		defer logger.Sync() // flushes buffer, if any
		// if zapAdapter.Caller {
		// 	zapAdapter.logger = zapAdapter.logger.WithOptions(zap.AddCaller(), zap.AddCallerSkip(2))
		// }

		sugar := logger.Sugar()
		for i := 0; i < 5; i++ {
			sugar.Infow("failed to fetch URL",
				// Structured context as loosely typed key-value pairs.
				"url", url,
				"attempt", i,
				"backoff", time.Second,
			)
			sugar.Info("test ", " cnt: ", i)
		}
	}
}

四、自定义日志处理

package main

import (
	"encoding/json"
	"fmt"
	"github.com/nothollyhigh/kiss/log"
	"runtime"
	"strings"
)

var (
	// 按天切割日志文件,日志根目录下不设子目录,不限制单个日志文件大小
	fileWriter = &log.FileWriter{
		RootDir:     "./logs/",        //日志根目录
		DirFormat:   "20060102-1504/", //日志根目录下无子目录
		FileFormat:  "20060102.log",   //日志文件命名规则,按天切割文件
		MaxFileSize: 1024 * 1024,      //单个日志文件最大size,0则不限制size
		EnableBufio: false,            //是否开启bufio
	}
)

// 实现log.ILogWriter接口
type LogWriter struct{}

func (w *LogWriter) WriteLog(l *log.Log) (n int, err error) {
	_, file, line, ok := runtime.Caller(l.Depth + 1)
	if !ok {
		file = "???"
		line = -1
	} else {
		pos := strings.LastIndex(file, "/")
		if pos >= 0 {
			file = file[pos+1:]
		}
	}

	l.File = file
	l.Line = line

	data, _ := json.Marshal(l)
	data = append(data, '\n')
	n, err = fileWriter.Write(data)
	fmt.Printf(string(data))

	return n, err
}

func main() {
	// 设置为nil则默认的日志不处理,如果需要可以同时使用
	log.SetOutput(nil)

	// 设置自定义日志处理接口
	log.SetStructOutput(&LogWriter{})

	log.SetLevel(log.LEVEL_WARN)

	for i := 0; i < 10000; i++ {
		log.Debug("log %d", i)
		log.Info("log %d", i)
		log.Warn("log %d", i)
		log.Error("log %d", i)
	}
}

Documentation

Index

Constants

View Source
const (
	LEVEL_PRINT = iota
	LEVEL_DEBUG
	LEVEL_INFO
	LEVEL_WARN
	LEVEL_ERROR
	LEVEL_PANIC
	LEVEL_FATAL
	LEVEL_NONE
)

Variables

View Source
var (
	BuildDir = ""

	DefaultLogLevel      = LEVEL_DEBUG
	DefaultLogDepth      = 2
	DefaultLogWriter     = os.Stdout
	DefaultLogTimeLayout = "2006-01-02 15:04:05.000"

	DefaultLogger = NewLogger()
)

Functions

func Debug

func Debug(format string, v ...interface{})

default debug

func Error

func Error(format string, v ...interface{})

default error

func Fatal

func Fatal(format string, v ...interface{})

default fatal

func Info

func Info(format string, v ...interface{})

default info

func LevelText

func LevelText(lvl int) string

level text

func LogWithFormater

func LogWithFormater(lvl int, depth int, layout string, format string, v ...interface{}) string

log with formater

func Panic

func Panic(format string, v ...interface{})

default panic

func Printf

func Printf(fmtstr string, v ...interface{})

default printf

func Println

func Println(v ...interface{})

default println

func SetBuildDir

func SetBuildDir(dir string)

default set build dir

func SetFormater

func SetFormater(f func(log *Log) string)

default set formater

func SetLevel

func SetLevel(level int)

default set level

func SetLogTimeFormat

func SetLogTimeFormat(layout string)

default set log time format

func SetOutput

func SetOutput(out io.Writer)

default set output

func SetStructOutput

func SetStructOutput(out ILogWriter)

default set struct output

func Warn

func Warn(format string, v ...interface{})

default warn

Types

type FileWriter

type FileWriter struct {
	sync.Mutex
	RootDir      string
	DirFormat    string
	FileFormat   string
	TimeBegin    int
	TimePrefix   string
	MaxFileSize  int
	SyncInterval time.Duration
	SaveEach     bool
	EnableBufio  bool

	Formater func(log *Log) string
	// contains filtered or unexported fields
}

file writer

func (*FileWriter) Init

func (w *FileWriter) Init(now time.Time)

init

func (*FileWriter) Save

func (w *FileWriter) Save()

flush

func (*FileWriter) SetFormater

func (w *FileWriter) SetFormater(f func(log *Log) string)

set formater

func (*FileWriter) Sync

func (w *FileWriter) Sync() error

func (*FileWriter) Write

func (w *FileWriter) Write(p []byte) (n int, err error)

io.Writer implementation

func (*FileWriter) WriteLog

func (w *FileWriter) WriteLog(log *Log) (n int, err error)

log writer implementation

func (*FileWriter) WriteString

func (w *FileWriter) WriteString(str string) (n int, err error)

write string

type ILogWriter

type ILogWriter interface {
	WriteLog(log *Log) (n int, err error)
}

log writer interface

func MultiLogWriter

func MultiLogWriter(writers ...ILogWriter) ILogWriter

multi log writer

type Log

type Log struct {
	Time   time.Time `json:"Time"`
	Depth  int       `json:"Depth"`
	Level  int       `json:"Level"`
	Line   int       `json:"Line"`
	File   string    `json:"File"`
	Value  string    `json:"Value"`
	Logger *Logger   `json:"-"`
}

log item

type LogWriter

type LogWriter struct {
	// contains filtered or unexported fields
}

log writer

func (*LogWriter) WriteLog

func (w *LogWriter) WriteLog(log *Log) (n int, err error)

log writer implementation

type Logger

type Logger struct {
	sync.Mutex
	Writer    io.Writer
	LogWriter ILogWriter

	Level    int
	Layout   string
	Formater func(log *Log) string
	FullPath bool
	// contains filtered or unexported fields
}

logger

func NewLogger

func NewLogger() *Logger

logger factory

func (*Logger) Debug

func (logger *Logger) Debug(format string, v ...interface{})

debug

func (*Logger) Error

func (logger *Logger) Error(format string, v ...interface{})

error

func (*Logger) Fatal

func (logger *Logger) Fatal(format string, v ...interface{})

fatal

func (*Logger) Info

func (logger *Logger) Info(format string, v ...interface{})

info

func (*Logger) Panic

func (logger *Logger) Panic(format string, v ...interface{})

panic

func (*Logger) Printf

func (logger *Logger) Printf(format string, v ...interface{})

printf

func (*Logger) Println

func (logger *Logger) Println(v ...interface{})

println

func (*Logger) SetFormater

func (logger *Logger) SetFormater(f func(log *Log) string)

set formater

func (*Logger) SetLevel

func (logger *Logger) SetLevel(level int)

set level

func (*Logger) SetLogTimeFormat

func (logger *Logger) SetLogTimeFormat(layout string)

set log time format

func (*Logger) SetOutput

func (logger *Logger) SetOutput(out io.Writer)

set output

func (*Logger) SetStructOutput

func (logger *Logger) SetStructOutput(out ILogWriter)

set struct output

func (*Logger) Warn

func (logger *Logger) Warn(format string, v ...interface{})

warn

Source Files

  • log.go
  • logfile.go
  • util.go

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL