gitech
1// Copyright 2023 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package log5
6import (7"io"8
9"code.gitea.io/gitea/modules/util/rotatingfilewriter"10)
11
12type WriterFileOption struct {13FileName string14MaxSize int6415LogRotate bool16DailyRotate bool17MaxDays int18Compress bool19CompressionLevel int20}
21
22type eventWriterFile struct {23*EventWriterBaseImpl24fileWriter io.WriteCloser25}
26
27var _ EventWriter = (*eventWriterFile)(nil)28
29func NewEventWriterFile(name string, mode WriterMode) EventWriter {30w := &eventWriterFile{EventWriterBaseImpl: NewEventWriterBase(name, "file", mode)}31opt := mode.WriterOption.(WriterFileOption)32var err error33w.fileWriter, err = rotatingfilewriter.Open(opt.FileName, &rotatingfilewriter.Options{34Rotate: opt.LogRotate,35MaximumSize: opt.MaxSize,36RotateDaily: opt.DailyRotate,37KeepDays: opt.MaxDays,38Compress: opt.Compress,39CompressionLevel: opt.CompressionLevel,40})41if 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 ....44FallbackErrorf("unable to open log file %q: %v", opt.FileName, err)45w.fileWriter = nopCloser{Writer: LoggerToWriter(FallbackErrorf)}46}47w.OutputWriteCloser = w.fileWriter48return w49}
50
51func init() {52RegisterEventWriter("file", NewEventWriterFile)53}
54