go.wit.com/log flag changes

Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
Jeff Carr 2024-01-09 15:50:53 -06:00
parent 6749a1d173
commit 4f8752d9f4
12 changed files with 180 additions and 153 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.swp

33
args.go
View File

@ -1,33 +0,0 @@
package log
/*
// disable this until it hopefully is adopted by the go lang developers
// TODO: clean alex's dependancies
import (
arg "github.com/alexflint/go-arg"
)
//
// Attempt to switch logging to syslog on linux
//
var argLog ArgLog
// This struct can be used with the go-arg package
type ArgLog struct {
LogDebug bool `arg:"--log-debug" help:"show the log gui"`
LogTmp bool `arg:"--log-tmp" help:"send all output /tmp"`
LogStdout bool `arg:"--log-stdout" help:"send all output to STDOUT"`
LogQuiet bool `arg:"--log-quiet" help:"suppress all output"`
}
func init() {
arg.Register(&argLog)
}
// returns true if --log-debug was passed from the command line
func ArgDebug() bool {
return argLog.LogDebug
}
*/

View File

@ -5,7 +5,7 @@ import (
) )
func Error(err error, a ...any) { func Error(err error, a ...any) {
if ! ERROR.B { return } if ! ERROR.Get() { return }
origlog.Println("Error:", err) origlog.Println("Error:", err)
origlog.Println(a...) origlog.Println(a...)
} }

189
flags.go
View File

