mirror of
				https://github.com/nabbar/golib.git
				synced 2025-10-31 19:12:35 +08:00 
			
		
		
		
	 f31950daef
			
		
	
	f31950daef
	
	
	
		
			
			- Rework logger - Remove deprecated functions - Split Logger to sub package (fields, level, config, ...) - Optimize dependencies - Rework Hookfile: fix error like FD still opened - Rework Hooksyslog: use same model like Hookfile, use network/protocol instead of self lib - Rework HookStd: use independent hook for std out & std err - Fix std config make generic options for files & syslog - Apply formatter to hook instead of main logger entry - optimize code Package ioutils: - rework PathCheckCreate funct: optimize code & fix some error Package Network: - create sub package protocol for all network protocl use - add encode function Package httpcli: - remove file network - use package network/protocol instead of network file Package archive: - apply change following rework of logger Package aws: - apply change following rework of logger Package cluster: - apply change following rework of logger Package cobra: - apply change following rework of logger Package Config Component: - apply change following rework of logger to component log - fix logger for monitoring - fix component following fix of package request / monitoring Package context: - apply change following rework of logger Package database: - apply change following rework of logger Package httpserver: - apply change following rework of logger Package ldap: - apply change following rework of logger Package monitor: - apply change following rework of logger - fix logger for monitoring - fix minor bugs Package nats: - apply change following rework of logger Package nutsdb: - apply change following rework of logger Package request: - apply change following rework of logger - fix minor bug - fix missing logger for monitoring - add one line for healthcheck (info or error) Package router: - apply change following rework of logger Package static: - apply change following rework of logger Package status: - apply change following rework of logger - fix bug with mandatory component Package viper: - apply change following rework of logger Other: - bump dependencies - github action workflow fix
		
			
				
	
	
		
			216 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /***********************************************************************************************************************
 | |
|  *
 | |
|  *   MIT License
 | |
|  *
 | |
|  *   Copyright (c) 2021 Nicolas JUHEL
 | |
|  *
 | |
|  *   Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
|  *   of this software and associated documentation files (the "Software"), to deal
 | |
|  *   in the Software without restriction, including without limitation the rights
 | |
|  *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
|  *   copies of the Software, and to permit persons to whom the Software is
 | |
|  *   furnished to do so, subject to the following conditions:
 | |
|  *
 | |
|  *   The above copyright notice and this permission notice shall be included in all
 | |
|  *   copies or substantial portions of the Software.
 | |
|  *
 | |
|  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|  *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|  *   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |
|  *   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
|  *   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |
|  *   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | |
|  *   SOFTWARE.
 | |
|  *
 | |
|  *
 | |
|  **********************************************************************************************************************/
 | |
| 
 | |
| package logger_test
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"path/filepath"
 | |
| 	"time"
 | |
| 
 | |
| 	liblog "github.com/nabbar/golib/logger"
 | |
| 	logcfg "github.com/nabbar/golib/logger/config"
 | |
| 	logfld "github.com/nabbar/golib/logger/fields"
 | |
| 	loglvl "github.com/nabbar/golib/logger/level"
 | |
| 	libsem "github.com/nabbar/golib/semaphore"
 | |
| 	. "github.com/onsi/ginkgo/v2"
 | |
| 	. "github.com/onsi/gomega"
 | |
| )
 | |
| 
 | |
| func getLogFileTemp() string {
 | |
| 	fsp, err := GetTempFile()
 | |
| 	Expect(err).ToNot(HaveOccurred())
 | |
| 
 | |
| 	defer func() {
 | |
| 		err = DelTempFile(fsp)
 | |
| 		Expect(err).ToNot(HaveOccurred())
 | |
| 	}()
 | |
| 
 | |
| 	return filepath.Base(fsp)
 | |
| }
 | |
| 
 | |
