@@ -42,6 +42,25 @@ class LogMessage(private val kind: String, private val message: String) {
4242 fun toText (): String {
4343 return " [$timestamp K] [$kind ] $message "
4444 }
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+ }
4564}
4665
4766data class ExtractorContext (val kind : String , val element : IrElement , val name : String , val loc : String )
@@ -127,30 +146,30 @@ open class LoggerBase(val logCounter: LogCounter) {
127146 val diagLabel = tw.getFreshIdLabel<DbDiagnostic >()
128147 tw.writeDiagnostics(diagLabel, " CodeQL Kotlin extractor" , severity.sev, " " , msg, " ${logMessage.timestamp} $fullMsg " , locationId)
129148 tw.writeDiagnostic_for(diagLabel, StringLabel (" compilation" ), file_number, file_number_diagnostic_number++ )
130- logStream.write(logMessage.toText() + " \n " )
149+ logStream.write(logMessage.toJsonLine() )
131150 }
132151
133152 fun trace (tw : TrapWriter , msg : String ) {
134153 if (verbosity >= 4 ) {
135154 val logMessage = LogMessage (" TRACE" , msg)
136155 tw.writeComment(logMessage.toText())
137- logStream.write(logMessage.toText() + " \n " )
156+ logStream.write(logMessage.toJsonLine() )
138157 }
139158 }
140159
141160 fun debug (tw : TrapWriter , msg : String ) {
142161 if (verbosity >= 4 ) {
143162 val logMessage = LogMessage (" DEBUG" , msg)
144163 tw.writeComment(logMessage.toText())
145- logStream.write(logMessage.toText() + " \n " )
164+ logStream.write(logMessage.toJsonLine() )
146165 }
147166 }
148167
149168 fun info (tw : TrapWriter , msg : String ) {
150169 if (verbosity >= 3 ) {
151170 val logMessage = LogMessage (" INFO" , msg)
152171 tw.writeComment(logMessage.toText())
153- logStream.write(logMessage.toText() + " \n " )
172+ logStream.write(logMessage.toJsonLine() )
154173 }
155174 }
156175
@@ -173,7 +192,7 @@ open class LoggerBase(val logCounter: LogCounter) {
173192 // to be an error regardless.
174193 val logMessage = LogMessage (" ERROR" , " Total of $count diagnostics from $caller ." )
175194 tw.writeComment(logMessage.toText())
176- logStream.write(logMessage.toText() + " \n " )
195+ logStream.write(logMessage.toJsonLine() )
177196 }
178197 }
179198 }
0 commit comments