go-cnj-helper/logger.go

165 lines
3.5 KiB
Go

package gocnjhelper
import (
"encoding/json"
"fmt"
"os"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
var (
logsClient *Client
gServiceName uint8
gServiceType uint8
gRabbitMqLoggingEnabled bool
gDebugEnabled bool
)
const (
RabbitMqQueueLogs = "cnj.logs"
ServiceNameAPI = 0
ServiceNameMailer = 1
ServiceNameStorageServer = 2
ServiceNameSSEServer = 3
ServiceNameWSServer = 4
ServiceTypeAlpha = 0
ServiceTypeBeta = 1
ServiceTypeStable = 2
messageTypeInfo = 0
messageTypeDebug = 1
messageTypeError = 2
)
func InitLogger(debug bool, colorizedOutput bool, rabbitMqLogging bool, rabbitMqConnAddr string, serviceName uint8, serviceType uint8) {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
gDebugEnabled = debug
gRabbitMqLoggingEnabled = rabbitMqLogging
if debug {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
} else {
zerolog.SetGlobalLevel(zerolog.InfoLevel)
}
if colorizedOutput {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: "15:04:05"})
}
if rabbitMqLogging {
gServiceName = serviceName
gServiceType = serviceType
logsClient = NewClient(
ExchangeSettings{},
QueueSettings{
Enabled: true,
Name: RabbitMqQueueLogs,
Durable: true,
DeleteWhenUnused: false,
Exclusive: false,
NoWait: false,
Arguments: nil,
QueuePublishSettings: QueuePublishSettings{
Mandatory: false,
Immediate: false,
DeliveryMode: DeliveryModePersistent,
ContentType: ContentTypeJson,
},
},
ChannelQosSettingsDefault,
Config{
ReconnectDelay: 1 * time.Second,
ReInitDelay: 1 * time.Second,
ResendDelay: 5 * time.Second,
},
rabbitMqConnAddr)
}
}
func LogInfo(msg string) {
log.Info().Msg(msg)
pushLogMessage(messageTypeDebug, msg)
}
func LogInfof(format string, v ...interface{}) {
log.Info().Msgf(format, v)
pushLogMessage(messageTypeDebug, fmt.Sprintf(format, v...))
}
func LogDebug(msg string) {
log.Debug().Msg(msg)
pushLogMessage(messageTypeDebug, msg)
}
func LogDebugf(format string, v ...interface{}) {
log.Debug().Msgf(format, v)
pushLogMessage(messageTypeDebug, fmt.Sprintf(format, v...))
}
func LogError(msg string) {
log.Error().Msg(msg)
pushLogMessage(messageTypeDebug, msg)
}
func LogErrorf(format string, v ...interface{}) {
log.Error().Msgf(format, v)
pushLogMessage(messageTypeDebug, fmt.Sprintf(format, v...))
}
func LogFatal(msg string) {
pushLogMessage(messageTypeDebug, msg)
log.Fatal().Msg(msg)
}
func LogFatalf(format string, v ...interface{}) {
pushLogMessage(messageTypeDebug, fmt.Sprintf(format, v...))
log.Fatal().Msgf(format, v)
}
type RabbitMqLogMessage struct {
MessageType uint8
ServiceName uint8
ServiceType uint8
Msg string
Timestamp int64
}
func pushLogMessage(messageType uint8, logMsg string) {
if !gRabbitMqLoggingEnabled || !gDebugEnabled && messageType == messageTypeDebug {
return
}
rabbitMqLogMessage := RabbitMqLogMessage{
MessageType: messageType, // could be debug, info
ServiceName: gServiceName, // could be API
ServiceType: gServiceType, // could be alpha
Msg: logMsg,
Timestamp: time.Now().UnixMilli(),
}
msg, err := json.Marshal(rabbitMqLogMessage)
if err != nil {
log.Error().Msgf("Failed to marshal rabbitMqLogMessage, err: %s", err)
return
}
if err = logsClient.PushQueueMessage(msg); err != nil {
log.Error().Msgf("Failed to push log message, err: %s", err)
}
}