我有一个 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 秒创建一次新文件。现在我在新文件中写入日志时仍然遇到问题。
这是我的一个小小的尝试,可能不会有效果。我省略了一些错误,只是希望有参考价值。
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"
}