Skip to content

Commit 338c76a

Browse files
committed
logger taking constructor arg macro, for when you have a context, but you don't want to pass it each time via implicit for every call, just set it once when you instantiate the logger.
see lightbend-labs#208
1 parent 686b4c7 commit 338c76a

8 files changed

+878
-64
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.typesafe.scalalogging
2+
3+
import org.slf4j.Marker
4+
5+
/**
6+
*
7+
* abstract class common for both Logger and LoggerTakingConstructorArg,
8+
* if you have a library that is sometimes used in a context - in which case you want to log the context,
9+
* but other times is used outside of a context in which case you want to log "normally", your base class can have a logger of this abstract type
10+
*/
11+
trait ALogger {
12+
13+
// Error
14+
15+
def error(message: String): Unit = {}
16+
17+
def error(message: String, cause: Throwable): Unit = {}
18+
19+
def error(message: String, args: Any*): Unit = {}
20+
21+
def error(marker: Marker, message: String): Unit = {}
22+
23+
def error(marker: Marker, message: String, cause: Throwable): Unit = {}
24+
25+
def error(marker: Marker, message: String, args: Any*): Unit = {}
26+
27+
// Warn
28+
29+
def warn(message: String): Unit = {}
30+
31+
def warn(message: String, cause: Throwable): Unit = {}
32+
33+
def warn(message: String, args: Any*): Unit = {}
34+
35+
def warn(marker: Marker, message: String): Unit = {}
36+
37+
def warn(marker: Marker, message: String, cause: Throwable): Unit = {}
38+
39+
def warn(marker: Marker, message: String, args: Any*): Unit = {}
40+
41+
// Info
42+
43+
def info(message: String): Unit = {}
44+
45+
def info(message: String, cause: Throwable): Unit = {}
46+
47+
def info(message: String, args: Any*): Unit = {}
48+
49+
def info(marker: Marker, message: String): Unit = {}
50+
51+
def info(marker: Marker, message: String, cause: Throwable): Unit = {}
52+
53+
def info(marker: Marker, message: String, args: Any*): Unit = {}
54+
55+
// Debug
56+
57+
def debug(message: String): Unit = {}
58+
59+
def debug(message: String, cause: Throwable): Unit = {}
60+
61+
def debug(message: String, args: Any*): Unit = {}
62+
63+
def debug(marker: Marker, message: String): Unit = {}
64+
65+
def debug(marker: Marker, message: String, cause: Throwable): Unit = {}
66+
67+
def debug(marker: Marker, message: String, args: Any*): Unit = {}
68+
69+
// Trace
70+
71+
def trace(message: String): Unit = {}
72+
73+
def trace(message: String, cause: Throwable): Unit = {}
74+
75+
def trace(message: String, args: Any*): Unit = {}
76+
77+
def trace(marker: Marker, message: String): Unit = {}
78+
79+
def trace(marker: Marker, message: String, cause: Throwable): Unit = {}
80+
81+
def trace(marker: Marker, message: String, args: Any*): Unit = {}
82+
83+
}
84+
85+

src/main/scala/com/typesafe/scalalogging/Logger.scala

+65-31
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ object Logger {
3737
def takingImplicit[A](underlying: Underlying)(implicit ev: CanLog[A]): LoggerTakingImplicit[A] =
3838
new LoggerTakingImplicit[A](underlying)
3939

40+
/**
41+
* Create a [[LoggerTakingConstructorArg]] wrapping the given underlying `org.slf4j.Logger`.
42+
*/
43+
def inContextOf[A](underlying: Underlying)(implicit ev: CanLog[A], a: A): LoggerTakingConstructorArg[A] =
44+
new LoggerTakingConstructorArg[A](underlying, ev, a)
45+
4046
/**
4147
* Create a [[Logger]] for the given name.
4248
* Example:
@@ -57,6 +63,17 @@ object Logger {
5763
def takingImplicit[A](name: String)(implicit ev: CanLog[A]): LoggerTakingImplicit[A] =
5864
new LoggerTakingImplicit[A](LoggerFactory.getLogger(name))
5965

66+
67+
/**
68+
* Create a [[LoggerTakingConstructorArg]] for the given name.
69+
* Example:
70+
* {{{
71+
* val logger = Logger.inContextOf[CorrelationId]("application")
72+
* }}}
73+
*/
74+
def inContextOf[A](name: String)(implicit ev: CanLog[A], a: A): LoggerTakingConstructorArg[A] =
75+
new LoggerTakingConstructorArg[A](LoggerFactory.getLogger(name), ev, a)
76+
6077
/**
6178
* Create a [[Logger]] wrapping the created underlying `org.slf4j.Logger`.
6279
*/
@@ -69,6 +86,12 @@ object Logger {
6986
def takingImplicit[A](clazz: Class[_])(implicit ev: CanLog[A]): LoggerTakingImplicit[A] =
7087
new LoggerTakingImplicit[A](LoggerFactory.getLogger(clazz.getName))
7188

89+
/**
90+
* Create a [[LoggerTakingConstructorArg]] named after the given class parameter.
91+
*/
92+
def inContextOf[A](clazz: Class[_])(implicit ev: CanLog[A], a: A): LoggerTakingConstructorArg[A] =
93+
new LoggerTakingConstructorArg[A](LoggerFactory.getLogger(clazz.getName), ev, a)
94+
7295
/**
7396
* Create a [[Logger]] for the runtime class wrapped by the implicit class
7497
* tag parameter.
@@ -90,91 +113,102 @@ object Logger {
90113
*/
91114
def takingImplicit[T, A](implicit ct: ClassTag[T], ev: CanLog[A]): LoggerTakingImplicit[A] =
92115
new LoggerTakingImplicit[A](LoggerFactory.getLogger(ct.runtimeClass.getName.stripSuffix("$")))
116+
117+
/**
118+
* Create a [[LoggerTakingConstructorArg]] for the runtime class wrapped by the implicit class
119+
* tag parameter.
120+
* Example:
121+
* {{{
122+
* val logger = Logger.inContextOf[MyClass, CorrelationId]
123+
* }}}
124+
*/
125+
def inContextOf[T,A](implicit ct: ClassTag[T], ev: CanLog[A], a: A): LoggerTakingConstructorArg[A] =
126+
new LoggerTakingConstructorArg[A](LoggerFactory.getLogger(ct.runtimeClass.getName.stripSuffix("$")), ev, a)
93127
}
94128

95129
/**
96130
* Implementation of a fast logger based on macros and an underlying `org.slf4j.Logger`.
97131
*/
98132
@SerialVersionUID(538248225L)
99-
final class Logger private (val underlying: Underlying) extends Serializable {
133+
final class Logger private (val underlying: Underlying) extends ALogger with Serializable {
100134

101135
// Error
102136

103-
def error(message: String): Unit = macro LoggerMacro.errorMessage
137+
override def error(message: String): Unit = macro LoggerMacro.errorMessage
104138

105-
def error(message: String, cause: Throwable): Unit = macro LoggerMacro.errorMessageCause
139+
override def error(message: String, cause: Throwable): Unit = macro LoggerMacro.errorMessageCause
106140

107-
def error(message: String, args: Any*): Unit = macro LoggerMacro.errorMessageArgs
141+
override def error(message: String, args: Any*): Unit = macro LoggerMacro.errorMessageArgs
108142

109-
def error(marker: Marker, message: String): Unit = macro LoggerMacro.errorMessageMarker
143+
override def error(marker: Marker, message: String): Unit = macro LoggerMacro.errorMessageMarker
110144

111-
def error(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.errorMessageCauseMarker
145+
override def error(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.errorMessageCauseMarker
112146

113-
def error(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.errorMessageArgsMarker
147+
override def error(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.errorMessageArgsMarker
114148

115149
def whenErrorEnabled(body: Unit): Unit = macro LoggerMacro.errorCode
116150

117151
// Warn
118152

119-
def warn(message: String): Unit = macro LoggerMacro.warnMessage
153+
override def warn(message: String): Unit = macro LoggerMacro.warnMessage
120154

121-
def warn(message: String, cause: Throwable): Unit = macro LoggerMacro.warnMessageCause
155+
override def warn(message: String, cause: Throwable): Unit = macro LoggerMacro.warnMessageCause
122156

123-
def warn(message: String, args: Any*): Unit = macro LoggerMacro.warnMessageArgs
157+
override def warn(message: String, args: Any*): Unit = macro LoggerMacro.warnMessageArgs
124158

125-
def warn(marker: Marker, message: String): Unit = macro LoggerMacro.warnMessageMarker
159+
override def warn(marker: Marker, message: String): Unit = macro LoggerMacro.warnMessageMarker
126160

127-
def warn(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.warnMessageCauseMarker
161+
override def warn(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.warnMessageCauseMarker
128162

129-
def warn(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.warnMessageArgsMarker
163+
override def warn(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.warnMessageArgsMarker
130164

131165
def whenWarnEnabled(body: Unit): Unit = macro LoggerMacro.warnCode
132166

133167
// Info
134168

135-
def info(message: String): Unit = macro LoggerMacro.infoMessage
169+
override def info(message: String): Unit = macro LoggerMacro.infoMessage
136170

137-
def info(message: String, cause: Throwable): Unit = macro LoggerMacro.infoMessageCause
171+
override def info(message: String, cause: Throwable): Unit = macro LoggerMacro.infoMessageCause
138172

139-
def info(message: String, args: Any*): Unit = macro LoggerMacro.infoMessageArgs
173+
override def info(message: String, args: Any*): Unit = macro LoggerMacro.infoMessageArgs
140174

141-
def info(marker: Marker, message: String): Unit = macro LoggerMacro.infoMessageMarker
175+
override def info(marker: Marker, message: String): Unit = macro LoggerMacro.infoMessageMarker
142176

143-
def info(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.infoMessageCauseMarker
177+
override def info(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.infoMessageCauseMarker
144178

145-
def info(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.infoMessageArgsMarker
179+
override def info(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.infoMessageArgsMarker
146180

147181
def whenInfoEnabled(body: Unit): Unit = macro LoggerMacro.infoCode
148182

149183
// Debug
150184

151-
def debug(message: String): Unit = macro LoggerMacro.debugMessage
185+
override def debug(message: String): Unit = macro LoggerMacro.debugMessage
152186

153-
def debug(message: String, cause: Throwable): Unit = macro LoggerMacro.debugMessageCause
187+
override def debug(message: String, cause: Throwable): Unit = macro LoggerMacro.debugMessageCause
154188

155-
def debug(message: String, args: Any*): Unit = macro LoggerMacro.debugMessageArgs
189+
override def debug(message: String, args: Any*): Unit = macro LoggerMacro.debugMessageArgs
156190

157-
def debug(marker: Marker, message: String): Unit = macro LoggerMacro.debugMessageMarker
191+
override def debug(marker: Marker, message: String): Unit = macro LoggerMacro.debugMessageMarker
158192

159-
def debug(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.debugMessageCauseMarker
193+
override def debug(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.debugMessageCauseMarker
160194

161-
def debug(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.debugMessageArgsMarker
195+
override def debug(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.debugMessageArgsMarker
162196

163197
def whenDebugEnabled(body: Unit): Unit = macro LoggerMacro.debugCode
164198

165199
// Trace
166200

167-
def trace(message: String): Unit = macro LoggerMacro.traceMessage
201+
override def trace(message: String): Unit = macro LoggerMacro.traceMessage
168202

169-
def trace(message: String, cause: Throwable): Unit = macro LoggerMacro.traceMessageCause
203+
override def trace(message: String, cause: Throwable): Unit = macro LoggerMacro.traceMessageCause
170204

171-
def trace(message: String, args: Any*): Unit = macro LoggerMacro.traceMessageArgs
205+
override def trace(message: String, args: Any*): Unit = macro LoggerMacro.traceMessageArgs
172206

173-
def trace(marker: Marker, message: String): Unit = macro LoggerMacro.traceMessageMarker
207+
override def trace(marker: Marker, message: String): Unit = macro LoggerMacro.traceMessageMarker
174208

175-
def trace(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.traceMessageCauseMarker
209+
override def trace(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerMacro.traceMessageCauseMarker
176210

177-
def trace(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.traceMessageArgsMarker
211+
override def trace(marker: Marker, message: String, args: Any*): Unit = macro LoggerMacro.traceMessageArgsMarker
178212

179213
def whenTraceEnabled(body: Unit): Unit = macro LoggerMacro.traceCode
180214

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.typesafe.scalalogging
2+
3+
import org.slf4j.{Marker, Logger => Underlying}
4+
5+
import scala.language.experimental.macros
6+
7+
/**
8+
* ALogger that takes some data A and uses it according to strategy CanLog[A] during every log operation.
9+
* Useful for logging things in a context, such as a request id, assuming it's available during construction time.
10+
* */
11+
class LoggerTakingConstructorArg[A] private[scalalogging](val underlying: Underlying, val canLogEv: CanLog[A], val a: A) extends ALogger with Serializable with LogsAdditionalData[A] {
12+
13+
// Error
14+
15+
override def error(message: String): Unit = macro LoggerTakingConstructorArgMacro.errorMessage[A]
16+
17+
override def error(message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.errorMessageCause[A]
18+
19+
override def error(message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.errorMessageArgs[A]
20+
21+
override def error(marker: Marker, message: String): Unit = macro LoggerTakingConstructorArgMacro.errorMessageMarker[A]
22+
23+
override def error(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.errorMessageCauseMarker[A]
24+
25+
override def error(marker: Marker, message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.errorMessageArgsMarker[A]
26+
27+
// Warn
28+
29+
override def warn(message: String): Unit = macro LoggerTakingConstructorArgMacro.warnMessage[A]
30+
31+
override def warn(message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.warnMessageCause[A]
32+
33+
override def warn(message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.warnMessageArgs[A]
34+
35+
override def warn(marker: Marker, message: String): Unit = macro LoggerTakingConstructorArgMacro.warnMessageMarker[A]
36+
37+
override def warn(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.warnMessageCauseMarker[A]
38+
39+
override def warn(marker: Marker, message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.warnMessageArgsMarker[A]
40+
41+
// Info
42+
43+
override def info(message: String): Unit = macro LoggerTakingConstructorArgMacro.infoMessage[A]
44+
45+
override def info(message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.infoMessageCause[A]
46+
47+
override def info(message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.infoMessageArgs[A]
48+
49+
override def info(marker: Marker, message: String): Unit = macro LoggerTakingConstructorArgMacro.infoMessageMarker[A]
50+
51+
override def info(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.infoMessageCauseMarker[A]
52+
53+
override def info(marker: Marker, message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.infoMessageArgsMarker[A]
54+
55+
// Debug
56+
57+
override def debug(message: String): Unit = macro LoggerTakingConstructorArgMacro.debugMessage[A]
58+
59+
override def debug(message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.debugMessageCause[A]
60+
61+
override def debug(message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.debugMessageArgs[A]
62+
63+
override def debug(marker: Marker, message: String): Unit = macro LoggerTakingConstructorArgMacro.debugMessageMarker[A]
64+
65+
override def debug(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.debugMessageCauseMarker[A]
66+
67+
override def debug(marker: Marker, message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.debugMessageArgsMarker[A]
68+
69+
// Trace
70+
71+
override def trace(message: String): Unit = macro LoggerTakingConstructorArgMacro.traceMessage[A]
72+
73+
override def trace(message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.traceMessageCause[A]
74+
75+
override def trace(message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.traceMessageArgs[A]
76+
77+
override def trace(marker: Marker, message: String): Unit = macro LoggerTakingConstructorArgMacro.traceMessageMarker[A]
78+
79+
override def trace(marker: Marker, message: String, cause: Throwable): Unit = macro LoggerTakingConstructorArgMacro.traceMessageCauseMarker[A]
80+
81+
override def trace(marker: Marker, message: String, args: Any*): Unit = macro LoggerTakingConstructorArgMacro.traceMessageArgsMarker[A]
82+
83+
}

0 commit comments

Comments
 (0)