-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuilder.go
More file actions
150 lines (132 loc) · 3.83 KB
/
builder.go
File metadata and controls
150 lines (132 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package logger
import (
"os"
"strings"
)
// LoggerBuilder is used to configure and create a Logger instance.
type LoggerBuilder struct {
buf uint // Buffer size for the logger's channel.
dev bool // Indicates if the logger is in development mode.
simple bool // Indicates if the logger uses a simple format.
silent bool // Indicates if the logger is silent.
root string // Root directory for log files.
prefix string // Prefix for log file names.
ext string // Extension for log file names.
layout string // Layout for log file names.
formatter TimeFormatter // Formatter for log timestamps.
}
// NewLogger initializes a LoggerBuilder with default settings.
func NewLogger() *LoggerBuilder {
return &LoggerBuilder{
buf: 100,
dev: true,
simple: false,
silent: false,
root: "./logs",
prefix: "",
ext: "",
layout: "2006-01-02",
formatter: StdFormatter,
}
}
// SetBufferSize configures the buffer size for the logger's channel.
func (b *LoggerBuilder) SetBufferSize(size uint) *LoggerBuilder {
b.buf = size
return b
}
// SetEnv set development or production mode
func (b *LoggerBuilder) SetEnv(dev bool) *LoggerBuilder {
b.dev = dev
return b
}
// SetSimple set simple formatting for the logger.
func (b *LoggerBuilder) SetSimple(simple bool) *LoggerBuilder {
b.simple = simple
return b
}
// SetSilent set silent mode for logger (no print to console).
func (b *LoggerBuilder) SetSilent(silent bool) *LoggerBuilder {
b.silent = silent
return b
}
// Path sets the root directory for log files. Ignores empty input.
func (b *LoggerBuilder) Path(root string) *LoggerBuilder {
root = strings.TrimSpace(root)
if root != "" {
b.root = root
}
return b
}
// Prefix sets the prefix for log file names. Ignores empty input.
func (b *LoggerBuilder) Prefix(prefix string) *LoggerBuilder {
if strings.TrimSpace(prefix) != "" {
b.prefix = prefix
}
return b
}
// Extension sets the extension for log file names. Ignores empty input.
func (b *LoggerBuilder) Extension(ext string) *LoggerBuilder {
ext = strings.TrimSpace(ext)
if ext != "" {
b.ext = ext
}
return b
}
// Daily sets the log file layout to daily.
func (b *LoggerBuilder) Daily() *LoggerBuilder {
b.layout = "2006-01-02"
return b
}
// Monthly sets the log file layout to monthly.
func (b *LoggerBuilder) Monthly() *LoggerBuilder {
b.layout = "2006-01"
return b
}
// CustomLayout sets a custom layout for log file names. Ignores empty input.
func (b *LoggerBuilder) CustomLayout(layout string) *LoggerBuilder {
layout = strings.TrimSpace(layout)
if layout != "" {
b.layout = layout
}
return b
}
// StdFormatter sets the logger to use the standard time formatter.
func (b *LoggerBuilder) StdFormatter() *LoggerBuilder {
b.formatter = StdFormatter
return b
}
// JalaaliFormatter sets the logger to use the Jalaali time formatter.
func (b *LoggerBuilder) JalaaliFormatter() *LoggerBuilder {
b.formatter = JalaaliFormatter
return b
}
// CustomFormatter sets a custom time formatter for the logger. Ignores nil input.
func (b *LoggerBuilder) CustomFormatter(formatter TimeFormatter) *LoggerBuilder {
if formatter != nil {
b.formatter = formatter
}
return b
}
// Logger creates and returns a Logger instance based on the builder's configuration.
func (b *LoggerBuilder) Logger() (Logger, error) {
// Ensure the log directory exists.
err := os.MkdirAll(b.root, os.ModePerm)
if err != nil && !os.IsExist(err) {
return nil, err
}
// Create and initialize the logger.
logger := &logger{
channel: make(chan log, b.buf),
dev: b.dev,
simple: b.simple,
silent: b.silent,
root: b.root,
prefix: b.prefix,
ext: b.ext,
layout: b.layout,
formatter: b.formatter,
}
logger.wg.Add(1)
go logger.run()
return logger, nil
}