forked from forgejo/forgejo
Pause, Resume, Release&Reopen, Add and Remove Logging from command line (#11777)
* Make LogDescriptions race safe * Add manager commands for pausing, resuming, adding and removing loggers Signed-off-by: Andrew Thornton <art27@cantab.net> * Placate lint * Ensure that file logger is run! * Add support for smtp and conn Signed-off-by: Andrew Thornton <art27@cantab.net> * Add release-and-reopen Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: techknowlogick <techknowlogick@gitea.io> Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
parent
38fb087d19
commit
c5b08f6d5a
17 changed files with 924 additions and 17 deletions
|
@ -29,6 +29,7 @@ type EventLogger interface {
|
|||
GetLevel() Level
|
||||
GetStacktraceLevel() Level
|
||||
GetName() string
|
||||
ReleaseReopen() error
|
||||
}
|
||||
|
||||
// ChannelledLog represents a cached channel to a LoggerProvider
|
||||
|
@ -117,6 +118,11 @@ func (l *ChannelledLog) Flush() {
|
|||
l.flush <- true
|
||||
}
|
||||
|
||||
// ReleaseReopen this ChannelledLog
|
||||
func (l *ChannelledLog) ReleaseReopen() error {
|
||||
return l.loggerProvider.ReleaseReopen()
|
||||
}
|
||||
|
||||
// GetLevel gets the level of this ChannelledLog
|
||||
func (l *ChannelledLog) GetLevel() Level {
|
||||
return l.loggerProvider.GetLevel()
|
||||
|
@ -145,6 +151,7 @@ type MultiChannelledLog struct {
|
|||
level Level
|
||||
stacktraceLevel Level
|
||||
closed chan bool
|
||||
paused chan bool
|
||||
}
|
||||
|
||||
// NewMultiChannelledLog a new logger instance with given logger provider and config.
|
||||
|
@ -159,6 +166,7 @@ func NewMultiChannelledLog(name string, bufferLength int64) *MultiChannelledLog
|
|||
stacktraceLevel: NONE,
|
||||
close: make(chan bool),
|
||||
closed: make(chan bool),
|
||||
paused: make(chan bool),
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
@ -229,6 +237,33 @@ func (m *MultiChannelledLog) closeLoggers() {
|
|||
m.closed <- true
|
||||
}
|
||||
|
||||
// Pause pauses this Logger
|
||||
func (m *MultiChannelledLog) Pause() {
|
||||
m.paused <- true
|
||||
}
|
||||
|
||||
// Resume resumes this Logger
|
||||
func (m *MultiChannelledLog) Resume() {
|
||||
m.paused <- false
|
||||
}
|
||||
|
||||
// ReleaseReopen causes this logger to tell its subloggers to release and reopen
|
||||
func (m *MultiChannelledLog) ReleaseReopen() error {
|
||||
m.mutex.Lock()
|
||||
defer m.mutex.Unlock()
|
||||
var accumulatedErr error
|
||||
for _, logger := range m.loggers {
|
||||
if err := logger.ReleaseReopen(); err != nil {
|
||||
if accumulatedErr == nil {
|
||||
accumulatedErr = fmt.Errorf("Error whilst reopening: %s Error: %v", logger.GetName(), err)
|
||||
} else {
|
||||
accumulatedErr = fmt.Errorf("Error whilst reopening: %s Error: %v & %v", logger.GetName(), err, accumulatedErr)
|
||||
}
|
||||
}
|
||||
}
|
||||
return accumulatedErr
|
||||
}
|
||||
|
||||
// Start processing the MultiChannelledLog
|
||||
func (m *MultiChannelledLog) Start() {
|
||||
m.mutex.Lock()
|
||||
|
@ -238,8 +273,35 @@ func (m *MultiChannelledLog) Start() {
|
|||
}
|
||||
m.started = true
|
||||
m.mutex.Unlock()
|
||||
paused := false
|
||||
for {
|
||||
if paused {
|
||||
select {
|
||||
case paused = <-m.paused:
|
||||
if !paused {
|
||||
m.ResetLevel()
|
||||
}
|
||||
case _, ok := <-m.flush:
|
||||
if !ok {
|
||||
m.closeLoggers()
|
||||
return
|
||||
}
|
||||
m.mutex.Lock()
|
||||
for _, logger := range m.loggers {
|
||||
logger.Flush()
|
||||
}
|
||||
m.mutex.Unlock()
|
||||
case <-m.close:
|
||||
m.closeLoggers()
|
||||
return
|
||||
}
|
||||
continue
|
||||
}
|
||||
select {
|
||||
case paused = <-m.paused:
|
||||
if paused && m.level < INFO {
|
||||
m.level = INFO
|
||||
}
|
||||
case event, ok := <-m.queue:
|
||||
if !ok {
|
||||
m.closeLoggers()
|
||||
|
@ -275,7 +337,7 @@ func (m *MultiChannelledLog) LogEvent(event *Event) error {
|
|||
select {
|
||||
case m.queue <- event:
|
||||
return nil
|
||||
case <-time.After(60 * time.Second):
|
||||
case <-time.After(100 * time.Millisecond):
|
||||
// We're blocked!
|
||||
return ErrTimeout{
|
||||
Name: m.name,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue