github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/pkg/logutil/logutil.go (about) 1 // Copyright 2022 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package logutil implements utilities for recording log output. 6 package logutil 7 8 import ( 9 "io" 10 "log" 11 "os" 12 "path/filepath" 13 14 "github.com/nanmu42/limitio" 15 ) 16 17 // NewWriterToFile creates a Writer that writes out output to a file path up to a maximum limit maxSize. 18 func NewWriterToFile(maxSize int, path string) (io.Writer, error) { 19 logFile, err := os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666) 20 if err != nil { 21 return nil, err 22 } 23 24 fi, err := logFile.Stat() 25 if err != nil { 26 return nil, err 27 } 28 29 lw := limitio.NewWriter(logFile, maxSize-(int)(fi.Size()), true) 30 31 return lw, nil 32 33 } 34 35 // TeeOutput tees out output to a file path specified by env var `UROOT_LOG_PATH` up to a max limit. Creates necessary directories for the specified logpath if they don't exist. 36 func TeeOutput(writer io.Writer, maxSize int) (io.Writer, error) { 37 logPath := os.Getenv("UROOT_LOG_PATH") 38 if logPath != "" { 39 dir := filepath.Dir(logPath) 40 if _, err := os.Stat(dir); os.IsNotExist(err) { 41 log.Printf("Log directory %s doesn't exist, creating...", dir) 42 if err := os.MkdirAll(dir, 0700); err != nil { 43 return nil, err 44 } 45 } 46 lw, err := NewWriterToFile(maxSize, logPath) 47 if err != nil { 48 return nil, err 49 } 50 writer = io.MultiWriter(writer, lw) 51 log.SetOutput(writer) 52 } 53 return writer, nil 54 }