每 10 秒将日志写入新文件,同时从另一个应用程序获取日志

问题描述 投票:0回答:1

我有一个 go 应用程序,它从另一个二进制应用程序(也是 go 应用程序)获取日志。我想每 10 秒在新文件中写入日志。

但是无论创建多少个日志文件,问题仍然是写入第一个日志文件。

package main

import (
    "fmt"
    "log"
    "os"
    "os/exec"
    "time"
)

func main() {
    // Initialize the ticker to trigger every minute
    ticker := time.NewTicker(time.Minute / 10)
    defer ticker.Stop()

    // Create a channel to receive ticker events
    tickerCh := ticker.C

    logFolderPath := "./log/"
    // Initialize the first log file
    filename := generateFilename()
    logFile, err := os.OpenFile(logFolderPath+filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        fmt.Println("Error opening log file:", err)
        return
    }
    defer logFile.Close()

    // Commands to execute sequentially
    cmd := exec.Command("sh", "-c", "./ledplayer")

    // Connect command's stdout and stderr to pipes
    cmd.Stdout = logFile
    cmd.Stderr = logFile

    // Start the command
    err = cmd.Start()
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    fmt.Println("Command started successfully. Log stored in", filename)

    // Loop to handle ticker events
    for range tickerCh {
        // Close the current log file
        err := logFile.Close()
        if err != nil {
            fmt.Println("Error closing log file:", err)
            return
        }

        log.Printf("%#v\n", logFile)

        // Generate a new filename for the next minute
        filename := generateFilename()

        // Open the new log file
        logFile, err = os.OpenFile(logFolderPath+filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
        if err != nil {
            fmt.Println("Error opening log file:", err)
            return
        }

        // Print the new log file name
        fmt.Println("Log file switched to", filename)

        // Update command's stdout and stderr to write to the new log file
        cmd.Stdout = logFile
        cmd.Stderr = logFile
    }

    // Wait for the command to finish before exiting
    err = cmd.Wait()
    if err != nil {
        fmt.Println("Error waiting for command to finish:", err)
    }
}

func generateFilename() string {
    // Generate filename with the current date and time
    return time.Now().Format("2006-01-02_15-04_05") + "_ledplayer.log"
}

我每 10 秒创建一次新文件。现在我在新文件中写入日志时仍然遇到问题。

bash file go logging
1个回答
0
投票

这是我的一个小小的尝试,可能不会有效果。我省略了一些错误,只是希望有参考价值。

package main

import (
    "bufio"
    "fmt"
    "os"
    "os/exec"
    "sync"
    "time"
)

func main() {
    // Initialize the ticker to trigger every minute
    ticker := time.NewTicker(time.Minute / 10)
    defer ticker.Stop()

    // Create a channel to receive ticker events
    tickerCh := ticker.C

    logFolderPath := "./log/"

    tmpFile, _ := os.CreateTemp("", "tmp_example")
    defer tmpFile.Close()

    // Commands to execute sequentially
    cmd := exec.Command("sh", "-c", "./ledplayer")
    cmd.Stdout = tmpFile
    cmd.Stderr = tmpFile

    // Start the command
    err := cmd.Start()
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    cmdStopCh := make(chan int)
    wg := sync.WaitGroup{}
    wg.Add(2)

    go func() {
        defer wg.Done()

        // Wait for the command to finish before exiting
        err = cmd.Wait()
        if err != nil {
            fmt.Println("Error waiting for command to finish:", err)
        }
        // Notification End
        cmdStopCh <- 1
    }()

    scanner := bufio.NewScanner(tmpFile)
    go func() {
        defer wg.Done()
        for {
            // Create new log file
            filename := generateFilename()
            logFile, err := os.OpenFile(logFolderPath+filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
            if err != nil {
                fmt.Println("Error opening log file:", err)
                return
            }
            
            // Read from scanner and write to logFile
            for scanner.Scan() {
                logFile.WriteString(scanner.Text() + "\n")
                select {
                case <-tickerCh: // switch to new log file
                    break
                case <-cmdStopCh: // cmd is exited
                    logFile.Close()
                    return
                default:

                }
            }
            logFile.Close()
        }
    }()
    wg.Wait()
}

func generateFilename() string {
    // Generate filename with the current date and time
    return time.Now().Format("2006-01-02_15-04_05") + "_ledplayer.log"
}
© www.soinside.com 2019 - 2024. All rights reserved.