code.gitea.io/gitea@v1.22.3/modules/log/event_writer_file.go (about)

     1  // Copyright 2023 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package log
     5  
     6  import (
     7  	"io"
     8  
     9  	"code.gitea.io/gitea/modules/util/rotatingfilewriter"
    10  )
    11  
    12  type WriterFileOption struct {
    13  	FileName         string
    14  	MaxSize          int64
    15  	LogRotate        bool
    16  	DailyRotate      bool
    17  	MaxDays          int
    18  	Compress         bool
    19  	CompressionLevel int
    20  }
    21  
    22  type eventWriterFile struct {
    23  	*EventWriterBaseImpl
    24  	fileWriter io.WriteCloser
    25  }
    26  
    27  var _ EventWriter = (*eventWriterFile)(nil)
    28  
    29  func NewEventWriterFile(name string, mode WriterMode) EventWriter {
    30  	w := &eventWriterFile{EventWriterBaseImpl: NewEventWriterBase(name, "file", mode)}
    31  	opt := mode.WriterOption.(WriterFileOption)
    32  	var err error
    33  	w.fileWriter, err = rotatingfilewriter.Open(opt.FileName, &rotatingfilewriter.Options{
    34  		Rotate:           opt.LogRotate,
    35  		MaximumSize:      opt.MaxSize,
    36  		RotateDaily:      opt.DailyRotate,
    37  		KeepDays:         opt.MaxDays,
    38  		Compress:         opt.Compress,
    39  		CompressionLevel: opt.CompressionLevel,
    40  	})
    41  	if err != nil {
    42  		// if the log file can't be opened, what should it do? panic/exit? ignore logs? fallback to stderr?
    43  		// it seems that "fallback to stderr" is slightly better than others ....
    44  		FallbackErrorf("unable to open log file %q: %v", opt.FileName, err)
    45  		w.fileWriter = nopCloser{Writer: LoggerToWriter(FallbackErrorf)}
    46  	}
    47  	w.OutputWriteCloser = w.fileWriter
    48  	return w
    49  }
    50  
    51  func init() {
    52  	RegisterEventWriter("file", NewEventWriterFile)
    53  }