@@ -42,6 +42,25 @@ class LogMessage(private val kind: String, private val message: String) {
42
42
fun toText (): String {
43
43
return " [$timestamp K] [$kind ] $message "
44
44
}
45
+
46
+ private fun escape (str : String ): String {
47
+ return str.replace(" \\ " , " \\\\ " )
48
+ .replace(" \" " , " \\\" " )
49
+ .replace(" /" , " \\ /" )
50
+ .replace(" \b " , " \\ b" )
51
+ .replace(" \u000C " , " \\ f" )
52
+ .replace(" \n " , " \\ n" )
53
+ .replace(" \r " , " \\ r" )
54
+ .replace(" \t " , " \\ t" )
55
+ }
56
+
57
+ fun toJsonLine (): String {
58
+ val kvs = listOf (Pair (" origin" , " CodeQL Kotlin extractor" ),
59
+ Pair (" timestamp" , timestamp),
60
+ Pair (" kind" , kind),
61
+ Pair (" message" , message))
62
+ return " { " + kvs.map { p -> " \" ${p.first} \" : \" ${escape(p.second)} \" " }.joinToString(" , " ) + " }\n "
63
+ }
45
64
}
46
65
47
66
data class ExtractorContext (val kind : String , val element : IrElement , val name : String , val loc : String )
@@ -127,30 +146,30 @@ open class LoggerBase(val logCounter: LogCounter) {
127
146
val diagLabel = tw.getFreshIdLabel<DbDiagnostic >()
128
147
tw.writeDiagnostics(diagLabel, " CodeQL Kotlin extractor" , severity.sev, " " , msg, " ${logMessage.timestamp} $fullMsg " , locationId)
129
148
tw.writeDiagnostic_for(diagLabel, StringLabel (" compilation" ), file_number, file_number_diagnostic_number++ )
130
- logStream.write(logMessage.toText() + " \n " )
149
+ logStream.write(logMessage.toJsonLine() )
131
150
}
132
151
133
152
fun trace (tw : TrapWriter , msg : String ) {
134
153
if (verbosity >= 4 ) {
135
154
val logMessage = LogMessage (" TRACE" , msg)
136
155
tw.writeComment(logMessage.toText())
137
- logStream.write(logMessage.toText() + " \n " )
156
+ logStream.write(logMessage.toJsonLine() )
138
157
}
139
158
}
140
159
141
160
fun debug (tw : TrapWriter , msg : String ) {
142
161
if (verbosity >= 4 ) {
143
162
val logMessage = LogMessage (" DEBUG" , msg)
144
163
tw.writeComment(logMessage.toText())
145
- logStream.write(logMessage.toText() + " \n " )
164
+ logStream.write(logMessage.toJsonLine() )
146
165
}
147
166
}
148
167
149
168
fun info (tw : TrapWriter , msg : String ) {
150
169
if (verbosity >= 3 ) {
151
170
val logMessage = LogMessage (" INFO" , msg)
152
171
tw.writeComment(logMessage.toText())
153
- logStream.write(logMessage.toText() + " \n " )
172
+ logStream.write(logMessage.toJsonLine() )
154
173
}
155
174
}
156
175
@@ -173,7 +192,7 @@ open class LoggerBase(val logCounter: LogCounter) {
173
192
// to be an error regardless.
174
193
val logMessage = LogMessage (" ERROR" , " Total of $count diagnostics from $caller ." )
175
194
tw.writeComment(logMessage.toText())
176
- logStream.write(logMessage.toText() + " \n " )
195
+ logStream.write(logMessage.toJsonLine() )
177
196
}
178
197
}
179
198
}
0 commit comments