@@ -12,7 +12,7 @@ import org.javacs.kt.util.DelegatePrintStream
12
12
13
13
val LOG = Logger ()
14
14
15
- private class JULRedirector (private val downstream : Logger ): Handler() {
15
+ private class JULRedirector (private val downstream : Logger ) : Handler() {
16
16
override fun publish (record : LogRecord ) {
17
17
when (record.level) {
18
18
Level .SEVERE -> downstream.error(record.message)
@@ -43,10 +43,17 @@ enum class LogLevel(val value: Int) {
43
43
44
44
class LogMessage (
45
45
val level : LogLevel ,
46
- val message : String
46
+ val message : String ,
47
+ private val funName : String? = null ,
47
48
) {
48
49
val formatted: String
49
- get() = " [$level ] $message "
50
+ get() {
51
+ return if (funName != null ) {
52
+ " [$level ] $funName $message "
53
+ } else {
54
+ " [$level ] $message "
55
+ }
56
+ }
50
57
}
51
58
52
59
class Logger {
@@ -58,10 +65,11 @@ class Logger {
58
65
val outStream = DelegatePrintStream { log(LogMessage (LogLevel .INFO , it.trimEnd())) }
59
66
60
67
private val newline = System .lineSeparator()
61
- val logTime = false
68
+ private val logTime = false
62
69
var level = LogLevel .INFO
70
+ var tracingLog = false ;
63
71
64
- fun logError (msg : LogMessage ) {
72
+ private fun logError (msg : LogMessage ) {
65
73
if (errBackend == null ) {
66
74
errQueue.offer(msg)
67
75
} else {
@@ -78,14 +86,24 @@ class Logger {
78
86
}
79
87
80
88
private fun logWithPlaceholdersAt (msgLevel : LogLevel , msg : String , placeholders : Array <out Any ?>) {
89
+ val stackTraceElement = if (tracingLog) {
90
+ Throwable (" Capturing stack trace for logging" ).stackTrace.firstOrNull { it.className != this ::class .java.name }
91
+ } else {
92
+ null
93
+ }
81
94
if (level.value <= msgLevel.value) {
82
- log(LogMessage (msgLevel, format(insertPlaceholders(msg, placeholders))))
95
+ log(LogMessage (msgLevel, format(insertPlaceholders(msg, placeholders)), stackTraceElement?.className ))
83
96
}
84
97
}
85
98
86
- inline fun logWithLambdaAt (msgLevel : LogLevel , msg : () -> String ) {
99
+ inline fun logWithLambdaAt (msgLevel : LogLevel , crossinline msg : () -> String ) {
100
+ val stackTraceElement = if (tracingLog) {
101
+ Throwable (" Capturing stack trace for logging" ).stackTrace.firstOrNull { it.className != this ::class .java.name }
102
+ } else {
103
+ null
104
+ }
87
105
if (level.value <= msgLevel.value) {
88
- log(LogMessage (msgLevel, msg()))
106
+ log(LogMessage (msgLevel, msg(), stackTraceElement?.className ))
89
107
}
90
108
}
91
109
@@ -103,22 +121,26 @@ class Logger {
103
121
104
122
fun trace (msg : String , vararg placeholders : Any? ) = logWithPlaceholdersAt(LogLevel .TRACE , msg, placeholders)
105
123
106
- fun deepTrace (msg : String , vararg placeholders : Any? ) = logWithPlaceholdersAt(LogLevel .DEEP_TRACE , msg, placeholders)
124
+ fun deepTrace (msg : String , vararg placeholders : Any? ) =
125
+ logWithPlaceholdersAt(LogLevel .DEEP_TRACE , msg, placeholders)
107
126
108
127
// Convenience logging methods using inlined lambdas
109
128
110
- inline fun error (msg : () -> String ) = logWithLambdaAt(LogLevel .ERROR , msg)
129
+ inline fun error (crossinline msg : () -> String ) = logWithLambdaAt(LogLevel .ERROR , msg)
111
130
112
- inline fun warn (msg : () -> String ) = logWithLambdaAt(LogLevel .WARN , msg)
131
+ inline fun warn (crossinline msg : () -> String ) = logWithLambdaAt(LogLevel .WARN , msg)
113
132
114
- inline fun info (msg : () -> String ) = logWithLambdaAt(LogLevel .INFO , msg)
133
+ inline fun info (crossinline msg : () -> String ) = logWithLambdaAt(LogLevel .INFO , msg)
115
134
116
- inline fun debug (msg : () -> String ) = logWithLambdaAt(LogLevel .DEBUG , msg)
135
+ inline fun debug (crossinline msg : () -> String ) = logWithLambdaAt(LogLevel .DEBUG , msg)
117
136
118
- inline fun trace (msg : () -> String ) = logWithLambdaAt(LogLevel .TRACE , msg)
137
+ inline fun trace (crossinline msg : () -> String ) = logWithLambdaAt(LogLevel .TRACE , msg)
119
138
120
- inline fun deepTrace (msg : () -> String ) = logWithLambdaAt(LogLevel .DEEP_TRACE , msg)
139
+ inline fun deepTrace (crossinline msg : () -> String ) = logWithLambdaAt(LogLevel .DEEP_TRACE , msg)
121
140
141
+ fun setTracing () {
142
+ tracingLog = true
143
+ }
122
144
fun connectJULFrontend () {
123
145
val rootLogger = java.util.logging.Logger .getLogger(" " )
124
146
rootLogger.addHandler(JULRedirector (this ))
@@ -182,9 +204,9 @@ class Logger {
182
204
}
183
205
184
206
private fun shortenOrPad (str : String , length : Int ): String =
185
- if (str.length <= length) {
186
- str.padEnd(length, ' ' )
187
- } else {
188
- " .." + str.substring(str.length - length + 2 )
189
- }
207
+ if (str.length <= length) {
208
+ str.padEnd(length, ' ' )
209
+ } else {
210
+ " .." + str.substring(str.length - length + 2 )
211
+ }
190
212
}
0 commit comments