Skip to content

Commit 992485d

Browse files
committed
[#381] make logger state immutable and inject default logger
1 parent 69d996d commit 992485d

File tree

6 files changed

+138
-84
lines changed

6 files changed

+138
-84
lines changed

index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ const logger = require('./lib/utils/log/logger')
1414

1515
const config = new ConfigBuilder().build()
1616
setConfig(config)
17-
logger.setRootLogger(LogBuilder.createDefaultLogBuilder().setConfig(config).build())
1817

1918
const agentInfo = AgentInfo.make(config)
19+
const defaultLogger = logger.getLogger(LogBuilder.createDefaultLogBuilder().setConfig(config).build())
2020
const agent = new AgentBuilder(agentInfo)
2121
.setConfig(config)
22+
.setLogger(defaultLogger)
2223
.build()
2324
agent.start()
2425
module.exports = agent

lib/agent-builder.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ class AgentBuilder {
9595
return this
9696
}
9797

98+
setLogger(logger) {
99+
this.logger = logger
100+
return this
101+
}
102+
98103
addService(service) {
99104
this.services.push(service)
100105
return this
@@ -120,7 +125,7 @@ class AgentBuilder {
120125
this.config = getConfig()
121126
}
122127

123-
const agent = new Agent(this.agentInfo, this.config, logger)
128+
const agent = new Agent(this.agentInfo, this.config, this.logger ?? logger.getLogger())
124129
if (!this.dataSender) {
125130
this.dataSender = dataSenderFactory.create(this.config, this.agentInfo)
126131
}

lib/utils/log/log-builder.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ class Log {
3636
constructor(name, level) {
3737
this.name = name
3838
this.level = level
39-
this.appenders = []
4039
}
4140

4241
getName() {
@@ -50,6 +49,20 @@ class Log {
5049
getAppenders() {
5150
return this.appenders
5251
}
52+
53+
createdWithConfig() {
54+
return true
55+
}
56+
}
57+
58+
class NoConfigLog extends Log {
59+
constructor(name, level) {
60+
super(name, level)
61+
}
62+
63+
createdWithConfig() {
64+
return false
65+
}
5366
}
5467

5568
class LogBuilder {
@@ -73,9 +86,9 @@ class LogBuilder {
7386

7487
build() {
7588
if (!this.config) {
76-
const log = new Log(this.name, this.level)
77-
log.appenders = this.appenders
78-
return log
89+
const noConfigLog = new NoConfigLog(this.name, this.level)
90+
noConfigLog.appenders = this.appenders
91+
return noConfigLog
7992
}
8093

8194
const level = this.valueOfLoggingLevel(this.config.loggerLevels[this.name]) ?? this.level
@@ -158,6 +171,10 @@ class LogBuilder {
158171
this.config = config
159172
return this
160173
}
174+
175+
getName() {
176+
return this.name
177+
}
161178
}
162179

163180
module.exports = {

lib/utils/log/logger.js

Lines changed: 76 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,85 @@
99
const loglevel = require('loglevel')
1010
const { LogBuilder, LogLevel: Level, Log } = require('./log-builder')
1111

12-
class Logging {
12+
13+
class Logger {
14+
constructor() {
15+
this.loggers = new Map()
16+
this.defaultLoggerName = LogBuilder.createDefaultLogBuilder().getName()
17+
this.loggers.set(this.defaultLoggerName, new ChildLogger(loglevel, LogBuilder.createDefaultLogBuilder().build()))
18+
}
19+
20+
getLogger(log) {
21+
if (!log) {
22+
return this.loggers.get(this.defaultLoggerName)
23+
}
24+
25+
if (typeof log === 'string') {
26+
return this.loggers.get(log) ?? this.loggers.get(this.defaultLoggerName)
27+
}
28+
29+
if (!(log instanceof Log)) {
30+
return this.loggers.get(this.defaultLoggerName)
31+
}
32+
33+
const logName = log.getName()
34+
if (!this.loggers.has(logName)) {
35+
const logger = new ChildLogger(loglevel.getLogger(logName), log)
36+
this.loggers.set(logName, logger)
37+
return logger
38+
}
39+
40+
if (log.createdWithConfig()) {
41+
const logger = this.loggers.get(logName)
42+
logger.loglevel.setLevel(log.getLevel())
43+
logger.appenders = log.getAppenders()
44+
}
45+
return this.loggers.get(logName)
46+
}
47+
48+
debug() {
49+
const logger = this.getLogger()
50+
logger.debug.apply(logger, arguments)
51+
}
52+
53+
isDebug() {
54+
const logger = this.getLogger()
55+
return logger.isDebug()
56+
}
57+
58+
info() {
59+
const logger = this.getLogger()
60+
logger.info.apply(logger, arguments)
61+
}
62+
63+
isInfo() {
64+
const logger = this.getLogger()
65+
return logger.isInfo()
66+
}
67+
68+
warn() {
69+
const logger = this.getLogger()
70+
logger.warn.apply(logger, arguments)
71+
}
72+
73+
error() {
74+
const logger = this.getLogger()
75+
logger.error.apply(logger, arguments)
76+
}
77+
}
78+
79+
class ChildLogger {
1380
constructor(loglevel, log) {
1481
this.loglevel = loglevel
15-
if (log) {
16-
this.loglevel.setLevel(log.getLevel())
17-
this.appenders = log.getAppenders()
18-
} else {
19-
this.appenders = []
20-
}
82+
this.loglevel.setLevel(log.getLevel())
83+
this.appenders = log.getAppenders()
2184
this.name = log.getName()
2285
}
2386

2487
debug() {
2588
this.loglevel.debug.apply(null, arguments)
2689

27-
if (this.appenders.length < 1) return
90+
if (!this.hasAppenders()) return
2891

2992
const message = this.formatMessage(arguments)
3093
this.appenders.forEach(appender => {
@@ -57,7 +120,7 @@ class Logging {
57120
info() {
58121
this.loglevel.info.apply(null, arguments)
59122

60-
if (this.appenders.length < 1) return
123+
if (!this.hasAppenders()) return
61124

62125
const message = this.formatMessage(arguments)
63126
this.appenders.forEach(appender => {
@@ -74,7 +137,7 @@ class Logging {
74137
warn() {
75138
this.loglevel.warn.apply(null, arguments)
76139

77-
if (this.appenders.length < 1) return
140+
if (!this.hasAppenders()) return
78141

79142
const message = this.formatMessage(arguments)
80143
this.appenders.forEach(appender => {
@@ -87,7 +150,7 @@ class Logging {
87150
error() {
88151
this.loglevel.error.apply(null, arguments)
89152

90-
if (this.appenders.length < 1) return
153+
if (!this.hasAppenders()) return
91154

92155
const message = this.formatMessage(arguments)
93156
this.appenders.forEach(appender => {
@@ -96,40 +159,9 @@ class Logging {
96159
}
97160
})
98161
}
99-
}
100-
101-
class Logger extends Logging {
102-
constructor() {
103-
super(loglevel, LogBuilder.createDefaultLogBuilder().build())
104-
this.loggers = new Map()
105-
}
106162

107-
getLogger(log) {
108-
if (!(log instanceof Log) && typeof log !== 'string') {
109-
return this
110-
}
111-
112-
if (typeof log === 'string' && !this.loggers.has(log)) {
113-
return this
114-
}
115-
116-
const logName = log.getName?.() ?? (typeof log === 'string' ? log : LogBuilder.createDefaultLogBuilder().build().getName())
117-
if (!this.loggers.has(logName)) {
118-
this.loggers.set(logName, new ChildLogger(this.loglevel.getLogger(logName), log))
119-
}
120-
return this.loggers.get(logName)
121-
}
122-
123-
setRootLogger(log) {
124-
this.loglevel.setLevel(log.getLevel())
125-
this.appenders = log.getAppenders()
126-
}
127-
}
128-
129-
class ChildLogger extends Logging {
130-
constructor(loglevel, log) {
131-
super(loglevel, log)
132-
this.name = log.getName()
163+
hasAppenders() {
164+
return Array.isArray(this.appenders) && this.appenders.length > 0
133165
}
134166
}
135167

lib/utils/log/types.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export declare class Logger implements Logging {
6464
isInfo(): boolean;
6565

6666
getLogger(log: Log): Logger;
67-
setRootLogger(log: Log): void;
6867
}
6968

7069
export declare class ChildLogger implements Logging {

0 commit comments

Comments
 (0)