mirror of
https://github.com/taigrr/log-socket
synced 2025-01-18 04:53:14 -08:00
Adds Flush method
This commit is contained in:
parent
9ff091038a
commit
65ff9008da
140
logger.go
140
logger.go
@ -1,12 +1,13 @@
|
|||||||
package lambo_log_socket
|
package lambo_log_socket
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Level int
|
type Level int
|
||||||
@ -21,24 +22,30 @@ const (
|
|||||||
LFatal
|
LFatal
|
||||||
)
|
)
|
||||||
|
|
||||||
var logger = logrus.New()
|
var (
|
||||||
var clients []*Client
|
clients []*Client
|
||||||
var sliceTex sync.Mutex
|
sliceTex sync.Mutex
|
||||||
|
stderrClient *Client
|
||||||
|
cleanup sync.Once
|
||||||
|
stderrFinished chan bool
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
stderrClient := CreateClient()
|
stderrClient = CreateClient()
|
||||||
|
stderrClient.SetLogLevel(LTrace)
|
||||||
|
stderrFinished = make(chan bool, 1)
|
||||||
go stderrClient.logStdErr()
|
go stderrClient.logStdErr()
|
||||||
logger.SetLevel(logrus.DebugLevel)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) logStdErr() {
|
func (c *Client) logStdErr() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case entry, more := <-c.writer:
|
case e, more := <-c.writer:
|
||||||
if c.LogLevel >= entry.level {
|
if e.level >= c.LogLevel {
|
||||||
fmt.Println(entry.Output)
|
fmt.Fprintf(os.Stderr, "%s\t%s\t%s\t%s\n", e.Timestamp.String(), e.Level, e.Output, e.File)
|
||||||
}
|
}
|
||||||
if !more {
|
if !more {
|
||||||
|
stderrFinished <- true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -54,6 +61,13 @@ func CreateClient() *Client {
|
|||||||
return &client
|
return &client
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Flush() {
|
||||||
|
cleanup.Do(func() {
|
||||||
|
close(stderrClient.writer)
|
||||||
|
<-stderrFinished
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) Destroy() error {
|
func (c *Client) Destroy() error {
|
||||||
var otherClients []*Client
|
var otherClients []*Client
|
||||||
sliceTex.Lock()
|
sliceTex.Lock()
|
||||||
@ -76,7 +90,7 @@ func (c *Client) GetLogLevel() Level {
|
|||||||
func createLog(e Entry) {
|
func createLog(e Entry) {
|
||||||
sliceTex.Lock()
|
sliceTex.Lock()
|
||||||
for _, c := range clients {
|
for _, c := range clients {
|
||||||
go func(c *Client, e Entry) {
|
func(c *Client, e Entry) {
|
||||||
select {
|
select {
|
||||||
case c.writer <- e:
|
case c.writer <- e:
|
||||||
default:
|
default:
|
||||||
@ -93,51 +107,107 @@ func (c *Client) SetLogLevel(level Level) {
|
|||||||
|
|
||||||
// Trace prints out logs on trace level
|
// Trace prints out logs on trace level
|
||||||
func Trace(args ...interface{}) {
|
func Trace(args ...interface{}) {
|
||||||
entry := logger.WithFields(logrus.Fields{})
|
output := fmt.Sprint(args...)
|
||||||
entry.Data["file"] = fileInfo(2)
|
e := Entry{
|
||||||
entry.Debug(args...)
|
Timestamp: time.Now(),
|
||||||
|
Output: output,
|
||||||
|
File: fileInfo(2),
|
||||||
|
Level: "TRACE",
|
||||||
|
level: LTrace,
|
||||||
|
}
|
||||||
|
createLog(e)
|
||||||
|
// entry := logger.WithFields(logrus.Fields{})
|
||||||
|
// entry.Data["file"] = fileInfo(2)
|
||||||
|
// entry.Debug(args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debug prints out logs on debug level
|
// Debug prints out logs on debug level
|
||||||
func Debug(args ...interface{}) {
|
func Debug(args ...interface{}) {
|
||||||
entry := logger.WithFields(logrus.Fields{})
|
output := fmt.Sprint(args...)
|
||||||
entry.Data["file"] = fileInfo(2)
|
e := Entry{
|
||||||
entry.Debug(args...)
|
Timestamp: time.Now(),
|
||||||
|
Output: output,
|
||||||
|
File: fileInfo(2),
|
||||||
|
Level: "DEBUG",
|
||||||
|
level: LDebug,
|
||||||
|
}
|
||||||
|
createLog(e)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info prints out logs on info level
|
// Info prints out logs on info level
|
||||||
func Info(args ...interface{}) {
|
func Info(args ...interface{}) {
|
||||||
entry := logger.WithFields(logrus.Fields{})
|
output := fmt.Sprint(args...)
|
||||||
entry.Data["file"] = fileInfo(2)
|
e := Entry{
|
||||||
entry.Info(args...)
|
Timestamp: time.Now(),
|
||||||
|
Output: output,
|
||||||
|
File: fileInfo(2),
|
||||||
|
Level: "INFO",
|
||||||
|
level: LInfo,
|
||||||
|
}
|
||||||
|
createLog(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warn prints out logs on warn level
|
// Warn prints out logs on warn level
|
||||||
func Warn(args ...interface{}) {
|
func Warn(args ...interface{}) {
|
||||||
entry := logger.WithFields(logrus.Fields{})
|
output := fmt.Sprint(args...)
|
||||||
entry.Data["file"] = fileInfo(2)
|
e := Entry{
|
||||||
entry.Warn(args...)
|
Timestamp: time.Now(),
|
||||||
|
Output: output,
|
||||||
|
File: fileInfo(2),
|
||||||
|
Level: "WARN",
|
||||||
|
level: LWarn,
|
||||||
|
}
|
||||||
|
createLog(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error prints out logs on error level
|
// Error prints out logs on error level
|
||||||
func Error(args ...interface{}) {
|
func Error(args ...interface{}) {
|
||||||
entry := logger.WithFields(logrus.Fields{})
|
output := fmt.Sprint(args...)
|
||||||
entry.Data["file"] = fileInfo(2)
|
e := Entry{
|
||||||
entry.Error(args...)
|
Timestamp: time.Now(),
|
||||||
|
Output: output,
|
||||||
|
File: fileInfo(2),
|
||||||
|
Level: "ERROR",
|
||||||
|
level: LError,
|
||||||
}
|
}
|
||||||
|
createLog(e)
|
||||||
// Fatal prints out logs on fatal level
|
|
||||||
func Fatal(args ...interface{}) {
|
|
||||||
entry := logger.WithFields(logrus.Fields{})
|
|
||||||
entry.Data["file"] = fileInfo(2)
|
|
||||||
entry.Fatal(args...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Panic prints out logs on panic level
|
// Panic prints out logs on panic level
|
||||||
func Panic(args ...interface{}) {
|
func Panic(args ...interface{}) {
|
||||||
entry := logger.WithFields(logrus.Fields{})
|
output := fmt.Sprint(args...)
|
||||||
entry.Data["file"] = fileInfo(2)
|
e := Entry{
|
||||||
entry.Panic(args...)
|
Timestamp: time.Now(),
|
||||||
|
Output: output,
|
||||||
|
File: fileInfo(2),
|
||||||
|
Level: "PANIC",
|
||||||
|
level: LPanic,
|
||||||
|
}
|
||||||
|
createLog(e)
|
||||||
|
if len(args) >= 0 {
|
||||||
|
switch args[0].(type) {
|
||||||
|
case error:
|
||||||
|
panic(args[0])
|
||||||
|
default:
|
||||||
|
// falls through to default below
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic(errors.New(output))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fatal prints out logs on fatal level
|
||||||
|
func Fatal(args ...interface{}) {
|
||||||
|
output := fmt.Sprint(args...)
|
||||||
|
e := Entry{
|
||||||
|
Timestamp: time.Now(),
|
||||||
|
Output: output,
|
||||||
|
File: fileInfo(2),
|
||||||
|
Level: "FATAL",
|
||||||
|
level: LFatal,
|
||||||
|
}
|
||||||
|
createLog(e)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// fileInfo for getting which line in which file
|
// fileInfo for getting which line in which file
|
||||||
|
@ -25,15 +25,17 @@ func TestSetLogLevel(t *testing.T) {
|
|||||||
func TestTrace(t *testing.T) {
|
func TestTrace(t *testing.T) {
|
||||||
var c Client
|
var c Client
|
||||||
c.SetLogLevel(LTrace)
|
c.SetLogLevel(LTrace)
|
||||||
// if logLevel >= LTrace {
|
Trace("Testing trace!")
|
||||||
// entry := logger.WithFields(logrus.Fields{})
|
Trace("Testing trace!")
|
||||||
// entry.Data["file"] = fileInfo(2)
|
Trace("Testing trace!")
|
||||||
// entry.Debug(args...)
|
Trace("Testing trace!")
|
||||||
// }
|
Trace("Testing trace!")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debug prints out logs on debug level
|
// Debug prints out logs on debug level
|
||||||
func TestDebug(t *testing.T) {
|
func TestDebug(t *testing.T) {
|
||||||
|
Debug("Test of Debug")
|
||||||
// if logLevel >= LDebug {
|
// if logLevel >= LDebug {
|
||||||
// entry := logger.WithFields(logrus.Fields{})
|
// entry := logger.WithFields(logrus.Fields{})
|
||||||
// entry.Data["file"] = fileInfo(2)
|
// entry.Data["file"] = fileInfo(2)
|
||||||
@ -85,3 +87,6 @@ func TestPanic(t *testing.T) {
|
|||||||
// entry.Panic(args...)
|
// entry.Panic(args...)
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
func TestFlush(t *testing.T) {
|
||||||
|
defer Flush()
|
||||||
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package lambo_log_socket
|
package lambo_log_socket
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
type LogWriter chan Entry
|
type LogWriter chan Entry
|
||||||
|
|
||||||
type Client struct {
|
type Client struct {
|
||||||
@ -8,8 +10,9 @@ type Client struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Entry struct {
|
type Entry struct {
|
||||||
Timestamp string `json:"timestamp"`
|
Timestamp time.Time `json:"timestamp"`
|
||||||
Output string `json:"output"`
|
Output string `json:"output"`
|
||||||
|
File string `json:"file"`
|
||||||
Level string `json:"level"`
|
Level string `json:"level"`
|
||||||
level Level
|
level Level
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user