| var _ = Describe("Logger", func() {
 | |
| 	Context("Create New Logger with Default Config", func() {
 | |
| 		It("Must succeed", func() {
 | |
| 			log := liblog.New(GetContext)
 | |
| 			defer func() {
 | |
| 				Expect(log.Close()).ToNot(HaveOccurred())
 | |
| 			}()
 | |
| 			log.SetLevel(loglvl.DebugLevel)
 | |
| 			err := log.SetOptions(&logcfg.Options{
 | |
| 				Stdout: &logcfg.OptionsStd{},
 | |
| 			})
 | |
| 			Expect(err).ToNot(HaveOccurred())
 | |
| 			log.LogDetails(loglvl.InfoLevel, "test logger", nil, nil, nil)
 | |
| 		})
 | |
| 	})
 | |
| 	Context("Create New Logger with Default Config and trace", func() {
 | |
| 		It("Must succeed", func() {
 | |
| 			log := liblog.New(GetContext)
 | |
| 			defer func() {
 | |
| 				Expect(log.Close()).ToNot(HaveOccurred())
 | |
| 			}()
 | |
| 			log.SetLevel(loglvl.DebugLevel)
 | |
| 			err := log.SetOptions(&logcfg.Options{
 | |
| 				Stdout: &logcfg.OptionsStd{
 | |
| 					EnableTrace: true,
 | |
| 				},
 | |
| 			})
 | |
| 			Expect(err).ToNot(HaveOccurred())
 | |
| 			log.LogDetails(loglvl.InfoLevel, "test logger with trace", nil, nil, nil)
 | |
| 		})
 | |
| 	})
 | |
| 	Context("Create New Logger with field", func() {
 | |
| 		It("Must succeed", func() {
 | |
| 			log := liblog.New(GetContext)
 | |
| 			defer func() {
 | |
| 				Expect(log.Close()).ToNot(HaveOccurred())
 | |
| 			}()
 | |
| 			log.SetLevel(loglvl.DebugLevel)
 | |
| 			err := log.SetOptions(&logcfg.Options{
 | |
| 				Stdout: &logcfg.OptionsStd{
 | |
| 					EnableTrace: true,
 | |
| 				},
 | |
| 			})
 | |
| 			log.SetFields(logfld.New(GetContext).Add("test-field", "ok"))
 | |
| 			Expect(err).ToNot(HaveOccurred())
 | |
| 			log.LogDetails(loglvl.InfoLevel, "test logger with field", nil, nil, nil)
 | |
| 		})
 | |
| 	})
 | |
| 	Context("Create New Logger with file", func() {
 | |
| 		It("Must succeed", func() {
 | |
| 			log := liblog.New(GetContext)
 | |
| 			defer func() {
 | |
| 				Expect(log.Close()).ToNot(HaveOccurred())
 | |
| 			}()
 | |
| 			log.SetLevel(loglvl.DebugLevel)
 | |
| 
 | |
| 			fsp, err := GetTempFile()
 | |
| 
 | |
| 			defer func() {
 | |
| 				err = DelTempFile(fsp)
 | |
| 				Expect(err).ToNot(HaveOccurred())
 | |
| 			}()
 | |
| 
 | |
| 			Expect(err).ToNot(HaveOccurred())
 | |
| 
 | |
| 			err = log.SetOptions(&logcfg.Options{
 | |
| 				Stdout: &logcfg.OptionsStd{
 | |
| 					EnableTrace: true,
 | |
| 				},
 | |
| 				LogFile: []logcfg.OptionsFile{
 | |
| 					{
 | |
| 						LogLevel:         nil,
 | |
| 						Filepath:         fsp,
 | |
| 						Create:           true,
 | |
| 						CreatePath:       true,
 | |
| 						DisableStack:     false,
 | |
| 						DisableTimestamp: false,
 | |
| 						EnableTrace:      true,
 | |
| 					},
 | |
| 				},
 | |
| 			})
 | |
| 			Expect(err).ToNot(HaveOccurred())
 | |
| 
 | |
| 			log.SetFields(logfld.New(GetContext).Add("test-field", "ok"))
 | |
| 			log.LogDetails(loglvl.InfoLevel, "test logger with field", nil, nil, nil)
 | |
| 		})
 | |
| 	})
 | |
| 	Context("Create New Logger with file in multithreading mode", func() {
 | |
| 		It("Must succeed", func() {
 | |
| 			log := liblog.New(GetContext)
 | |
| 			defer func() {
 | |
| 				Expect(log.Close()).ToNot(HaveOccurred())
 | |
| 			}()
 | |
| 			log.SetLevel(loglvl.DebugLevel)
 | |
| 
 | |
| 			fsp, err := GetTempFile()
 | |
| 
 | |
| 			defer func() {
 | |
| 				err = DelTempFile(fsp)
 | |
| 				Expect(err).ToNot(HaveOccurred())
 | |
| 			}()
 | |
| 
 | |
| 			Expect(err).ToNot(HaveOccurred())
 | |
| 
 | |
| 			err = log.SetOptions(&logcfg.Options{
 | |
| 				Stdout: &logcfg.OptionsStd{
 | |
| 					EnableTrace: true,
 | |
| 				},
 | |
| 				LogFile: []logcfg.OptionsFile{
 | |
| 					{
 | |
| 						LogLevel:         nil,
 | |
| 						Filepath:         fsp,
 | |
| 						Create:           true,
 | |
| 						CreatePath:       true,
 | |
| 						DisableStack:     false,
 | |
| 						DisableTimestamp: false,
 | |
| 						EnableTrace:      true,
 | |
| 					},
 | |
| 				},
 | |
| 			})
 | |
| 			Expect(err).ToNot(HaveOccurred())
 | |
| 
 | |
| 			log.SetFields(logfld.New(GetContext).Add("test-field", "ok"))
 | |
| 			log.LogDetails(loglvl.InfoLevel, "test logger with field", nil, nil, nil)
 | |
| 
 | |
| 			var sub liblog.Logger
 | |
| 			sub = log.Clone()
 | |
| 
 | |
| 			go func(log liblog.Logger) {
 | |
| 				defer func() {
 | |
| 					se := log.Close()
 | |
| 					Expect(se).ToNot(HaveOccurred())
 | |
| 				}()
 | |
| 
 | |
| 				log.SetFields(logfld.New(GetContext).Add("logger", "sub"))
 | |
| 				for i := 0; i < 10; i++ {
 | |
| 					log.Entry(loglvl.InfoLevel, "test multithreading logger").FieldAdd("id", i).Log()
 | |
| 				}
 | |
| 			}(sub)
 | |
| 
 | |
| 			log.SetFields(logfld.New(GetContext).Add("logger", "main"))
 | |
| 			sem := libsem.NewSemaphoreWithContext(context.Background(), 0)
 | |
| 			defer sem.DeferMain()
 | |
| 
 | |
| 			for i := 0; i < 25; i++ {
 | |
| 				Expect(sem.NewWorker()).ToNot(HaveOccurred())
 | |
| 
 | |
| 				go func(id int) {
 | |
| 					defer sem.DeferWorker()
 | |
| 					ent := log.Entry(loglvl.InfoLevel, "test multithreading logger")
 | |
| 					ent.FieldAdd("id", id)
 | |
| 					ent.Log()
 | |
| 				}(i)
 | |
| 			}
 | |
| 
 | |
| 			Expect(sem.WaitAll()).ToNot(HaveOccurred())
 | |
| 			time.Sleep(100 * time.Millisecond)
 | |
| 		})
 | |
| 	})
 | |
| })
 |