mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-20 07:26:46 +00:00
* First pass at adding new logging system * NewLogger * NewLogger * WIP * silly bug fix * :D removed files * removed old logging interface * added tests * added tests * Started to add new lines to all f calls * Added subsystem log types * Logger improvements * Further performance improvements * changes to logger and sublogger creation * Renamed Logging types * removed old print statement * changes based on feedback * moved sublogger types to own file * :) * added console as output type * added get level command * added get/set log level via grpc command * added check for output being empty for migration support * first pass at log rotation * added log rotation * :D derp fixed * added tests * changes based on feedback * changed log type * comments * renamed file -> fileSettings * typo fix * changes based on feedback * gofmt ran on additional files * gofmt ran on additional files
76 lines
1.4 KiB
Go
76 lines
1.4 KiB
Go
package logger
|
|
|
|
import (
|
|
"io"
|
|
)
|
|
|
|
// Add appends a new writer to the multiwriter slice
|
|
func (mw *multiWriter) Add(writer io.Writer) {
|
|
mw.mu.Lock()
|
|
mw.writers = append(mw.writers, writer)
|
|
mw.mu.Unlock()
|
|
}
|
|
|
|
// Remove removes exisiting writer from multiwriter slice
|
|
func (mw *multiWriter) Remove(writer io.Writer) {
|
|
mw.mu.Lock()
|
|
|
|
var removeIDs []int
|
|
for i := range mw.writers {
|
|
if mw.writers[i] == writer {
|
|
removeIDs = append(removeIDs, i)
|
|
}
|
|
}
|
|
|
|
for x := range removeIDs {
|
|
mw.writers[x] = mw.writers[len(mw.writers)-1]
|
|
mw.writers[len(mw.writers)-1] = nil
|
|
mw.writers = mw.writers[:len(mw.writers)-1]
|
|
}
|
|
|
|
mw.mu.Unlock()
|
|
}
|
|
|
|
// Write concurrent safe Write for each writer
|
|
func (mw *multiWriter) Write(p []byte) (n int, err error) {
|
|
type data struct {
|
|
n int
|
|
err error
|
|
}
|
|
|
|
results := make(chan data)
|
|
|
|
for _, wr := range mw.writers {
|
|
go func(w io.Writer, p []byte, ch chan data) {
|
|
n, err = w.Write(p)
|
|
if err != nil {
|
|
ch <- data{n, err}
|
|
return
|
|
}
|
|
if n != len(p) {
|
|
ch <- data{n, io.ErrShortWrite}
|
|
return
|
|
}
|
|
select {
|
|
case ch <- data{n, nil}:
|
|
default:
|
|
}
|
|
}(wr, p, results)
|
|
}
|
|
|
|
for range mw.writers {
|
|
d := <-results
|
|
if d.err != nil {
|
|
return d.n, d.err
|
|
}
|
|
}
|
|
return len(p), nil
|
|
}
|
|
|
|
// MultiWriter make and return a new copy of multiWriter
|
|
func MultiWriter(writers ...io.Writer) io.Writer {
|
|
w := make([]io.Writer, len(writers))
|
|
copy(w, writers)
|
|
return &multiWriter{writers: w}
|
|
}
|