1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-05 00:26:23 -07:00
gochan/pkg/gcutil/logger.go

177 lines
3.3 KiB
Go
Raw Normal View History

package gcutil
import (
2024-01-24 10:37:28 -08:00
"io"
2023-10-19 11:42:01 -07:00
"io/fs"
"net/http"
"os"
2022-12-31 17:29:57 -08:00
"path"
"time"
"github.com/rs/zerolog"
)
2023-10-19 11:42:01 -07:00
const (
logFlags = os.O_CREATE | os.O_APPEND | os.O_WRONLY
logFileMode fs.FileMode = 0644
)
var (
2023-10-19 11:42:01 -07:00
logFile *os.File
accessFile *os.File
logger zerolog.Logger
accessLogger zerolog.Logger
)
func LogStr(key, val string, events ...*zerolog.Event) {
for e := range events {
if events[e] != nil {
events[e] = events[e].Str(key, val)
}
}
}
func LogInt(key string, i int, events ...*zerolog.Event) {
for e := range events {
if events[e] != nil {
events[e] = events[e].Int(key, i)
}
}
}
func LogBool(key string, b bool, events ...*zerolog.Event) {
for e := range events {
if events[e] != nil {
events[e] = events[e].Bool(key, b)
}
}
}
func LogTime(key string, t time.Time, events ...*zerolog.Event) {
for e := range events {
if events[e] != nil {
events[e] = events[e].Time(key, t)
}
}
}
func LogDiscard(events ...*zerolog.Event) {
for e := range events {
if events[e] == nil {
continue
}
events[e] = events[e].Discard()
}
}
2024-01-24 10:37:28 -08:00
// isTerminal returns true if the ModeCharDevice bit is set, meaning that
// gochan is probably running in a standard terminal and not being piped
// to a file
func isTerminal() bool {
fi, err := os.Stdout.Stat()
if err != nil {
return false
}
return (fi.Mode() & os.ModeCharDevice) == os.ModeCharDevice
}
func initLog(logPath string, logToConsole bool) (err error) {
if logFile != nil {
// log already initialized
if err = logFile.Close(); err != nil {
return err
}
}
2023-10-19 11:42:01 -07:00
logFile, err = os.OpenFile(logPath, logFlags, logFileMode) // skipcq: GSC-G302
if err != nil {
return err
}
2024-01-24 10:37:28 -08:00
var writer io.Writer
if logToConsole {
cw := zerolog.NewConsoleWriter()
cw.NoColor = !isTerminal()
writer = zerolog.MultiLevelWriter(logFile, cw)
} else {
2024-01-24 10:37:28 -08:00
writer = logFile
}
2024-01-24 10:37:28 -08:00
logger = zerolog.New(writer).With().Timestamp().Logger()
return nil
}
2023-10-19 11:42:01 -07:00
func initAccessLog(logPath string) (err error) {
if accessFile != nil {
// access log already initialized, close it first before reopening
if err = accessFile.Close(); err != nil {
return err
}
}
2023-10-19 11:42:01 -07:00
accessFile, err = os.OpenFile(logPath, logFlags, logFileMode) // skipcq: GSC-G302
if err != nil {
return err
}
2023-10-19 11:42:01 -07:00
accessLogger = zerolog.New(accessFile).With().Timestamp().Logger()
return nil
}
func InitLogs(logDir string, verbose bool, uid int, gid int) (err error) {
if err = initLog(path.Join(logDir, "gochan.log"), verbose); err != nil {
2022-12-31 17:29:57 -08:00
return err
}
if err = logFile.Chown(uid, gid); err != nil {
return err
}
2023-10-19 11:42:01 -07:00
if err = initAccessLog(path.Join(logDir, "gochan_access.log")); err != nil {
2022-12-31 17:29:57 -08:00
return err
}
return accessFile.Chown(uid, gid)
2022-12-31 17:29:57 -08:00
}
func Logger() *zerolog.Logger {
return &logger
}
func LogInfo() *zerolog.Event {
return logger.Info()
}
func LogWarning() *zerolog.Event {
return logger.Warn()
}
func LogAccess(request *http.Request) *zerolog.Event {
ev := accessLogger.Info()
if request != nil {
return ev.
Str("access", request.URL.Path).
Str("IP", GetRealIP(request))
}
return ev
}
func LogError(err error) *zerolog.Event {
if err != nil {
2022-11-09 10:15:37 -08:00
return logger.Err(err)
}
2022-11-09 10:15:37 -08:00
return logger.Error()
}
func LogFatal() *zerolog.Event {
2022-11-09 10:15:37 -08:00
return logger.Fatal()
}
func LogDebug() *zerolog.Event {
2022-11-09 10:15:37 -08:00
return logger.Debug()
}
func CloseLog() error {
if logFile == nil {
return nil
}
return logFile.Close()
}