[script debugger] Use nio in MessagingLogger

GitOrigin-RevId: 606561d969511ededa4978cdc9043606a3222850
This commit is contained in:
Shumaf Lovpache
2025-01-15 13:02:27 +00:00
committed by intellij-monorepo-bot
parent d958b4c717
commit aee08bf366
2 changed files with 32 additions and 42 deletions
@@ -20,5 +20,6 @@
<orderEntry type="module" module-name="intellij.platform.concurrency" />
<orderEntry type="module" module-name="intellij.platform.ide.util.netty" />
<orderEntry type="module" module-name="intellij.platform.ide.core.impl" />
<orderEntry type="module" module-name="intellij.platform.util.ex" />
</component>
</module>
@@ -3,22 +3,20 @@ package org.jetbrains.debugger
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.io.FileUtilRt
import com.intellij.openapi.util.registry.Registry
import com.intellij.util.concurrency.AppExecutorUtil
import com.intellij.util.io.addChannelListener
import com.intellij.util.text.CharSequenceBackedByChars
import com.intellij.util.io.createParentDirectories
import io.netty.buffer.ByteBuf
import io.netty.channel.Channel
import org.jetbrains.annotations.ApiStatus
import java.io.File
import java.io.FileOutputStream
import java.nio.CharBuffer
import java.text.SimpleDateFormat
import java.util.concurrent.Future
import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicInteger
import kotlin.io.path.Path
import kotlin.io.path.writer
internal class LogEntry(val message: CharSequence, val marker: String) {
internal val time = System.currentTimeMillis()
@@ -34,44 +32,35 @@ class MessagingLogger internal constructor(debugFileBaseName: String, suffix: St
val sessionNumber = sequentialNumber.getAndIncrement()
val nameSuffix = if (sessionNumber == 0) "$suffix.json" else "$suffix-$sessionNumber.json"
val file = File(FileUtil.expandUserHome(debugFileBaseName + nameSuffix))
FileUtilRt.createParentDirs(file)
val out = FileOutputStream(file)
val writer = out.writer()
writer.write("[\n")
writer.flush()
val fileChannel = out.channel
val dateFormatter = SimpleDateFormat("HH.mm.ss,SSS")
try {
while (true) {
val entry = queue.take()
writer.write("""{"timestamp": "${dateFormatter.format(entry.time)}", """)
val message = entry.message
writer.write("\"${entry.marker}\": ")
writer.flush()
if (message is CharSequenceBackedByChars) {
fileChannel.write(message.byteBuffer)
}
else {
fileChannel.write(Charsets.UTF_8.encode(CharBuffer.wrap(message)))
}
writer.write("},\n")
writer.flush()
}
}
catch (e: InterruptedException) {
// ignored
}
finally {
writer.write("]")
val logPath = Path(FileUtil.expandUserHome(debugFileBaseName + nameSuffix))
logPath.createParentDirectories()
logPath.writer().use { writer ->
writer.write("[\n")
writer.flush()
sequentialNumber.decrementAndGet()
out.close()
val dateFormatter = SimpleDateFormat("HH.mm.ss,SSS")
try {
while (true) {
val entry = queue.take()
writer.write("""{"timestamp": "${dateFormatter.format(entry.time)}", """)
writer.write("\"${entry.marker}\": ")
writer.flush()
writer.append(entry.message)
writer.write("},\n")
writer.flush()
}
}
catch (_: InterruptedException) {
// ignored
}
finally {
writer.write("]")
writer.flush()
sequentialNumber.decrementAndGet()
}
}
}
}