Skip to content

Commit c40facb

Browse files
committed
added console instance + log instance + log
1 parent d5e9185 commit c40facb

File tree

7 files changed

+161
-3
lines changed

7 files changed

+161
-3
lines changed

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@ Database Log (Cassandra DB) => Soon (Q2 2022)
1414

1515
## Log format
1616

17-
**Product**-**Service**-**Location**-**Timestamp**-**FuncType**-**Type**-**Code**-**Message**
17+
**Product**-**Service**-**Location**-**Timestamp**-**FuncType**-**Level**-**Code**-**Message**
1818

1919
**Product** must be an ID that refer to the product (a product have multiples services)
2020

2121
**Service** must the an ID that refer to the impacted service (Like for instance a API gateway)
2222

2323
**Location** must be where the error occured (like EU01, or could be more precise like EU01-DC1-R01-N01)
2424

25-
**Timestamp** Is when the log was triggered
25+
**Timestamp** Is when the log was triggered (in milliseconds)
2626

27-
**Type** `(verb,debug,info,warn,error,fatal)`
27+
**Level** `(verb,debug,info,warn,error,fatal)`
2828

2929
**Code** Is an OPcode, for instance auth system = 03 so all the log that are from the auth system are code=03
3030

log/main.go

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package log
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"time"
7+
)
8+
9+
type FlagLevel string
10+
11+
const (
12+
FlagVerbose FlagLevel = "verb"
13+
FlagDebug FlagLevel = "debug"
14+
FlagInfo FlagLevel = "info"
15+
FlagWarn FlagLevel = "warn"
16+
FlagError FlagLevel = "error"
17+
FlagFatal FlagLevel = "fatal"
18+
FlagNone FlagLevel = "none"
19+
)
20+
21+
type Log struct {
22+
Product string `json:"product"`
23+
Service string `json:"service"`
24+
Location string `json:"location"`
25+
Timestamp string `json:"timestamp"`
26+
Level FlagLevel `json:"level"`
27+
Code string `json:"code"`
28+
Message string `json:"message"`
29+
}
30+
31+
func CreateLog(product string, service string, location string, level FlagLevel, code string, message string) *Log {
32+
return &Log{
33+
Product: product,
34+
Service: service,
35+
Location: location,
36+
Timestamp: fmt.Sprint(time.Now().UnixMilli()),
37+
Level: level,
38+
Code: code,
39+
Message: message,
40+
}
41+
}
42+
43+
func (log *Log) ToJSONString() (string, error) {
44+
b, err := json.Marshal(log)
45+
return string(b), err
46+
}
47+
48+
// type FlagCompareOp int
49+
50+
// const (
51+
// FlagL FlagCompareOp = iota
52+
// FlagLEQ
53+
// FlagEQ
54+
// FlagMEQ
55+
// FlagM
56+
// )
57+
58+
func FlagCompareOneMoreThanTwo(one FlagLevel, two FlagLevel) bool {
59+
switch one {
60+
case FlagVerbose:
61+
return false
62+
case FlagDebug:
63+
return (two != FlagVerbose)
64+
case FlagInfo:
65+
return (two != FlagVerbose && two != FlagDebug)
66+
case FlagWarn:
67+
return (two != FlagVerbose && two != FlagDebug && two != FlagInfo)
68+
case FlagError:
69+
return (two != FlagVerbose && two != FlagDebug && two != FlagInfo && two != FlagWarn)
70+
case FlagFatal:
71+
return (two != FlagVerbose && two != FlagDebug && two != FlagInfo && two != FlagWarn && two != FlagError)
72+
case FlagNone:
73+
return true
74+
default:
75+
return false
76+
}
77+
}

loginstance/docs.go

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// This package manage the logger instance
2+
package log

loginstance/main.go

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package log
2+
3+
import (
4+
"github.com/meduvia/godolog/log"
5+
"github.com/meduvia/godolog/writer"
6+
)
7+
8+
type LogInstance struct {
9+
writer *writer.WriterInstance
10+
level log.FlagLevel
11+
}
12+
13+
func NewLogInstance(logbackend *writer.WriterInstance, level log.FlagLevel) *LogInstance{
14+
return &LogInstance{
15+
writer: logbackend,
16+
level: level,
17+
}
18+
}
19+
20+
func (logger *LogInstance) Log(product string, service string, location string, level log.FlagLevel, code string, message string) error {
21+
if (log.FlagCompareOneMoreThanTwo(logger.level, level)) {
22+
return nil // break log level requirement is more than log level
23+
}
24+
logobj := log.CreateLog(product, service, location, level,code, message)
25+
return (*logger.writer).Write(logobj)
26+
}
27+

writer/console.go

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package writer
2+
3+
import "github.com/meduvia/godolog/log"
4+
5+
type ConsoleWriterInterface interface {
6+
// we did not add verbose because in major logger backend verbose does not exist
7+
Debug(string) // verbose + debug
8+
Info(string) // info
9+
Warn(string) // warn
10+
Error(string) // error + fatal
11+
// We did not add fatal to prevent logger backend from killing the running program
12+
}
13+
14+
type ConsoleWriter struct {
15+
writer *ConsoleWriterInterface
16+
}
17+
18+
func NewConsoleWriter(LogBackend *ConsoleWriterInterface) *ConsoleWriter {
19+
return &ConsoleWriter{
20+
writer: LogBackend,
21+
}
22+
}
23+
24+
func (consolewriter *ConsoleWriter) Write(logobj *log.Log) {
25+
logstring, err := logobj.ToJSONString()
26+
if err != nil {
27+
(*consolewriter.writer).Error("Error Writing log")
28+
}
29+
switch logobj.Level {
30+
case log.FlagVerbose, log.FlagDebug:
31+
(*consolewriter.writer).Debug(logstring)
32+
case log.FlagInfo:
33+
(*consolewriter.writer).Info(logstring)
34+
case log.FlagWarn:
35+
(*consolewriter.writer).Warn(logstring)
36+
case log.FlagError, log.FlagFatal:
37+
(*consolewriter.writer).Error(logstring)
38+
default:
39+
(*consolewriter.writer).Debug(logstring)
40+
}
41+
42+
}

writer/file.go

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
package writer
2+

writer/main.go

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package writer
2+
3+
import "github.com/meduvia/godolog/log"
4+
5+
type WriterInstance interface {
6+
Write(*log.Log) error
7+
}
8+

0 commit comments

Comments
 (0)