Giter VIP home page Giter VIP logo

Comments (3)

notzippy avatar notzippy commented on June 28, 2024 1

Log rotate does not need to be supported. Use the lumberjsack logger to create a rotating log output stream

from log15.

SongCF avatar SongCF commented on June 28, 2024
//log rotate: 1.change file handler by date. 2.remove expired log file
func logRotate(expiredDays int, prefixFile string, f log.Format, lvl log.Lvl, logger log.Logger) {
	for {
		lastFileHandler := setLogFileHandler(prefixFile, f, lvl, logger)
		now := time.Now()
		next := time.Date(now.Year(), now.Month(), now.Day() + 1, 0, 0, 0, 0, now.Location())
		t := time.NewTimer(next.Sub(now))
		<-t.C
		// 1.change log file to date
		temp := setLogFileHandler(prefixFile, f, lvl, L)
		//lastFileHandler.Close()  //Close file. the struct of closingHandler not exported!
		reflect.ValueOf(lastFileHandler).MethodByName("Close").Call([]reflect.Value{})
		lastFileHandler = temp
		// TODO 2.remove expired log file
		//
	}
}

//get log file name
func getLogFileName(prefixFile string, t time.Time) string {
	return fmt.Sprintf("%v-%04d-%02d-%02d.log", prefixFile, t.Year(), t.Month(), t.Day())
}

//set log handler, and return file handler.
func setLogFileHandler(prefixFile string, f log.Format, lvl log.Lvl, logger log.Logger) log.Handler {
	curFilename := getLogFileName(prefixFile, time.Now())
	fileHandler := log.Must.FileHandler(curFilename, f)
	logger.SetHandler(log.MultiHandler(
		log.LvlFilterHandler(
			lvl,
			log.CallerFileHandler(log.StdoutHandler)),
		log.LvlFilterHandler(
			lvl,
			fileHandler)))
	return fileHandler
}

I run go logRotate() in my proj.

from log15.

xgfone avatar xgfone commented on June 28, 2024

lumberjsack logger is based on the file size.

I have implemented a log rotating based on time, TimedRotatingFile in the sub-package github.com/xgfone/go-tools/log/handler.

You just need to implement an adapter for log15, for example:

type closingHandler struct {
	io.WriteCloser
	log15.Handler
}

func (h *closingHandler) Close() error {
	return h.WriteCloser.Close()
}

// The handler adapter for log15.
func TimedRotatingFileHandler(fmtr log15.Format, filename string, backupCount, interval int) (h log15.Handler, err error) {
	defer func() {
		if _err := recover(); _err != nil {
			err = _err.(error)
			return
		}
	}()

	_h := handler.NewTimedRotatingFile(filename)
	_h.SetBackupCount(backupCount).SetInterval(interval)

	return closingHandler{_h, log15.StreamHandler(_h, fmtr)}, nil
}

from log15.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.