@ -4,77 +4,79 @@ package log
Handles the on/off flags for things like log.Info() and log.Warn() Handles the on/off flags for things like log.Info() and log.Warn()
*/ */
/*
The original log flags:
log.Ldate: The date in the local time zone: YYYY/MM/DD.
log.Ltime: The time in the local time zone: HH:MM:SS.
log.Lmicroseconds: Microsecond resolution: HH:MM:SS.microseconds.
log.Llongfile: Full file name and line number: /a/b/c/d.go:23.
log.Lshortfile: Final file name element and line number: d.go:23.
log.LUTC: If Ldate or Ltime is set, use UTC rather than the local time zone.
log.Lmsgprefix: Move the "prefix" from the beginning of the line to before the message.
log.LstdFlags: Initial values for the standard logger (Ldate | Ltime).
can be set this way:
myLogger.SetFlags(log.Ldate | log.Ltime)
*/
import ( import (
"sync" "sync"
) )
var INFO LogFlag var INFO *LogFlag // toggles log.Info()
var VERBOSE LogFlag var VERBOSE *LogFlag // toggles log.Verbose()
var SPEW LogFlag var SPEW *LogFlag // toggles log.Spew()
var WARN LogFlag
var ERROR LogFlag var WARN *LogFlag // toggles log.Warn() (true by default)
var PRINTLN LogFlag var ERROR *LogFlag // toggles log.Warn() (true by default)
var PRINTLN *LogFlag // toggles log.Println() (true by default)
var always *LogFlag
// writeMutex protects locks the write process // writeMutex protects locks the write process
var flagsMutex sync.Mutex var flagsMutex sync.Mutex
type LogFlag struct { type LogFlag struct {
B bool b bool
Default bool // set at the time of Registration() orig bool // used as the Default value. set at the time of Registration()
Name string name string
// TODO: figure out what package is sending the Registration // TODO: figure out what package is sending the Registration
Subsystem string // probably should just be forced to be the package name subsystem string // probably should just be forced to be the package name
Short string // string actually printed on each line short string // string actually printed on each line
Desc string desc string
} }
var flags []*LogFlag var flags []*LogFlag
func init() { func init() {
INFO.B = false full := "go.wit.com/log"
INFO.Name = "INFO" short := "log"
INFO.Subsystem = "log"
INFO.Desc = "Enable log.Info()"
INFO.Register()
SPEW.B = false INFO = NewFlag("INFO", false, full, short, "Enable log.Info()")
SPEW.Name = "SPEW" SPEW = NewFlag("SPEW", false, full, short, "Enable log.Spew()")
SPEW.Subsystem = "log" WARN = NewFlag("WARN", true, full, short, "Enable log.Warn()")
SPEW.Desc = "Enable log.Spew()"
SPEW.Register()
VERBOSE.B = false ERROR = NewFlag("ERROR", true, full, short, "Enable log.Error()")
VERBOSE.Name = "VERBOSE" PRINTLN = NewFlag("PRINTLN", true, full, short, "Enable log.Println()")
VERBOSE.Subsystem = "log" VERBOSE = NewFlag("VERBOSE", false, full, short, "Enable log.Verbose()")
VERBOSE.Desc = "Enable log.Verbose()"
VERBOSE.Register()
WARN.B = true // internally used to bypass the possibility that all the flags are off
WARN.Name = "WARN" always = new(LogFlag)
WARN.Subsystem = "log" always.b = true
WARN.Desc = "Enable log.Warn()" always.orig = true
WARN.Register() always.subsystem = full
always.short = short
ERROR.B = true always.desc = "internal only"
ERROR.Name = "ERROR"
ERROR.Subsystem = "log"
ERROR.Desc = "Enable log.Error()"
ERROR.Register()
PRINTLN.B = true
PRINTLN.Name = "PRINTLN"
PRINTLN.Subsystem = "log"
PRINTLN.Desc = "Enable log.Println()"
PRINTLN.Register()
} }
// set all the flags // restores flag to it's default value
func SetAll(b bool) { func (f *LogFlag) SetDefault() {
flagsMutex.Lock() if ! f.Ok() {return}
defer flagsMutex.Unlock() f.b = f.orig
for _, f := range flags {
f.B = b
}
} }
// set all the flags // set all the flags
@ -82,7 +84,22 @@ func SetDefaults() {
flagsMutex.Lock() flagsMutex.Lock()
defer flagsMutex.Unlock() defer flagsMutex.Unlock()
for _, f := range flags { for _, f := range flags {
f.B = f.Default f.SetDefault()
}
}
// protects against panic() by making sure it exists.
func (f *LogFlag) Ok() bool {
if f == nil {return false}
return true
}
// set all the flags
func SetAll(b bool) {
flagsMutex.Lock()
defer flagsMutex.Unlock()
for _, f := range flags {
f.b = b
} }
} }
@ -94,55 +111,86 @@ func ShowFlags() []*LogFlag {
flagsMutex.Lock() flagsMutex.Lock()
defer flagsMutex.Unlock() defer flagsMutex.Unlock()
for _, f := range flags { for _, f := range flags {
Log(true, "ShowFlags() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc) Log(always, "ShowFlags() ", "(" + f.subsystem + ")", f.name, "=", f.b, ":", f.desc)
} }
return flags return flags
} }
// TODO, switch to this // TODO, switch to this. maybe.
func ProcessFlags(callback func(*LogFlag)) { func ProcessFlags(callback func(*LogFlag)) {
flagsMutex.Lock() flagsMutex.Lock()
defer flagsMutex.Unlock() defer flagsMutex.Unlock()
for _, f := range flags { for _, f := range flags {
Log(true, "ProcessFlags() run callback(f) here on", f) Log(always, "ProcessFlags() run callback(f) here on", f)
callback(f) callback(f)
} }
} }
// returns the value of the flag
func (f *LogFlag) Get() bool {
if ! f.Ok() {return false}
return f.b
}
// returns the name of the flag
func (f *LogFlag) GetName() string {
if ! f.Ok() {return ""}
return f.name
}
// returns the subsystem of the flag
func (f *LogFlag) GetSubsystem() string {
if ! f.Ok() {return ""}
return f.subsystem
}
// returns the description of the flag
func (f *LogFlag) GetDesc() string {
if ! f.Ok() {return ""}
return f.desc
}
// register a variable name from a subsystem // register a variable name from a subsystem
// inspired by Alex Flint // inspired by Alex Flint
// set the Default value at the time of registration // set the Default value at the time of registration
func (f *LogFlag) Register() {
// this is what the current log.SetFlag() function should become
func NewFlag(name string, b bool, full, short, desc string) *LogFlag {
flagsMutex.Lock() flagsMutex.Lock()
defer flagsMutex.Unlock() defer flagsMutex.Unlock()
Info("log.Register() ", f) f := new(LogFlag)
f.Default = f.B Log(always, "log.SetFlag() ", full, short, name, true)
if f.Short == "" { f.b = b
f.Short = f.Subsystem f.orig = b
} f.short = short
f.subsystem = full
f.name = name
f.desc = desc
flags = append(flags,f) flags = append(flags,f)
return f
} }
func (f *LogFlag) Set(b bool) { func (f *LogFlag) Set(b bool) {
if ! f.Ok() {return}
flagsMutex.Lock() flagsMutex.Lock()
defer flagsMutex.Unlock() defer flagsMutex.Unlock()
Info("Set() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc) Info("Set() ", "(" + f.subsystem + ")", f.name, "=", f.b, ":", f.desc)
f.B = b f.b = b
Info("Set() f.B is now", f.B) Info("Set() f.b is now", f.b)
} }
/*
func Set(subsystem string, name string, b bool) { func Set(subsystem string, name string, b bool) {
flagsMutex.Lock() flagsMutex.Lock()
defer flagsMutex.Unlock() defer flagsMutex.Unlock()
Verbose("log.Set() TODO find var:", "(" + subsystem + ")", name, "=", b) Verbose("log.Set() TODO find var:", "(" + subsystem + ")", name, "=", b)
for _, f := range flags { for _, f := range flags {
Verbose("log.Set() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc) Verbose("log.Set() ", "(" + f.subsystem + ")", f.name, "=", f.b, ":", f.desc)
if (subsystem == f.Subsystem) && (name == f.Name) { if (subsystem == f.subsystem) && (name == f.name) {
Verbose("log.Set() FOUND ", f) Verbose("log.Set() FOUND ", f)
f.B = b f.b = b
return return
} }
} }
@ -154,11 +202,12 @@ func Get(subsystem string, name string) bool {
defer flagsMutex.Unlock() defer flagsMutex.Unlock()
Verbose("log.Get() TODO find var:", "(" + subsystem + ")", name) Verbose("log.Get() TODO find var:", "(" + subsystem + ")", name)
for _, f := range flags { for _, f := range flags {
Verbose("log.Get() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc) Verbose("log.Get() ", "(" + f.subsystem + ")", f.name, "=", f.b, ":", f.desc)
if (subsystem == f.Subsystem) && (name == f.Name) { if (subsystem == f.subsystem) && (name == f.name) {
Verbose("log.Get() FOUND ", f) Verbose("log.Get() FOUND ", f)
return f.B return f.b
} }
} }
return false return false
} }
*/

5
go.mod
View File

@ -1,5 +0,0 @@
module go.wit.com/log
go 1.21.4
require go.wit.com/spew v0.0.0-20240101141411-c7b8e91573c9

2
go.sum
View File

@ -1,2 +0,0 @@
go.wit.com/spew v0.0.0-20240101141411-c7b8e91573c9 h1:UEX2EzLQPzLTfy/kUFQD7OXtvKn8wk/+jpDOkbl4ff4=
go.wit.com/spew v0.0.0-20240101141411-c7b8e91573c9/go.mod h1:qBpgJXThMMT15vym7/E4Ur9y8oOo2nP7t2RP52QHUNw=

View File

@ -5,11 +5,13 @@ import (
) )
func Info(a ...any) { func Info(a ...any) {
if ! INFO.B { return } if ! INFO.Ok() { return }
if ! INFO.b { return }
golanglog.Println(a...) golanglog.Println(a...)
} }
func Infof(s string, a ...any) { func Infof(s string, a ...any) {
if ! INFO.B { return } if ! INFO.Ok() { return }
if ! INFO.b { return }
golanglog.Printf(s, a...) golanglog.Printf(s, a...)
} }

