Add log file handling and viewing capabilities
This commit introduces the ability to handle log files through the API and provides a new log viewing page. The API now supports GET and DELETE methods for log file operations, allowing retrieval and deletion of log contents. A new log.html page has been added for viewing logs in the browser, with automatic refresh every 5 seconds and styling based on log levels. The app.go file has been updated to include a GetLogFilepath function that retrieves or generates the log file path. The NewLogger function now accepts a file parameter to enable file logging. The main.js file has been updated to include a link to the new log.html page. This enhancement improves the observability and management of the application by providing real-time access to logs and the ability to clear them directly from the web interface.
This commit is contained in:
+67
-2
@@ -5,6 +5,7 @@ import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
@@ -21,6 +22,7 @@ var Version = "1.8.4"
|
||||
var UserAgent = "go2rtc/" + Version
|
||||
|
||||
var ConfigPath string
|
||||
var LogFilePath string
|
||||
var Info = map[string]any{
|
||||
"version": Version,
|
||||
}
|
||||
@@ -77,16 +79,66 @@ func Init() {
|
||||
|
||||
LoadConfig(&cfg)
|
||||
|
||||
log.Logger = NewLogger(cfg.Mod["format"], cfg.Mod["level"])
|
||||
log.Logger = NewLogger(cfg.Mod["format"], cfg.Mod["level"], GetLogFilepath())
|
||||
|
||||
modules = cfg.Mod
|
||||
|
||||
log.Info().Msgf("go2rtc version %s %s/%s", Version, runtime.GOOS, runtime.GOARCH)
|
||||
log.Debug().Msgf("[log] file: %s", GetLogFilepath())
|
||||
|
||||
migrateStore()
|
||||
}
|
||||
|
||||
func NewLogger(format string, level string) zerolog.Logger {
|
||||
// GetLogFilepath retrieves the file path for the log file from the application's configuration.
|
||||
// The configuration is expected to be in YAML format and contain a "log" section with a "file" key.
|
||||
// It uses the LoadConfig function to populate the cfg structure with the configuration data.
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// string: The file path of the log file as specified in the configuration.
|
||||
//
|
||||
// Note:
|
||||
//
|
||||
// The function assumes that the LoadConfig function is defined elsewhere and is responsible
|
||||
// for loading and parsing the configuration into the provided struct.
|
||||
// The cfg struct is an anonymous struct with a Mod field, which is a map with string keys and values.
|
||||
// The "log" key within the Mod map is expected to contain a sub-map with the "file" key that holds the log file path.
|
||||
//
|
||||
// Example of expected YAML configuration:
|
||||
//
|
||||
// log:
|
||||
// file: "/path/to/logfile.log"
|
||||
//
|
||||
// If the "file" key is not found within the "log" section of the configuration, the function will return an empty string.
|
||||
func GetLogFilepath() string {
|
||||
var cfg struct {
|
||||
Mod map[string]string `yaml:"log"`
|
||||
}
|
||||
|
||||
if LogFilePath != "" {
|
||||
return LogFilePath
|
||||
}
|
||||
|
||||
LoadConfig(&cfg)
|
||||
|
||||
if cfg.Mod["file"] == "" {
|
||||
// Generate temporary log file
|
||||
tmpFile, err := ioutil.TempFile("", "go2rtc*.log")
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
defer tmpFile.Close()
|
||||
|
||||
LogFilePath = tmpFile.Name()
|
||||
|
||||
} else {
|
||||
LogFilePath = cfg.Mod["file"]
|
||||
}
|
||||
|
||||
return LogFilePath
|
||||
}
|
||||
|
||||
func NewLogger(format string, level string, file string) zerolog.Logger {
|
||||
var writer io.Writer = os.Stdout
|
||||
|
||||
if format != "json" {
|
||||
@@ -96,6 +148,19 @@ func NewLogger(format string, level string) zerolog.Logger {
|
||||
}
|
||||
}
|
||||
|
||||
if file != "" {
|
||||
fileHandler, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
fileLogger := zerolog.ConsoleWriter{
|
||||
Out: fileHandler, TimeFormat: "15:04:05.000",
|
||||
NoColor: true,
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
writer = zerolog.MultiLevelWriter(writer, fileLogger)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
zerolog.TimeFieldFormat = time.RFC3339Nano
|
||||
|
||||
lvl, err := zerolog.ParseLevel(level)
|
||||
|
||||
Reference in New Issue
Block a user