github.com/v2pro/plz@v0.0.0-20221028024117-e5f9aec5b631/countlog/output/output_file.go (about)

     1  package output
     2  //
     3  //import (
     4  //	"os"
     5  //	"path/filepath"
     6  //	"time"
     7  //)
     8  //
     9  //type fileLogOutput struct {
    10  //	windowSize          int64
    11  //	logFile             string
    12  //	rotateAfter         int64
    13  //	openedFile          *os.File
    14  //	openedFileArchiveTo string
    15  //}
    16  //
    17  //func (output *fileLogOutput) Close() {
    18  //	if output.openedFile != nil {
    19  //		output.openedFile.Close()
    20  //	}
    21  //}
    22  //
    23  //func (output *fileLogOutput) openLogFile() {
    24  //	var err error
    25  //	output.openedFile, err = os.OpenFile(output.logFile, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
    26  //	if err != nil {
    27  //		os.Stderr.Write([]byte("failed to open log file: " +
    28  //			output.logFile + ", " + err.Error() + "\n"))
    29  //		os.Stderr.Sync()
    30  //	}
    31  //	output.openedFileArchiveTo = output.logFile + "." + time.Now().Format("200601021504")
    32  //}
    33  //
    34  //func (output *fileLogOutput) archiveLogFile() {
    35  //	output.openedFile.Close()
    36  //	output.openedFile = nil
    37  //	err := os.Rename(output.logFile, output.openedFileArchiveTo)
    38  //	if err != nil {
    39  //		os.Stderr.Write([]byte("failed to rename to archived log file: " +
    40  //			output.openedFileArchiveTo + ", " + err.Error() + "\n"))
    41  //		os.Stderr.Sync()
    42  //	}
    43  //}
    44  //
    45  //func (output *fileLogOutput) OutputLog(level int, timestamp int64, formattedEvent []byte) {
    46  //	if timestamp > output.rotateAfter {
    47  //		now := time.Now()
    48  //		output.rotateAfter = (int64(now.UnixNano()/output.windowSize) + 1) * output.windowSize
    49  //		output.archiveLogFile()
    50  //		output.openLogFile()
    51  //	}
    52  //	if output.openedFile != nil {
    53  //		output.openedFile.Write(formattedEvent) // silently ignore error
    54  //	}
    55  //}
    56  //
    57  //type osFileLogOutput struct {
    58  //	logFile *os.File
    59  //}
    60  //
    61  //func (output *osFileLogOutput) Close() {
    62  //	output.logFile.Sync()
    63  //}
    64  //
    65  //func (output *osFileLogOutput) OutputLog(level int, timestamp int64, formattedEvent []byte) {
    66  //	output.logFile.Write(withColorLevelPrefix(level, formattedEvent))
    67  //}
    68  //
    69  //func NewFileLogOutput(logFile string) LogOutput {
    70  //	switch logFile {
    71  //	case "STDOUT":
    72  //		return &osFileLogOutput{os.Stdout}
    73  //	case "STDERR":
    74  //		return &osFileLogOutput{os.Stderr}
    75  //	default:
    76  //		output := &fileLogOutput{
    77  //			windowSize: int64(time.Hour),
    78  //			logFile:    logFile,
    79  //		}
    80  //		err := os.MkdirAll(filepath.Dir(logFile), 0755)
    81  //		if err != nil {
    82  //			os.Stderr.Write([]byte("failed to create dir for log file: " +
    83  //				filepath.Dir(logFile) + ", " + err.Error() + "\n"))
    84  //			os.Stderr.Sync()
    85  //		}
    86  //		output.openLogFile()
    87  //		output.rotateAfter = (int64(time.Now().UnixNano()/output.windowSize) + 1) * output.windowSize
    88  //		return output
    89  //	}
    90  //}