46
log.go
View File

@ -16,45 +16,25 @@ Example:
In your package, register NETWARN: In your package, register NETWARN:
var NETWARN bool var NETWARN *log.LogFlag
log.Register("myNetPkg", "NETWARN", &NETWARN) NETWARN = log.NewFlag("NETWARN", true, "go.wit.com/log", "log", "network warnings!")
*/ */
func Log(x any, a ...any) { func Log(f *LogFlag, a ...any) {
if x == nil { return } if ! f.Ok() {
switch x.(type) { // if the flag is NULL, notify the user they didn't initialize the flag
case bool: a = append([]any{"FLAG = NULL"}, a...)
if ! x.(bool) { origlog.Println(a...)
return return
} }
if ! f.Get() { return }
a = append([]any{f.short}, a...)
origlog.Println(a...) origlog.Println(a...)
case LogFlag:
var f LogFlag
f = x.(LogFlag)
if ! f.B {
return
}
a = append([]any{f.Short}, a...)
origlog.Println(a...)
default:
a = append([]any{x}, a...)
origlog.Println(a...)
}
} }
func Logf(x any, s string, a ...any) { func Logf(f *LogFlag, s string, a ...any) {
if x == nil { return } if ! f.Get() { return }
switch x.(type) { s = f.short + " " + s
case bool:
if ! x.(bool) {
return
}
case LogFlag:
var f LogFlag
f = x.(LogFlag)
if ! f.B {
return
}
}
origlog.Printf(s, a...) origlog.Printf(s, a...)
} }

