logger
parent
c0015e89c0
commit
e690f00e18
|
@ -0,0 +1,78 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Default Logger
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
Default = NewLogger(os.Stdout, "color")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Debug(a ...interface{}) {
|
||||||
|
Default.Debug(a...)
|
||||||
|
}
|
||||||
|
func Debugf(format string, a ...interface{}) {
|
||||||
|
Default.Debugf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Error(a ...interface{}) error {
|
||||||
|
return Default.Error(a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Errorf(format string, a ...interface{}) error {
|
||||||
|
return Default.Errorf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fatal(a ...interface{}) {
|
||||||
|
Default.Fatal(a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fatalf(format string, a ...interface{}) {
|
||||||
|
Default.Fatalf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Highlight(a ...interface{}) {
|
||||||
|
Default.Highlight(a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Highlightf(format string, a ...interface{}) {
|
||||||
|
Default.Highlightf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Inform(a ...interface{}) {
|
||||||
|
Default.Inform(a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Informf(format string, a ...interface{}) {
|
||||||
|
Default.Informf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Panic(a ...interface{}) {
|
||||||
|
Default.Panic(a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Panicf(format string, a ...interface{}) {
|
||||||
|
Default.Panicf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Trace(a ...interface{}) {
|
||||||
|
Default.Trace(a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Tracef(format string, a ...interface{}) {
|
||||||
|
Default.Tracef(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Warn(a ...interface{}) {
|
||||||
|
Default.Warn(a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Warnf(format string, a ...interface{}) {
|
||||||
|
Default.Warnf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Prefix(a ...string) Logger {
|
||||||
|
return Default.Prefix(a...)
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
type internalLogger struct {
|
||||||
|
prefix string
|
||||||
|
style string
|
||||||
|
|
||||||
|
writer io.Writer
|
||||||
|
|
||||||
|
canNotLogDebug bool
|
||||||
|
canNotLogError bool
|
||||||
|
canNotLogFatal bool
|
||||||
|
canNotLogHighlight bool
|
||||||
|
canNotLogInform bool
|
||||||
|
canNotLogPanic bool
|
||||||
|
canNotLogTrace bool
|
||||||
|
canNotLogWarn bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLogger(writer io.Writer, parameters ...string) Logger {
|
||||||
|
logger := internalLogger{
|
||||||
|
writer:writer,
|
||||||
|
}
|
||||||
|
if 1 <= len(parameters) {
|
||||||
|
style := parameters[0]
|
||||||
|
switch style {
|
||||||
|
case "color","colour":
|
||||||
|
logger.style = "color"
|
||||||
|
default:
|
||||||
|
logger.style = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return logger
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (receiver internalLogger) CanLogDebug() bool {
|
||||||
|
return !receiver.canNotLogDebug
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Debug(a ...interface{}) {
|
||||||
|
if !receiver.CanLogDebug() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if nil == receiver.writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s := fmt.Sprint(a...)
|
||||||
|
|
||||||
|
receiver.Debugf("%s", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Debugf(format string, a ...interface{}) {
|
||||||
|
if !receiver.CanLogDebug() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var writer io.Writer = receiver.writer
|
||||||
|
if nil == writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var newformat string
|
||||||
|
{
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
switch receiver.style{
|
||||||
|
case"color":
|
||||||
|
buffer.WriteString("\x1b[48;2;1;1;1m")
|
||||||
|
buffer.WriteString("\x1b[38;2;44;181;233m")
|
||||||
|
case "":
|
||||||
|
buffer.WriteString("[debug] ")
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteString(format)
|
||||||
|
|
||||||
|
switch receiver.style {
|
||||||
|
case "color":
|
||||||
|
buffer.WriteString("\x1b[0m")
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
case "":
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
newformat = buffer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(receiver.writer, newformat, a...)
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInternalLogger_Debugf(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct{
|
||||||
|
Format string
|
||||||
|
Array []interface{}
|
||||||
|
Expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[debug] \n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[debug] \n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[debug] hello world\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[debug] hello world\n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello %s",
|
||||||
|
Array: []interface{}{"Joe"},
|
||||||
|
Expected: "[debug] hello Joe\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello %s %s",
|
||||||
|
Array: []interface{}{"Joe", "Blow"},
|
||||||
|
Expected: "[debug] hello Joe Blow\n",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
|
||||||
|
logger := NewLogger(&buffer)
|
||||||
|
|
||||||
|
logger.Debugf(test.Format, test.Array...)
|
||||||
|
|
||||||
|
if expected, actual := test.Expected, buffer.String(); expected != actual {
|
||||||
|
t.Errorf("For tst #%d, the actual result is not what was expected.", testNumber)
|
||||||
|
t.Logf("EXPECTED: %q", expected)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (receiver internalLogger) CanLogError() bool {
|
||||||
|
return !receiver.canNotLogError
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Error(a ...interface{}) error {
|
||||||
|
s := fmt.Sprint(a...)
|
||||||
|
|
||||||
|
return receiver.Errorf("%s", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Errorf(format string, a ...interface{}) error {
|
||||||
|
err := fmt.Errorf(format, a...)
|
||||||
|
|
||||||
|
if !receiver.CanLogError() {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var writer io.Writer = receiver.writer
|
||||||
|
if nil == writer {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var newformat string
|
||||||
|
{
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
switch receiver.style{
|
||||||
|
case"color":
|
||||||
|
buffer.WriteString("\x1b[48;2;1;1;1m")
|
||||||
|
buffer.WriteString("\x1b[38;222;56;43;6m")
|
||||||
|
case "":
|
||||||
|
buffer.WriteString("[ERROR] ")
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteString(format)
|
||||||
|
|
||||||
|
switch receiver.style {
|
||||||
|
case "color":
|
||||||
|
buffer.WriteString("\x1b[0m")
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
case "":
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
newformat = buffer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(receiver.writer, newformat, a...)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInternalLogger_Errorf(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct{
|
||||||
|
Format string
|
||||||
|
Array []interface{}
|
||||||
|
Expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[ERROR] \n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[ERROR] \n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[ERROR] hello world\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[ERROR] hello world\n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello %s",
|
||||||
|
Array: []interface{}{"Joe"},
|
||||||
|
Expected: "[ERROR] hello Joe\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello %s %s",
|
||||||
|
Array: []interface{}{"Joe", "Blow"},
|
||||||
|
Expected: "[ERROR] hello Joe Blow\n",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
|
||||||
|
logger := NewLogger(&buffer)
|
||||||
|
|
||||||
|
logger.Errorf(test.Format, test.Array...)
|
||||||
|
|
||||||
|
if expected, actual := test.Expected, buffer.String(); expected != actual {
|
||||||
|
t.Errorf("For tst #%d, the actual result is not what was expected.", testNumber)
|
||||||
|
t.Logf("EXPECTED: %q", expected)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (receiver internalLogger) CanLogFatal() bool {
|
||||||
|
return !receiver.canNotLogFatal
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Fatal(a ...interface{}) {
|
||||||
|
s := fmt.Sprint(a...)
|
||||||
|
|
||||||
|
receiver.Fatalf("%s", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Fatalf(format string, a ...interface{}) {
|
||||||
|
if !receiver.CanLogFatal() {
|
||||||
|
os.Exit(1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var writer io.Writer = receiver.writer
|
||||||
|
if nil == writer {
|
||||||
|
os.Exit(1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var newformat string
|
||||||
|
{
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
switch receiver.style{
|
||||||
|
case"color":
|
||||||
|
buffer.WriteString("\x1b[48;2;1;1;1m")
|
||||||
|
buffer.WriteString("\x1b[38;222;56;43;6m")
|
||||||
|
case "":
|
||||||
|
buffer.WriteString("[PANIC] ")
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteString(format)
|
||||||
|
|
||||||
|
switch receiver.style {
|
||||||
|
case "color":
|
||||||
|
buffer.WriteString("\x1b[0m")
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
case "":
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
newformat = buffer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(receiver.writer, newformat, a...)
|
||||||
|
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (receiver internalLogger) CanLogHighlight() bool {
|
||||||
|
return !receiver.canNotLogHighlight
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Highlight(a ...interface{}) {
|
||||||
|
if !receiver.CanLogHighlight() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if nil == receiver.writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s := fmt.Sprint(a...)
|
||||||
|
|
||||||
|
receiver.Highlightf("%s", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Highlightf(format string, a ...interface{}) {
|
||||||
|
if !receiver.CanLogHighlight() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var writer io.Writer = receiver.writer
|
||||||
|
if nil == writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var newformat string
|
||||||
|
{
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
switch receiver.style{
|
||||||
|
case"color":
|
||||||
|
buffer.WriteString("\x1b[48;2;153;0;17m")
|
||||||
|
buffer.WriteString("\x1b[38;2;252;246;245m")
|
||||||
|
case "":
|
||||||
|
buffer.WriteString("[HIGHLIGHT] ")
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteString(format)
|
||||||
|
|
||||||
|
switch receiver.style {
|
||||||
|
case "color":
|
||||||
|
buffer.WriteString("\x1b[0m")
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
case "":
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
newformat = buffer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(receiver.writer, newformat, a...)
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInternalLogger_Highlightf(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct{
|
||||||
|
Format string
|
||||||
|
Array []interface{}
|
||||||
|
Expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[HIGHLIGHT] \n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[HIGHLIGHT] \n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[HIGHLIGHT] hello world\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[HIGHLIGHT] hello world\n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello %s",
|
||||||
|
Array: []interface{}{"Joe"},
|
||||||
|
Expected: "[HIGHLIGHT] hello Joe\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello %s %s",
|
||||||
|
Array: []interface{}{"Joe", "Blow"},
|
||||||
|
Expected: "[HIGHLIGHT] hello Joe Blow\n",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
|
||||||
|
logger := NewLogger(&buffer)
|
||||||
|
|
||||||
|
logger.Highlightf(test.Format, test.Array...)
|
||||||
|
|
||||||
|
if expected, actual := test.Expected, buffer.String(); expected != actual {
|
||||||
|
t.Errorf("For tst #%d, the actual result is not what was expected.", testNumber)
|
||||||
|
t.Logf("EXPECTED: %q", expected)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (receiver internalLogger) CanLogInform() bool {
|
||||||
|
return !receiver.canNotLogInform
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Inform(a ...interface{}) {
|
||||||
|
if !receiver.CanLogInform() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if nil == receiver.writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s := fmt.Sprint(a...)
|
||||||
|
|
||||||
|
receiver.Informf("%s", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Informf(format string, a ...interface{}) {
|
||||||
|
if !receiver.CanLogInform() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var writer io.Writer = receiver.writer
|
||||||
|
if nil == writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var newformat string
|
||||||
|
{
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
switch receiver.style{
|
||||||
|
case"color":
|
||||||
|
buffer.WriteString("\x1b[48;2;1;1;1m")
|
||||||
|
buffer.WriteString("\x1b[38;222;56;43;6m")
|
||||||
|
case "":
|
||||||
|
buffer.WriteString("[inform] ")
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteString(format)
|
||||||
|
|
||||||
|
switch receiver.style {
|
||||||
|
case "color":
|
||||||
|
buffer.WriteString("\x1b[0m")
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
case "":
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
newformat = buffer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(receiver.writer, newformat, a...)
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInternalLogger_Informf(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct{
|
||||||
|
Format string
|
||||||
|
Array []interface{}
|
||||||
|
Expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[inform] \n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[inform] \n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[inform] hello world\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[inform] hello world\n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello %s",
|
||||||
|
Array: []interface{}{"Joe"},
|
||||||
|
Expected: "[inform] hello Joe\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello %s %s",
|
||||||
|
Array: []interface{}{"Joe", "Blow"},
|
||||||
|
Expected: "[inform] hello Joe Blow\n",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
|
||||||
|
logger := NewLogger(&buffer)
|
||||||
|
|
||||||
|
logger.Informf(test.Format, test.Array...)
|
||||||
|
|
||||||
|
if expected, actual := test.Expected, buffer.String(); expected != actual {
|
||||||
|
t.Errorf("For tst #%d, the actual result is not what was expected.", testNumber)
|
||||||
|
t.Logf("EXPECTED: %q", expected)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (receiver internalLogger) CanLogPanic() bool {
|
||||||
|
return !receiver.canNotLogPanic
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Panic(a ...interface{}) {
|
||||||
|
s := fmt.Sprint(a...)
|
||||||
|
|
||||||
|
receiver.Panicf("%s", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Panicf(format string, a ...interface{}) {
|
||||||
|
err := fmt.Errorf(format, a...)
|
||||||
|
|
||||||
|
if !receiver.CanLogPanic() {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var writer io.Writer = receiver.writer
|
||||||
|
if nil == writer {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var newformat string
|
||||||
|
{
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
switch receiver.style{
|
||||||
|
case"color":
|
||||||
|
buffer.WriteString("\x1b[48;2;1;1;1m")
|
||||||
|
buffer.WriteString("\x1b[38;222;56;43;6m")
|
||||||
|
case "":
|
||||||
|
buffer.WriteString("[PANIC] ")
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteString(format)
|
||||||
|
|
||||||
|
switch receiver.style {
|
||||||
|
case "color":
|
||||||
|
buffer.WriteString("\x1b[0m")
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
case "":
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
newformat = buffer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(receiver.writer, newformat, a...)
|
||||||
|
|
||||||
|
panic(err)
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (receiver internalLogger) Prefix(newprefix ...string) Logger {
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
buffer.WriteString(receiver.prefix)
|
||||||
|
|
||||||
|
for _, s := range newprefix {
|
||||||
|
buffer.WriteString(s)
|
||||||
|
buffer.WriteString(": ")
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix := buffer.String()
|
||||||
|
|
||||||
|
var logger internalLogger = receiver
|
||||||
|
logger.prefix += prefix
|
||||||
|
|
||||||
|
return logger
|
||||||
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLoggerPrefix(t *testing.T) {
|
||||||
|
tests := []struct{
|
||||||
|
NewPrefix []string
|
||||||
|
Expected string
|
||||||
|
}{
|
||||||
|
|
||||||
|
{
|
||||||
|
NewPrefix: []string(nil),
|
||||||
|
Expected: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
NewPrefix: []string{},
|
||||||
|
Expected: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
NewPrefix: []string{""},
|
||||||
|
Expected: ": ",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
NewPrefix: []string{"", ""},
|
||||||
|
Expected: ": : ",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
NewPrefix: []string{"", "", ""},
|
||||||
|
Expected: ": : : ",
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
NewPrefix: []string{"", "", "", "", "", "", "", "", "", ""},
|
||||||
|
Expected: ": : : : : : : : : : ",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
NewPrefix: []string{"ONE"},
|
||||||
|
Expected: "ONE: ",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
NewPrefix: []string{"ONE", "TWO"},
|
||||||
|
Expected: "ONE: TWO: ",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
NewPrefix: []string{"ONE", "TWO", "THREE"},
|
||||||
|
Expected: "ONE: TWO: THREE: ",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var logger internalLogger
|
||||||
|
|
||||||
|
newLogger := logger.Prefix(test.NewPrefix...)
|
||||||
|
|
||||||
|
newInternalLogger, casted := newLogger.(internalLogger)
|
||||||
|
if !casted {
|
||||||
|
t.Errorf("For test #%d, could not cast to flog.internalLogger.", testNumber)
|
||||||
|
t.Logf("TYPE: %T", newLogger)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if expected, actual := test.Expected, newInternalLogger.prefix; expected != actual {
|
||||||
|
t.Errorf("For test #%d, the actual prefix is not what was expected.", testNumber)
|
||||||
|
t.Log("EXPECTED:", expected)
|
||||||
|
t.Log("ACTUAL: ", actual)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLoggerPrefix_inform(t *testing.T) {
|
||||||
|
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
|
||||||
|
log := NewLogger(&buffer).Prefix("one","two","three")
|
||||||
|
|
||||||
|
func(){
|
||||||
|
defer func(){
|
||||||
|
if r := recover(); nil != r {
|
||||||
|
fmt.Fprintf(&buffer, "RECOVER:%v\n",r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
log.Panic("hello PANIC")
|
||||||
|
}()
|
||||||
|
log.Inform("hello INFORM")
|
||||||
|
log.Highlight("hello HIGHLIGHT")
|
||||||
|
log.Error("hello ERROR")
|
||||||
|
log.Warn("hello WARN")
|
||||||
|
log.Debug("hello DEBUG")
|
||||||
|
log.Trace("hello TRACE")
|
||||||
|
|
||||||
|
const expected = "[PANIC] hello PANIC" + "\n" +
|
||||||
|
"RECOVER:hello PANIC" + "\n" +
|
||||||
|
"[inform] hello INFORM" + "\n" +
|
||||||
|
"[HIGHLIGHT] hello HIGHLIGHT" + "\n" +
|
||||||
|
"[ERROR] hello ERROR" + "\n" +
|
||||||
|
"[warn] hello WARN" + "\n" +
|
||||||
|
"[debug] hello DEBUG" + "\n" +
|
||||||
|
"[trace] hello TRACE" + "\n"
|
||||||
|
|
||||||
|
if actual := buffer.String(); expected != actual {
|
||||||
|
t.Error("The actual logs is not what was expected.")
|
||||||
|
t.Log("EXPECTED:\n", expected)
|
||||||
|
t.Log("ACTUAL:\n", actual)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (receiver internalLogger) CanLogTrace() bool {
|
||||||
|
return !receiver.canNotLogTrace
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Trace(a ...interface{}) {
|
||||||
|
if !receiver.CanLogTrace() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if nil == receiver.writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s := fmt.Sprint(a...)
|
||||||
|
|
||||||
|
receiver.Tracef("%s", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Tracef(format string, a ...interface{}) {
|
||||||
|
if !receiver.CanLogTrace() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var writer io.Writer = receiver.writer
|
||||||
|
if nil == writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var newformat string
|
||||||
|
{
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
switch receiver.style{
|
||||||
|
case"color":
|
||||||
|
buffer.WriteString("\x1b[48;2;1;1;1m")
|
||||||
|
buffer.WriteString("\x1b[38;2;255;199;6m")
|
||||||
|
case "":
|
||||||
|
buffer.WriteString("[trace] ")
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteString(format)
|
||||||
|
|
||||||
|
switch receiver.style {
|
||||||
|
case "color":
|
||||||
|
buffer.WriteString("\x1b[0m")
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
case "":
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
newformat = buffer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(receiver.writer, newformat, a...)
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInternalLogger_Tracef(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct{
|
||||||
|
Format string
|
||||||
|
Array []interface{}
|
||||||
|
Expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[trace] \n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[trace] \n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[trace] hello world\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[trace] hello world\n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello %s",
|
||||||
|
Array: []interface{}{"Joe"},
|
||||||
|
Expected: "[trace] hello Joe\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello %s %s",
|
||||||
|
Array: []interface{}{"Joe", "Blow"},
|
||||||
|
Expected: "[trace] hello Joe Blow\n",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
|
||||||
|
logger := NewLogger(&buffer)
|
||||||
|
|
||||||
|
logger.Tracef(test.Format, test.Array...)
|
||||||
|
|
||||||
|
if expected, actual := test.Expected, buffer.String(); expected != actual {
|
||||||
|
t.Errorf("For tst #%d, the actual result is not what was expected.", testNumber)
|
||||||
|
t.Logf("EXPECTED: %q", expected)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (receiver internalLogger) CanLogWarn() bool {
|
||||||
|
return !receiver.canNotLogWarn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Warn(a ...interface{}) {
|
||||||
|
if !receiver.CanLogWarn() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if nil == receiver.writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s := fmt.Sprint(a...)
|
||||||
|
|
||||||
|
receiver.Warnf("%s", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (receiver internalLogger) Warnf(format string, a ...interface{}) {
|
||||||
|
if !receiver.CanLogWarn() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var writer io.Writer = receiver.writer
|
||||||
|
if nil == writer {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var newformat string
|
||||||
|
{
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
switch receiver.style{
|
||||||
|
case"color":
|
||||||
|
buffer.WriteString("\x1b[48;2;1;1;1m")
|
||||||
|
buffer.WriteString("\x1b[38;222;56;43;6m")
|
||||||
|
case "":
|
||||||
|
buffer.WriteString("[warn] ")
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteString(format)
|
||||||
|
|
||||||
|
switch receiver.style {
|
||||||
|
case "color":
|
||||||
|
buffer.WriteString("\x1b[0m")
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
case "":
|
||||||
|
buffer.WriteRune('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
newformat = buffer.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(receiver.writer, newformat, a...)
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInternalLogger_Warnf(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct{
|
||||||
|
Format string
|
||||||
|
Array []interface{}
|
||||||
|
Expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[warn] \n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[warn] \n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}(nil),
|
||||||
|
Expected: "[warn] hello world\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello world",
|
||||||
|
Array: []interface{}{},
|
||||||
|
Expected: "[warn] hello world\n",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Format: "hello %s",
|
||||||
|
Array: []interface{}{"Joe"},
|
||||||
|
Expected: "[warn] hello Joe\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Format: "hello %s %s",
|
||||||
|
Array: []interface{}{"Joe", "Blow"},
|
||||||
|
Expected: "[warn] hello Joe Blow\n",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
|
||||||
|
logger := NewLogger(&buffer)
|
||||||
|
|
||||||
|
logger.Warnf(test.Format, test.Array...)
|
||||||
|
|
||||||
|
if expected, actual := test.Expected, buffer.String(); expected != actual {
|
||||||
|
t.Errorf("For tst #%d, the actual result is not what was expected.", testNumber)
|
||||||
|
t.Logf("EXPECTED: %q", expected)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
type Logger interface {
|
||||||
|
CanLogDebug() bool
|
||||||
|
Debug(...interface{})
|
||||||
|
Debugf(string, ...interface{})
|
||||||
|
|
||||||
|
CanLogError() bool
|
||||||
|
Error(...interface{}) error
|
||||||
|
Errorf(string, ...interface{}) error
|
||||||
|
|
||||||
|
CanLogFatal() bool
|
||||||
|
Fatal(...interface{})
|
||||||
|
Fatalf(string, ...interface{})
|
||||||
|
|
||||||
|
CanLogHighlight() bool
|
||||||
|
Highlight(...interface{})
|
||||||
|
Highlightf(string, ...interface{})
|
||||||
|
|
||||||
|
CanLogInform() bool
|
||||||
|
Inform(...interface{})
|
||||||
|
Informf(string, ...interface{})
|
||||||
|
|
||||||
|
CanLogPanic() bool
|
||||||
|
Panic(...interface{})
|
||||||
|
Panicf(string, ...interface{})
|
||||||
|
|
||||||
|
CanLogTrace() bool
|
||||||
|
Trace(...interface{})
|
||||||
|
Tracef(string, ...interface{})
|
||||||
|
|
||||||
|
CanLogWarn() bool
|
||||||
|
Warn(...interface{})
|
||||||
|
Warnf(string, ...interface{})
|
||||||
|
|
||||||
|
Prefix(...string) Logger
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package flog
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInternalLoggerIsLogger(t *testing.T) {
|
||||||
|
|
||||||
|
var x Logger = internalLogger{} // THIS IS WHAT ACTUALLY MATTERS.
|
||||||
|
|
||||||
|
if nil == x {
|
||||||
|
t.Error("This should never happen.")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue