1
0
mirror of https://github.com/taigrr/log-socket synced 2025-01-18 04:53:14 -08:00

15 Commits

Author SHA1 Message Date
a1e960366e Merge pull request #11 from ethanholz/log-parity
feat: Updated to include print and added ln variants for all logs
2022-10-13 08:05:39 -07:00
Ethan Holz
430181e3a2 feat: Updated to include print and added ln variants for all logs 2022-10-13 09:59:04 -05:00
147a8cb30b Merge pull request #10 from ethanholz/README
Added a README
2022-10-10 13:38:59 -07:00
Ethan Holz
8e044e3993 docs: Updated README to include running example. 2022-10-10 12:16:52 -05:00
Ethan Holz
e97d37012e docs: Added inital README 2022-10-10 12:09:29 -05:00
ebef59a9a8 actually set value for depth 2021-08-23 21:58:05 -07:00
b3ceb12277 fixes fileinfo reflection issue 2021-08-23 21:45:08 -07:00
45cad34fdc fixes fileinfo reflection issue 2021-08-23 21:44:56 -07:00
f0c16a0c56 fixes fileinfo reflection issue 2021-08-23 21:36:49 -07:00
c18854598d Added a logger type 2021-08-23 21:25:01 -07:00
63ed3a2ad7 logger => log 2021-08-23 21:12:21 -07:00
f51ec53a89 Adds Notice logging level to support NATS 2021-08-23 20:58:15 -07:00
d21c91379e update go compiler target version 2021-08-17 10:07:07 -07:00
af2116af48 add sponsorship 2021-07-05 21:03:17 -07:00
b65a10e7a8 detect tls presence based on incoming request for websocket 2021-07-05 16:10:50 -07:00
10 changed files with 568 additions and 7 deletions

12
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: taigrr # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

15
README.md Normal file
View File

@@ -0,0 +1,15 @@
log-socket
==========
`log-socket` is a drop-in replacement for Go's `log` package that allows for streaming of logs via WebSockets.
## Installation
To install the library:
`go get github.com/taigrr/log-socket`
## Running
To run a demo of this library:
`go run main.go`
This demo will do a sample of every log type and push results to `0.0.0.0:8080`. Once running, you can open a browser and navigate to
`0.0.0.0:8080` to see an example implementation of how logs are streamed.

View File

@@ -7,7 +7,12 @@ import (
) )
func LogSocketViewHandler(w http.ResponseWriter, r *http.Request) { func LogSocketViewHandler(w http.ResponseWriter, r *http.Request) {
wsResource := "ws://" + r.Host + r.URL.Path wsResource := r.Host + r.URL.Path
if r.TLS != nil {
wsResource = "wss://" + wsResource
} else {
wsResource = "ws://" + wsResource
}
wsResource = strings.TrimSuffix(wsResource, "/") + "/ws" wsResource = strings.TrimSuffix(wsResource, "/") + "/ws"
homeTemplate.Execute(w, wsResource) homeTemplate.Execute(w, wsResource)
} }

2
go.mod
View File

@@ -1,5 +1,5 @@
module github.com/taigrr/log-socket module github.com/taigrr/log-socket
go 1.16 go 1.17
require github.com/gorilla/websocket v1.4.2 require github.com/gorilla/websocket v1.4.2

View File

@@ -1,4 +1,4 @@
package logger package log
import ( import (
"errors" "errors"
@@ -147,6 +147,19 @@ func Tracef(format string, args ...interface{}) {
createLog(e) createLog(e)
} }
// Trace prints out logs on trace level with newline
func Traceln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(2),
Level: "TRACE",
level: LTrace,
}
createLog(e)
}
// Debug prints out logs on debug level // Debug prints out logs on debug level
func Debug(args ...interface{}) { func Debug(args ...interface{}) {
output := fmt.Sprint(args...) output := fmt.Sprint(args...)
@@ -173,6 +186,19 @@ func Debugf(format string, args ...interface{}) {
createLog(e) createLog(e)
} }
// Debug prints out logs on debug level with a newline
func Debugln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
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{}) {
output := fmt.Sprint(args...) output := fmt.Sprint(args...)
@@ -199,6 +225,58 @@ func Infof(format string, args ...interface{}) {
createLog(e) createLog(e)
} }
// Info prints out logs on info level with a newline
func Infoln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(2),
Level: "INFO",
level: LInfo,
}
createLog(e)
}
// Info prints out logs on info level
func Notice(args ...interface{}) {
output := fmt.Sprint(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(2),
Level: "NOTICE",
level: LNotice,
}
createLog(e)
}
// Formatted print for Info
func Noticef(format string, args ...interface{}) {
output := fmt.Sprintf(format, args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(2),
Level: "NOTICE",
level: LNotice,
}
createLog(e)
}
// Info prints out logs on info level with a newline
func Noticeln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(2),
Level: "NOTICE",
level: LNotice,
}
createLog(e)
}
// Warn prints out logs on warn level // Warn prints out logs on warn level
func Warn(args ...interface{}) { func Warn(args ...interface{}) {
output := fmt.Sprint(args...) output := fmt.Sprint(args...)
@@ -225,6 +303,19 @@ func Warnf(format string, args ...interface{}) {
createLog(e) createLog(e)
} }
// Newline print for Warn
func Warnln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
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{}) {
output := fmt.Sprint(args...) output := fmt.Sprint(args...)
@@ -251,6 +342,19 @@ func Errorf(format string, args ...interface{}) {
createLog(e) createLog(e)
} }
// Error prints out logs on error level with a newline
func Errorln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(2),
Level: "ERROR",
level: LError,
}
createLog(e)
}
// Panic prints out logs on panic level // Panic prints out logs on panic level
func Panic(args ...interface{}) { func Panic(args ...interface{}) {
output := fmt.Sprint(args...) output := fmt.Sprint(args...)
@@ -297,6 +401,28 @@ func Panicf(format string, args ...interface{}) {
panic(errors.New(output)) panic(errors.New(output))
} }
func Panicln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
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
}
}
Flush()
panic(errors.New(output))
}
// Fatal prints out logs on fatal level // Fatal prints out logs on fatal level
func Fatal(args ...interface{}) { func Fatal(args ...interface{}) {
output := fmt.Sprint(args...) output := fmt.Sprint(args...)
@@ -327,6 +453,32 @@ func Fatalf(format string, args ...interface{}) {
os.Exit(1) os.Exit(1)
} }
func Fatalln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(2),
Level: "FATAL",
level: LFatal,
}
createLog(e)
Flush()
os.Exit(1)
}
func Print(args ...interface{}) {
Info(args...)
}
func Printf(format string, args ...interface{}) {
Infof(format, args...)
}
func Println(args ...interface{}) {
Infoln(args...)
}
// fileInfo for getting which line in which file // fileInfo for getting which line in which file
func fileInfo(skip int) string { func fileInfo(skip int) string {
_, file, line, ok := runtime.Caller(skip) _, file, line, ok := runtime.Caller(skip)

View File

@@ -1,4 +1,4 @@
package logger package log
import ( import (
"strconv" "strconv"
@@ -86,6 +86,15 @@ func TestInfo(t *testing.T) {
// } // }
} }
// Print prints out logs on info level
func TestPrint(t *testing.T) {
// if logLevel >= LInfo {
// entry := logger.WithFields(logrus.Fields{})
// entry.Data["file"] = fileInfo(2)
// entry.Info(args...)
// }
}
// Warn prints out logs on warn level // Warn prints out logs on warn level
func TestWarn(t *testing.T) { func TestWarn(t *testing.T) {
// if logLevel >= LWarn { // if logLevel >= LWarn {
@@ -121,6 +130,7 @@ func TestPanic(t *testing.T) {
// entry.Panic(args...) // entry.Panic(args...)
// } // }
} }
func TestFlush(t *testing.T) { func TestFlush(t *testing.T) {
defer Flush() defer Flush()
} }

362
log/logger.go Normal file
View File

@@ -0,0 +1,362 @@
package log
import (
"errors"
"fmt"
"os"
"time"
)
func (l *Logger) SetInfoDepth(depth int) {
l.FileInfoDepth = depth
}
// Trace prints out logs on trace level
func (l Logger) Trace(args ...interface{}) {
output := fmt.Sprint(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "TRACE",
level: LTrace,
}
createLog(e)
}
// Formatted print for Trace
func (l Logger) Tracef(format string, args ...interface{}) {
output := fmt.Sprintf(format, args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "TRACE",
level: LTrace,
}
createLog(e)
}
// Trace prints out logs on trace level with newline
func (l Logger) Traceln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "TRACE",
level: LTrace,
}
createLog(e)
}
// Debug prints out logs on debug level
func (l Logger) Debug(args ...interface{}) {
output := fmt.Sprint(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "DEBUG",
level: LDebug,
}
createLog(e)
}
// Formatted print for Debug
func (l Logger) Debugf(format string, args ...interface{}) {
output := fmt.Sprintf(format, args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "DEBUG",
level: LDebug,
}
createLog(e)
}
// Info prints out logs on info level
func (l Logger) Info(args ...interface{}) {
output := fmt.Sprint(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "INFO",
level: LInfo,
}
createLog(e)
}
// Formatted print for Info
func (l Logger) Infof(format string, args ...interface{}) {
output := fmt.Sprintf(format, args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "INFO",
level: LInfo,
}
createLog(e)
}
// Info prints out logs on info level with newline
func (l Logger) Infoln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "INFO",
level: LInfo,
}
createLog(e)
}
// Notice prints out logs on notice level
func (l Logger) Notice(args ...interface{}) {
output := fmt.Sprint(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "NOTICE",
level: LNotice,
}
createLog(e)
}
// Formatted print for Notice
func (l Logger) Noticef(format string, args ...interface{}) {
output := fmt.Sprintf(format, args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "NOTICE",
level: LNotice,
}
createLog(e)
}
// Notice prints out logs on notice level with newline
func (l Logger) Noticeln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "NOTICE",
level: LNotice,
}
createLog(e)
}
// Warn prints out logs on warn level
func (l Logger) Warn(args ...interface{}) {
output := fmt.Sprint(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "WARN",
level: LWarn,
}
createLog(e)
}
// Formatted print for Warn
func (l Logger) Warnf(format string, args ...interface{}) {
output := fmt.Sprintf(format, args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "WARN",
level: LWarn,
}
createLog(e)
}
// Warn prints out logs on warn level with a newline
func (l Logger) Warnln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "WARN",
level: LWarn,
}
createLog(e)
}
// Error prints out logs on error level
func (l Logger) Error(args ...interface{}) {
output := fmt.Sprint(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "ERROR",
level: LError,
}
createLog(e)
}
// Formatted print for error
func (l Logger) Errorf(format string, args ...interface{}) {
output := fmt.Sprintf(format, args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "ERROR",
level: LError,
}
createLog(e)
}
// Error prints out logs on error level with a new line
func (l Logger) Errorln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "ERROR",
level: LError,
}
createLog(e)
}
// Panic prints out logs on panic level
func (l Logger) Panic(args ...interface{}) {
output := fmt.Sprint(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
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
}
}
Flush()
panic(errors.New(output))
}
// Formatted print for panic
func (l Logger) Panicf(format string, args ...interface{}) {
output := fmt.Sprintf(format, args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
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
}
}
Flush()
panic(errors.New(output))
}
// Panic prints out logs on panic level with a newline
func (l Logger) Panicln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
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
}
}
Flush()
panic(errors.New(output))
}
// Fatal prints out logs on fatal level
func (l Logger) Fatal(args ...interface{}) {
output := fmt.Sprint(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "FATAL",
level: LFatal,
}
createLog(e)
Flush()
os.Exit(1)
}
// Formatted print for fatal
func (l Logger) Fatalf(format string, args ...interface{}) {
output := fmt.Sprintf(format, args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "FATAL",
level: LFatal,
}
createLog(e)
Flush()
os.Exit(1)
}
// Fatal prints fatal level with a new line
func (l Logger) Fatalln(args ...interface{}) {
output := fmt.Sprintln(args...)
e := Entry{
Timestamp: time.Now(),
Output: output,
File: fileInfo(l.FileInfoDepth),
Level: "FATAL",
level: LFatal,
}
createLog(e)
Flush()
os.Exit(1)
}
// Handles print to info
func (l Logger) Print(args ...interface{}) {
l.Info(args...)
}
// Handles formatted print to info
func (l Logger) Printf(format string, args ...interface{}) {
l.Infof(format, args...)
}
// Handles print to info with new line
func (l Logger) Println(args ...interface{}) {
l.Infoln(args...)
}

View File

@@ -1,4 +1,4 @@
package logger package log
import "time" import "time"
@@ -9,6 +9,7 @@ const (
LTrace Level = iota LTrace Level = iota
LDebug LDebug
LInfo LInfo
LNotice
LWarn LWarn
LError LError
LPanic LPanic
@@ -28,3 +29,7 @@ type Entry struct {
Level string `json:"level"` Level string `json:"level"`
level Level level Level
} }
type Logger struct {
FileInfoDepth int
}

View File

@@ -6,7 +6,7 @@ import (
"time" "time"
"github.com/taigrr/log-socket/browser" "github.com/taigrr/log-socket/browser"
"github.com/taigrr/log-socket/logger" logger "github.com/taigrr/log-socket/log"
"github.com/taigrr/log-socket/ws" "github.com/taigrr/log-socket/ws"
) )

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/taigrr/log-socket/logger" logger "github.com/taigrr/log-socket/log"
) )
// var addr = flag.String("addr", "localhost:8080", "http service address") // var addr = flag.String("addr", "localhost:8080", "http service address")