提供一个io.Writer ,在应用中周期旋转日志文件。Go语言实现 File::RotateLogs。

SYNOPSIS

  1. import (
  2. "log"
  3. "net/http"
  4. apachelog "github.com/lestrrat-go/apache-logformat"
  5. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  6. )
  7. func main() {
  8. mux := http.NewServeMux()
  9. mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { ... })
  10. logf, err := rotatelogs.New(
  11. "/path/to/access_log.%Y%m%d%H%M",
  12. rotatelogs.WithLinkName("/path/to/access_log"),
  13. rotatelogs.WithMaxAge(24 * time.Hour),
  14. rotatelogs.WithRotationTime(time.Hour),
  15. )
  16. if err != nil {
  17. log.Printf("failed to create rotatelogs: %s", err)
  18. return
  19. }
  20. // Now you must write to logf. apache-logformat library can create
  21. // a http.Handler that only writes the approriate logs for the request
  22. // to the given handle
  23. http.ListenAndServe(":8080", apachelog.CombinedLog.Wrap(mux, logf))
  24. }

DESCRIPTION

当你把这个集成到你的应用程序中,它自动写入日志,从应用程序内旋转:

要安装,只需发出go get命令:

  1. go get github.com/lestrrat-go/file-rotatelogs

通常期望这个库与其他一些日志服务一起使用,比如内置的日志库,或者像github.com/lestrrat-go/apache-logformat这样的日志记录器。

  1. import(
  2. "log"
  3. "github.com/lestrrat-go/file-rotatelogs"
  4. )
  5. func main() {
  6. rl, _ := rotatelogs.New("/path/to/access_log.%Y%m%d%H%M")
  7. log.SetOutput(rl)
  8. /* elsewhere ... */
  9. log.Printf("Hello, World!")
  10. }

OPTIONS

Partten (Required)

用于生成实际日志文件名的模式。您应该使用strftime(3)格式的模式。例如:

  1. rotatelogs.New("/var/log/myapp/log.%Y%m%d")

Clock (default:rotatelogs.Local)

你可以指定一个对象来实现roatatlogs。时钟界面。当提供此选项时,将使用它来确定当前时间,以便进行所有计算。例如,如果你想在UTC中计算,你可以指定rotatlogs.UTC

  1. rotatelogs.New(
  2. "/var/log/myapp/log.%Y%m%d",
  3. rotatelogs.WithClock(rotatelogs.UTC),
  4. )

Location

这是WithClock选项的另一种选择。您可以为您的时间提供一个位置,而不是提供显式的时钟。我们将创建一个Clock对象,它在您指定的位置产生时间,并配置rotatelog以尊重它。

LinkName (default:””)

放置实际日志文件的符号链接的路径。这允许您始终在相同的位置检查日志文件,即使日志是旋转的。

  1. rotatelogs.New(
  2. "/var/log/myapp/log.%Y%m%d",
  3. rotatelogs.WithLinkName("/var/log/myapp/current"),
  4. )
  1. // Else where
  2. $ tail -f /var/log/myapp/current

与主日志路径共享同一父目录的链接将得到特殊处理:即,链接路径将相对于主日志文件。

Main log file name Link name Linked path
/path/to/log.%Y%m%d /path/to/log log.YYYYMMDD
/path/to/log.%Y%m%d /path/to/nested/log ../log.YYYYMMDD
/path/to/log.%Y%m%d /foo/bar/baz/log /path/to/log.YYYYMMDD

如果没有提供,没有链接将被写。

RotationTime (default:86400 sec)

文件旋转的间隔。缺省情况下,日志周期为86400秒。注意:记住要利用时间。持续时间值。

  1. // Rotate every hour
  2. rotatelogs.New(
  3. "/var/log/myapp/log.%Y%m%d",
  4. rotatelogs.WithRotationTime(time.Hour),
  5. )

MaxAge (default: 7 days)

等待旧日志被清除的时间。默认情况下,不会清除任何日志,这肯定不是您想要的。注意:记住要利用时间。持续时间值。

  1. // Purge logs older than 1 hour
  2. rotatelogs.New(
  3. "/var/log/myapp/log.%Y%m%d",
  4. rotatelogs.WithMaxAge(time.Hour),
  5. )

RotationCount (default:-1)

文件的数量应该保留。默认情况下,此选项是禁用的。
注意:MaxAge应该通过显式指定WithMaxAge(-1)来禁用。

  1. // Purge logs except latest 7 files
  2. rotatelogs.New(
  3. "/var/log/myapp/log.%Y%m%d",
  4. rotatelogs.WithMaxAge(-1),
  5. rotatelogs.WithRotationCount(7),
  6. )

Handler (default:nil)

设置事件处理程序以从RotateLogs对象接收事件通知。当前仅支持的事件类型是filedrotate

  1. rotatelogs.New(
  2. "/var/log/myapp/log.%Y%m%d",
  3. rotatelogs.WithHandler(rotatelogs.HandlerFunc(func(e rotatelogs.Event) {
  4. if e.Type() != rotatelogs.FileRotatedEventType {
  5. return
  6. }
  7. // Do what you want with the data. This is just an idea:
  8. storeLogFileToRemoteStorage(e.(*rotatelogs.FileRotatedEvent).PreviousFile())
  9. })),
  10. )

ForceNewFile

确保每次调用new()时都创建一个新文件。如果基本文件名已经存在,则执行隐式旋转。

  1. rotatelogs.New(
  2. "/var/log/myapp/log.%Y%m%d",
  3. rotatelogs.ForceNewFile(),
  4. )

Rotating files forcefully

如果您想在实际旋转时间到达之前强制旋转文件,你可以使用Rotate()方法。此方法强制旋转日志,但如果生成的文件名冲突,则添加数字后缀,以便新文件强制出现在磁盘上。

例如,假设你有一个’%Y.log’的模式,其旋转时间为86400,所以它每年才会旋转,但无论出于什么原因,你现在想要旋转日志,你可以安装一个信号处理程序来触发这种旋转:

  1. rl := rotatelogs.New(...)
  2. signal.Notify(ch, syscall.SIGHUP)
  3. go func(ch chan os.Signal) {
  4. <-ch
  5. rl.Rotate()
  6. }()

你会得到一个日志文件名,比如2018.log。2018.日志。2,等等。