@@ -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)
@@ -41,12 +41,23 @@ enum class LogLevel(val value: Int) {
41
41
ALL (- 100 )
42
42
}
43
43
44
+ fun String.toLogLevel (): LogLevel {
45
+ return when (this ) {
46
+ " error" -> LogLevel .ERROR
47
+ " warn" -> LogLevel .WARN
48
+ " debug" -> LogLevel .DEBUG
49
+ " trace" -> LogLevel .TRACE
50
+ else -> LogLevel .INFO
51
+ }
52
+ }
53
+
44
54
class LogMessage (
45
55
val level : LogLevel ,
46
- val message : String
56
+ val message : String ,
57
+ private val funName : String? = null ,
47
58
) {
48
59
val formatted: String
49
- get() = " [$level ] $message "
60
+ get() = " [$level ] ${funName?. let { " $it " } ? : " " }$ message "
50
61
}
51
62
52
63
class Logger {
@@ -60,6 +71,7 @@ class Logger {
60
71
private val newline = System .lineSeparator()
61
72
val logTime = false
62
73
var level = LogLevel .INFO
74
+ var stackTracing = false ;
63
75
64
76
fun logError (msg : LogMessage ) {
65
77
if (errBackend == null ) {
@@ -78,14 +90,24 @@ class Logger {
78
90
}
79
91
80
92
private fun logWithPlaceholdersAt (msgLevel : LogLevel , msg : String , placeholders : Array <out Any ?>) {
93
+ val stackTraceElement = if (stackTracing) {
94
+ Throwable (" Capturing stack trace for logging" ).stackTrace.firstOrNull { it.className != this ::class .java.name }
95
+ } else {
96
+ null
97
+ }
81
98
if (level.value <= msgLevel.value) {
82
- log(LogMessage (msgLevel, format(insertPlaceholders(msg, placeholders))))
99
+ log(LogMessage (msgLevel, format(insertPlaceholders(msg, placeholders)), stackTraceElement?.className ))
83
100
}
84
101
}
85
102
86
103
inline fun logWithLambdaAt (msgLevel : LogLevel , msg : () -> String ) {
104
+ val stackTraceElement = if (stackTracing) {
105
+ Throwable (" Capturing stack trace for logging" ).stackTrace.firstOrNull { it.className != this ::class .java.name }
106
+ } else {
107
+ null
108
+ }
87
109
if (level.value <= msgLevel.value) {
88
- log(LogMessage (msgLevel, msg()))
110
+ log(LogMessage (msgLevel, msg(), stackTraceElement?.className ))
89
111
}
90
112
}
91
113
@@ -119,6 +141,14 @@ class Logger {
119
141
120
142
inline fun deepTrace (msg : () -> String ) = logWithLambdaAt(LogLevel .DEEP_TRACE , msg)
121
143
144
+ fun setLogLevel (level : String ) {
145
+ val logLevel = level.toLogLevel()
146
+ if (logLevel.value <= LogLevel .TRACE .value) {
147
+ stackTracing = true
148
+ }
149
+ this .level = logLevel
150
+ }
151
+
122
152
fun connectJULFrontend () {
123
153
val rootLogger = java.util.logging.Logger .getLogger(" " )
124
154
rootLogger.addHandler(JULRedirector (this ))
0 commit comments