View File

@ -19,18 +19,50 @@ package log
*/ */
// TODO: fill in the other functions from "log". Is there a way to automagically do that? // TODO: fill in the other functions from "log". Is there a way to automagically do that?
// the full list is:
/*
type Logger
// NEED THESE
func (l *Logger) Fatal(v ...any)
func (l *Logger) Fatalf(format string, v ...any)
func (l *Logger) Fatalln(v ...any)
func (l *Logger) Panic(v ...any)
func (l *Logger) Panicf(format string, v ...any)
func (l *Logger) Panicln(v ...any)
func (l *Logger) Print(v ...any)
func (l *Logger) Printf(format string, v ...any)
func (l *Logger) Println(v ...any)
func Default() *Logger
func New(out io.Writer, prefix string, flag int) *Logger
// what are these?
func (l *Logger) Flags() int
func (l *Logger) SetFlags(flag int)
func (l *Logger) Prefix() string
func (l *Logger) SetPrefix(prefix string)
// probably not this stuff
func (l *Logger) SetOutput(w io.Writer)
func (l *Logger) Output(calldepth int, s string) error
func (l *Logger) Writer() io.Writer
*/
import ( import (
origlog "log" origlog "log"
) )
func Println(a ...any) { func Println(a ...any) {
if ! PRINTLN.B { return } if ! PRINTLN.Ok() { return }
if ! PRINTLN.b { return }
origlog.Println(a...) origlog.Println(a...)
} }
func Printf(s string, a ...any) { func Printf(s string, a ...any) {
if ! PRINTLN.B { return } if ! PRINTLN.Ok() { return }
if ! PRINTLN.b { return }
origlog.Printf(s, a...) origlog.Printf(s, a...)
} }

View File

@ -6,7 +6,8 @@ import (
) )
func Spew(b any, a ...any) { func Spew(b any, a ...any) {
if ! SPEW.B { return } if ! SPEW.Ok() { return }
if ! SPEW.b { return }
switch b.(type) { switch b.(type) {
case bool: case bool:
@ -17,7 +18,7 @@ func Spew(b any, a ...any) {
case LogFlag: case LogFlag:
var f LogFlag var f LogFlag
f = b.(LogFlag) f = b.(LogFlag)
if ! f.B { if ! f.b {
return return
} }
origlog.Println("SPEW:", spew.Sdump(a...)) origlog.Println("SPEW:", spew.Sdump(a...))

View File

@ -5,6 +5,7 @@ import (
) )
func Verbose(a ...any) { func Verbose(a ...any) {
if ! VERBOSE.B { return } if ! VERBOSE.Ok() { return }
if ! VERBOSE.b { return }
golanglog.Println(a...) golanglog.Println(a...)
} }

View File

@ -5,6 +5,7 @@ import (
) )
func Warn(a ...any) { func Warn(a ...any) {
if ! WARN.B { return } if ! WARN.Ok() { return }
if ! WARN.b { return }
origlog.Println(a...) origlog.Println(a...)
} }