@@ -12,6 +12,7 @@ import (
1212 "github.com/rs/zerolog"
1313
1414 "github.com/ARM-software/golang-utils/utils/commonerrors"
15+ "github.com/ARM-software/golang-utils/utils/parallelisation"
1516)
1617
1718// JSONLoggers defines a JSON logger
@@ -22,6 +23,7 @@ type JSONLoggers struct {
2223 loggerSource string
2324 writer WriterWithSource
2425 zerologger zerolog.Logger
26+ closerStore * parallelisation.CloserStore
2527}
2628
2729func (l * JSONLoggers ) SetLogSource (source string ) error {
@@ -88,16 +90,31 @@ func (l *JSONLoggers) LogError(err ...interface{}) {
8890func (l * JSONLoggers ) Close () error {
8991 l .mu .Lock ()
9092 defer l .mu .Unlock ()
91- return l .writer .Close ()
93+ return l .closerStore .Close ()
9294}
9395
9496// NewJSONLogger creates a Json logger.
95- func NewJSONLogger (writer WriterWithSource , loggerSource string , source string ) (loggers Loggers , err error ) {
97+ func NewJSONLogger (writer WriterWithSource , loggerSource string , source string ) (Loggers , error ) {
98+ return newJSONLogger (true , writer , loggerSource , source )
99+ }
100+
101+ // NewJSONLogger creates a Json logger. It is similar to NewJSONLogger but does not close the writer on Close().
102+ func NewJSONLoggerWithWriter (writer WriterWithSource , loggerSource string , source string ) (Loggers , error ) {
103+ return newJSONLogger (false , writer , loggerSource , source )
104+ }
105+
106+ func newJSONLogger (closeWriterOnClose bool , writer WriterWithSource , loggerSource string , source string ) (loggers Loggers , err error ) {
107+ closeStore := parallelisation .NewCloserStore (false )
108+ if closeWriterOnClose {
109+ closeStore .RegisterCloser (writer )
110+ }
111+
96112 zerroLogger := JSONLoggers {
97113 source : source ,
98114 loggerSource : loggerSource ,
99115 writer : writer ,
100116 zerologger : zerolog .New (writer ),
117+ closerStore : closeStore ,
101118 }
102119 err = zerroLogger .Check ()
103120 if err != nil {
@@ -112,8 +129,8 @@ func NewJSONLogger(writer WriterWithSource, loggerSource string, source string)
112129 return
113130}
114131
115- // NewJSONLoggerForSlowWriter creates a lock free, non blocking & thread safe logger
116- // wrapped around slowWriter
132+ // NewJSONLoggerForSlowWriter creates a lock free, non- blocking & thread safe logger
133+ // wrapped around slowWriter. The slowWriter is closed on Close.
117134//
118135// params:
119136// slowWriter : writer used to write data streams
@@ -126,3 +143,18 @@ func NewJSONLogger(writer WriterWithSource, loggerSource string, source string)
126143func NewJSONLoggerForSlowWriter (slowWriter WriterWithSource , ringBufferSize int , pollInterval time.Duration , loggerSource string , source string , droppedMessagesLogger Loggers ) (loggers Loggers , err error ) {
127144 return NewJSONLogger (NewDiodeWriterForSlowWriter (slowWriter , ringBufferSize , pollInterval , droppedMessagesLogger ), loggerSource , source )
128145}
146+
147+ // NewJSONLoggerForSlowWriterWithoutClosingWriter creates a lock free, non-blocking & thread safe logger
148+ // wrapped around slowWriter. It is similar to NewJSONLoggerForSlowWriter but does not close the writer on Close().
149+ //
150+ // params:
151+ // slowWriter : writer used to write data streams
152+ // ringBufferSize : size of ring buffer used to receive messages
153+ // pollInterval : polling duration to check buffer content
154+ // loggerSource : logger application name
155+ // source : source string
156+ // droppedMessagesLogger : logger for dropped messages
157+ // If pollInterval is greater than 0, a poller is used otherwise a waiter is used.
158+ func NewJSONLoggerForSlowWriterWithoutClosingWriter (slowWriter WriterWithSource , ringBufferSize int , pollInterval time.Duration , loggerSource string , source string , droppedMessagesLogger Loggers ) (loggers Loggers , err error ) {
159+ return NewJSONLogger (NewDiodeWriterForSlowWriterWithoutClosing (slowWriter , ringBufferSize , pollInterval , droppedMessagesLogger ), loggerSource , source )
160+ }
0 commit comments