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  }