mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-04 03:40:45 +08:00
Major logging refactor
This commit is contained in:
parent
53b54a8e52
commit
ffdfbb8ae5
@ -5,6 +5,5 @@ package app
|
|||||||
// Init initialises the application for a debug environment
|
// Init initialises the application for a debug environment
|
||||||
func (a *App) Init() error {
|
func (a *App) Init() error {
|
||||||
a.debug = true
|
a.debug = true
|
||||||
println("Initialising debug options")
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2/internal/binding"
|
"github.com/wailsapp/wails/v2/internal/binding"
|
||||||
"github.com/wailsapp/wails/v2/internal/ffenestri"
|
"github.com/wailsapp/wails/v2/internal/ffenestri"
|
||||||
"github.com/wailsapp/wails/v2/internal/logger"
|
"github.com/wailsapp/wails/v2/internal/logger"
|
||||||
@ -44,7 +42,7 @@ func CreateApp(options *options.App) *App {
|
|||||||
options.MergeDefaults()
|
options.MergeDefaults()
|
||||||
|
|
||||||
// Set up logger
|
// Set up logger
|
||||||
myLogger := logger.New(os.Stdout)
|
myLogger := logger.New(options.Logger)
|
||||||
myLogger.SetLogLevel(logger.TRACE)
|
myLogger.SetLogLevel(logger.TRACE)
|
||||||
|
|
||||||
window := ffenestri.NewApplicationWithConfig(options, myLogger)
|
window := ffenestri.NewApplicationWithConfig(options, myLogger)
|
||||||
|
@ -2,7 +2,6 @@ package logger
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// CustomLogger defines what a user can do with a logger
|
// CustomLogger defines what a user can do with a logger
|
||||||
@ -62,37 +61,36 @@ func (l *customLogger) Write(message string) error {
|
|||||||
// Trace level logging. Works like Sprintf.
|
// Trace level logging. Works like Sprintf.
|
||||||
func (l *customLogger) Trace(format string, args ...interface{}) error {
|
func (l *customLogger) Trace(format string, args ...interface{}) error {
|
||||||
format = fmt.Sprintf("%s | %s", l.name, format)
|
format = fmt.Sprintf("%s | %s", l.name, format)
|
||||||
return l.logger.processLogMessage(TRACE, format, args...)
|
return l.logger.Trace(format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debug level logging. Works like Sprintf.
|
// Debug level logging. Works like Sprintf.
|
||||||
func (l *customLogger) Debug(format string, args ...interface{}) error {
|
func (l *customLogger) Debug(format string, args ...interface{}) error {
|
||||||
format = fmt.Sprintf("%s | %s", l.name, format)
|
format = fmt.Sprintf("%s | %s", l.name, format)
|
||||||
return l.logger.processLogMessage(DEBUG, format, args...)
|
return l.logger.Debug(format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info level logging. Works like Sprintf.
|
// Info level logging. Works like Sprintf.
|
||||||
func (l *customLogger) Info(format string, args ...interface{}) error {
|
func (l *customLogger) Info(format string, args ...interface{}) error {
|
||||||
format = fmt.Sprintf("%s | %s", l.name, format)
|
format = fmt.Sprintf("%s | %s", l.name, format)
|
||||||
return l.logger.processLogMessage(INFO, format, args...)
|
return l.logger.Info(format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warning level logging. Works like Sprintf.
|
// Warning level logging. Works like Sprintf.
|
||||||
func (l *customLogger) Warning(format string, args ...interface{}) error {
|
func (l *customLogger) Warning(format string, args ...interface{}) error {
|
||||||
format = fmt.Sprintf("%s | %s", l.name, format)
|
format = fmt.Sprintf("%s | %s", l.name, format)
|
||||||
return l.logger.processLogMessage(WARNING, format, args...)
|
return l.logger.Warning(format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error level logging. Works like Sprintf.
|
// Error level logging. Works like Sprintf.
|
||||||
func (l *customLogger) Error(format string, args ...interface{}) error {
|
func (l *customLogger) Error(format string, args ...interface{}) error {
|
||||||
format = fmt.Sprintf("%s | %s", l.name, format)
|
format = fmt.Sprintf("%s | %s", l.name, format)
|
||||||
return l.logger.processLogMessage(ERROR, format, args...)
|
return l.logger.Error(format, args...)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fatal level logging. Works like Sprintf.
|
// Fatal level logging. Works like Sprintf.
|
||||||
func (l *customLogger) Fatal(format string, args ...interface{}) {
|
func (l *customLogger) Fatal(format string, args ...interface{}) {
|
||||||
format = fmt.Sprintf("%s | %s", l.name, format)
|
format = fmt.Sprintf("%s | %s", l.name, format)
|
||||||
l.logger.processLogMessage(FATAL, format, args...)
|
l.logger.Fatal(format, args...)
|
||||||
os.Exit(1)
|
|
||||||
}
|
}
|
||||||
|
@ -1,38 +1,28 @@
|
|||||||
package logger
|
package logger
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"github.com/wailsapp/wails/v2/pkg/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Logger is a utlility to log messages to a number of destinations
|
// Logger is a utlility to log messages to a number of destinations
|
||||||
type Logger struct {
|
type Logger struct {
|
||||||
writers []io.Writer
|
output logger.Logger
|
||||||
logLevel uint8
|
logLevel uint8
|
||||||
showLevelInLog bool
|
showLevelInLog bool
|
||||||
lock sync.RWMutex
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new Logger. You may pass in a number of `io.Writer`s that
|
// New creates a new Logger. You may pass in a number of `io.Writer`s that
|
||||||
// are the targets for the logs
|
// are the targets for the logs
|
||||||
func New(writers ...io.Writer) *Logger {
|
func New(output logger.Logger) *Logger {
|
||||||
result := &Logger{
|
result := &Logger{
|
||||||
logLevel: INFO,
|
logLevel: INFO,
|
||||||
showLevelInLog: true,
|
showLevelInLog: true,
|
||||||
}
|
output: output,
|
||||||
for _, writer := range writers {
|
|
||||||
result.AddOutput(writer)
|
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Writers gets the log writers
|
|
||||||
func (l *Logger) Writers() []io.Writer {
|
|
||||||
return l.writers
|
|
||||||
}
|
|
||||||
|
|
||||||
// CustomLogger creates a new custom logger that prints out a name/id
|
// CustomLogger creates a new custom logger that prints out a name/id
|
||||||
// before the messages
|
// before the messages
|
||||||
func (l *Logger) CustomLogger(name string) CustomLogger {
|
func (l *Logger) CustomLogger(name string) CustomLogger {
|
||||||
@ -49,95 +39,57 @@ func (l *Logger) SetLogLevel(level uint8) {
|
|||||||
l.logLevel = level
|
l.logLevel = level
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddOutput adds the given `io.Writer` to the list of destinations
|
|
||||||
// that get logged to
|
|
||||||
func (l *Logger) AddOutput(writer io.Writer) {
|
|
||||||
l.writers = append(l.writers, writer)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *Logger) write(loglevel uint8, message string) error {
|
|
||||||
|
|
||||||
// Don't print logs lower than the current log level
|
|
||||||
if loglevel < l.logLevel {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show log level text if enabled
|
|
||||||
if l.showLevelInLog {
|
|
||||||
message = mapLogLevel[loglevel] + message
|
|
||||||
}
|
|
||||||
|
|
||||||
// write out the logs
|
|
||||||
l.lock.Lock()
|
|
||||||
for _, writer := range l.writers {
|
|
||||||
_, err := writer.Write([]byte(message))
|
|
||||||
if err != nil {
|
|
||||||
l.lock.Unlock() // Because defer is slow
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
l.lock.Unlock()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// writeln appends a newline character to the message before writing
|
|
||||||
func (l *Logger) writeln(loglevel uint8, message string) error {
|
|
||||||
return l.write(loglevel, message+"\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writeln writes directly to the output with no log level
|
// Writeln writes directly to the output with no log level
|
||||||
// Appends a carriage return to the message
|
// Appends a carriage return to the message
|
||||||
func (l *Logger) Writeln(message string) error {
|
func (l *Logger) Writeln(message string) error {
|
||||||
return l.write(BYPASS, message+"\n")
|
return l.output.Print(message+"\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write writes directly to the output with no log level
|
// Write writes directly to the output with no log level
|
||||||
func (l *Logger) Write(message string) error {
|
func (l *Logger) Write(message string) error {
|
||||||
return l.write(BYPASS, message)
|
return l.output.Print(message)
|
||||||
}
|
|
||||||
|
|
||||||
// processLogMessage formats the given message before writing it out
|
|
||||||
func (l *Logger) processLogMessage(loglevel uint8, format string, args ...interface{}) error {
|
|
||||||
message := fmt.Sprintf(format, args...)
|
|
||||||
return l.writeln(loglevel, message)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trace level logging. Works like Sprintf.
|
// Trace level logging. Works like Sprintf.
|
||||||
func (l *Logger) Trace(format string, args ...interface{}) error {
|
func (l *Logger) Trace(format string, args ...interface{}) error {
|
||||||
return l.processLogMessage(TRACE, format, args...)
|
return l.output.Trace(format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CustomTrace returns a custom Logging function that will insert the given name before the message
|
// // CustomTrace returns a custom Logging function that will insert the given name before the message
|
||||||
func (l *Logger) CustomTrace(name string) func(format string, args ...interface{}) {
|
// func (l *Logger) CustomTrace(name string) func(format string, args ...interface{}) {
|
||||||
return func(format string, args ...interface{}) {
|
// return func(format string, args ...interface{}) {
|
||||||
format = name + " | " + format
|
// format = name + " | " + format
|
||||||
l.processLogMessage(TRACE, format, args...)
|
// l.processLogMessage(format, args...)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Debug level logging. Works like Sprintf.
|
// Debug level logging. Works like Sprintf.
|
||||||
func (l *Logger) Debug(format string, args ...interface{}) error {
|
func (l *Logger) Debug(format string, args ...interface{}) error {
|
||||||
return l.processLogMessage(DEBUG, format, args...)
|
return l.output.Debug(format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info level logging. Works like Sprintf.
|
// Info level logging. Works like Sprintf.
|
||||||
func (l *Logger) Info(format string, args ...interface{}) error {
|
func (l *Logger) Info(format string, args ...interface{}) error {
|
||||||
return l.processLogMessage(INFO, format, args...)
|
return l.output.Info(format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warning level logging. Works like Sprintf.
|
// Warning level logging. Works like Sprintf.
|
||||||
func (l *Logger) Warning(format string, args ...interface{}) error {
|
func (l *Logger) Warning(format string, args ...interface{}) error {
|
||||||
return l.processLogMessage(WARNING, format, args...)
|
return l.output.Warning(format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error level logging. Works like Sprintf.
|
// Error level logging. Works like Sprintf.
|
||||||
func (l *Logger) Error(format string, args ...interface{}) error {
|
func (l *Logger) Error(format string, args ...interface{}) error {
|
||||||
return l.processLogMessage(ERROR, format, args...)
|
return l.output.Error(format, args...)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fatal level logging. Works like Sprintf.
|
// Fatal level logging. Works like Sprintf.
|
||||||
func (l *Logger) Fatal(format string, args ...interface{}) {
|
func (l *Logger) Fatal(format string, args ...interface{}) {
|
||||||
l.processLogMessage(FATAL, format, args...)
|
err := l.output.Fatal(format, args...)
|
||||||
|
// Not much we can do but print it out before exiting
|
||||||
|
if err != nil {
|
||||||
|
println(err.Error())
|
||||||
|
}
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
55
v2/pkg/logger/default.go
Normal file
55
v2/pkg/logger/default.go
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package logger
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultLogger is a utlility to log messages to a number of destinations
|
||||||
|
type DefaultLogger struct {}
|
||||||
|
|
||||||
|
// NewDefaultLogger creates a new Logger.
|
||||||
|
func NewDefaultLogger() Logger {
|
||||||
|
return &DefaultLogger{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print works like Sprintf.
|
||||||
|
func (l *DefaultLogger) Print(message string, args ...interface{}) error {
|
||||||
|
fmt.Printf(message + "\n", args...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// Trace level logging. Works like Sprintf.
|
||||||
|
func (l *DefaultLogger) Trace(message string, args ...interface{}) error {
|
||||||
|
fmt.Printf("TRACE | " + message + "\n", args...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
// Debug level logging. Works like Sprintf.
|
||||||
|
func (l *DefaultLogger) Debug(message string, args ...interface{}) error {
|
||||||
|
fmt.Printf("DEBUG | " + message + "\n", args...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Info level logging. Works like Sprintf.
|
||||||
|
func (l *DefaultLogger) Info(message string, args ...interface{}) error {
|
||||||
|
fmt.Printf("INFO | " + message + "\n", args...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warning level logging. Works like Sprintf.
|
||||||
|
func (l *DefaultLogger) Warning(message string, args ...interface{}) error {
|
||||||
|
fmt.Printf("WARN | " + message + "\n", args...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error level logging. Works like Sprintf.
|
||||||
|
func (l *DefaultLogger) Error(message string, args ...interface{}) error {
|
||||||
|
fmt.Printf("ERROR | " + message + "\n", args...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fatal level logging. Works like Sprintf.
|
||||||
|
func (l *DefaultLogger) Fatal(message string, args ...interface{}) error {
|
||||||
|
fmt.Printf("FATAL | " + message + "\n", args...)
|
||||||
|
os.Exit(1)
|
||||||
|
return nil
|
||||||
|
}
|
11
v2/pkg/logger/logger.go
Normal file
11
v2/pkg/logger/logger.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package logger
|
||||||
|
|
||||||
|
type Logger interface {
|
||||||
|
Print(message string, args ...interface{}) error
|
||||||
|
Trace(message string, args ...interface{}) error
|
||||||
|
Debug(message string, args ...interface{}) error
|
||||||
|
Info(message string, args ...interface{}) error
|
||||||
|
Warning(message string, args ...interface{}) error
|
||||||
|
Error(message string, args ...interface{}) error
|
||||||
|
Fatal(message string, args ...interface{}) error
|
||||||
|
}
|
@ -1,7 +1,9 @@
|
|||||||
package options
|
package options
|
||||||
|
|
||||||
import "github.com/wailsapp/wails/v2/pkg/options/mac"
|
import (
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options/mac"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/logger"
|
||||||
|
)
|
||||||
// Default options for creating the App
|
// Default options for creating the App
|
||||||
var Default = &App{
|
var Default = &App{
|
||||||
Title: "My Wails App",
|
Title: "My Wails App",
|
||||||
@ -15,4 +17,5 @@ var Default = &App{
|
|||||||
WebviewIsTransparent: false,
|
WebviewIsTransparent: false,
|
||||||
WindowBackgroundIsTranslucent: false,
|
WindowBackgroundIsTranslucent: false,
|
||||||
},
|
},
|
||||||
|
Logger: logger.NewDefaultLogger(),
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/imdario/mergo"
|
"github.com/imdario/mergo"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/logger"
|
||||||
"github.com/wailsapp/wails/v2/pkg/options/mac"
|
"github.com/wailsapp/wails/v2/pkg/options/mac"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -22,6 +23,7 @@ type App struct {
|
|||||||
DevTools bool
|
DevTools bool
|
||||||
RGBA int
|
RGBA int
|
||||||
Mac *mac.Options
|
Mac *mac.Options
|
||||||
|
Logger logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// MergeDefaults will set the minimum default values for an application
|
// MergeDefaults will set the minimum default values for an application
|
||||||
|
Loading…
Reference in New Issue
Block a user