mirror of https://github.com/authelia/authelia.git
97 lines
1.6 KiB
Go
97 lines
1.6 KiB
Go
package logging
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
func NewFile(name string) *File {
|
|
return &File{
|
|
mu: sync.Mutex{},
|
|
name: name,
|
|
}
|
|
}
|
|
|
|
type File struct {
|
|
mu sync.Mutex
|
|
file *os.File
|
|
name string
|
|
}
|
|
|
|
// Open or reopen the file.
|
|
func (f *File) Open() (err error) {
|
|
f.mu.Lock()
|
|
|
|
defer f.mu.Unlock()
|
|
|
|
if f.file != nil {
|
|
return fmt.Errorf("error opening log file: file is already open")
|
|
}
|
|
|
|
var file *os.File
|
|
|
|
if file, err = os.OpenFile(FormatFilePath(f.name, time.Now()), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600); err != nil {
|
|
return fmt.Errorf("error opening log file: %w", err)
|
|
}
|
|
|
|
f.file = file
|
|
|
|
return nil
|
|
}
|
|
|
|
func (f *File) Reopen() (err error) {
|
|
f.mu.Lock()
|
|
|
|
defer f.mu.Unlock()
|
|
|
|
if f.file == nil {
|
|
return fmt.Errorf("error reopening log file: file isn't open")
|
|
}
|
|
|
|
if err = f.file.Close(); err != nil {
|
|
return fmt.Errorf("error reopning log file: error closing current log file: %w", err)
|
|
}
|
|
|
|
f.file = nil
|
|
|
|
var file *os.File
|
|
|
|
if file, err = os.OpenFile(FormatFilePath(f.name, time.Now()), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600); err != nil {
|
|
return fmt.Errorf("error reopning log file: error opening new log file: %w", err)
|
|
}
|
|
|
|
f.file = file
|
|
|
|
return nil
|
|
}
|
|
|
|
// Close the file.
|
|
func (f *File) Close() (err error) {
|
|
f.mu.Lock()
|
|
|
|
defer f.mu.Unlock()
|
|
|
|
if err = f.file.Close(); err != nil {
|
|
return fmt.Errorf("error closing log file: error closing current log file: %w", err)
|
|
}
|
|
|
|
f.file = nil
|
|
|
|
return nil
|
|
}
|
|
|
|
// Write to the file.
|
|
func (f *File) Write(b []byte) (n int, err error) {
|
|
f.mu.Lock()
|
|
|
|
defer f.mu.Unlock()
|
|
|
|
if f.file == nil {
|
|
return 0, fmt.Errorf("error writing log file: file is not open")
|
|
}
|
|
|
|
return f.file.Write(b)
|
|
}
|