@@ -12,7 +12,7 @@ import org.javacs.kt.util.DelegatePrintStream
1212
1313val LOG = Logger ()
1414
15- private class JULRedirector (private val downstream : Logger ): Handler() {
15+ private class JULRedirector (private val downstream : Logger ) : Handler() {
1616 override fun publish (record : LogRecord ) {
1717 when (record.level) {
1818 Level .SEVERE -> downstream.error(record.message)
@@ -41,12 +41,23 @@ enum class LogLevel(val value: Int) {
4141 ALL (- 100 )
4242}
4343
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+
4454class LogMessage (
4555 val level : LogLevel ,
46- val message : String
56+ val message : String ,
57+ private val funName : String? = null ,
4758) {
4859 val formatted: String
49- get() = " [$level ] $message "
60+ get() = " [$level ] ${funName?. let { " $it " } ? : " " }$ message "
5061}
5162
5263class Logger {
@@ -60,6 +71,7 @@ class Logger {
6071 private val newline = System .lineSeparator()
6172 val logTime = false
6273 var level = LogLevel .INFO
74+ var stackTracing = false ;
6375
6476 fun logError (msg : LogMessage ) {
6577 if (errBackend == null ) {
@@ -78,14 +90,24 @@ class Logger {
7890 }
7991
8092 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+ }
8198 if (level.value <= msgLevel.value) {
82- log(LogMessage (msgLevel, format(insertPlaceholders(msg, placeholders))))
99+ log(LogMessage (msgLevel, format(insertPlaceholders(msg, placeholders)), stackTraceElement?.className ))
83100 }
84101 }
85102
86103 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+ }
87109 if (level.value <= msgLevel.value) {
88- log(LogMessage (msgLevel, msg()))
110+ log(LogMessage (msgLevel, msg(), stackTraceElement?.className ))
89111 }
90112 }
91113
@@ -119,6 +141,14 @@ class Logger {
119141
120142 inline fun deepTrace (msg : () -> String ) = logWithLambdaAt(LogLevel .DEEP_TRACE , msg)
121143
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+
122152 fun connectJULFrontend () {
123153 val rootLogger = java.util.logging.Logger .getLogger(" " )
124154 rootLogger.addHandler(JULRedirector (this ))
0 commit comments