HDD可用之前的日志缓冲区消息



所以我有一个嵌入式java设备,它在引导后尽早运行代码。但硬盘并没有立即上市。

我发现使用带有xml配置的logback是不起作用的,因为每当它启动时,它都会检查日志文件的存在,这是不可能的,因为HDD还没有安装。

所以我在硬盘启动时用程序添加了FileAppender。但这会导致大量消息丢失,因为当设备启动时没有附加程序,并且我无法从启动到HDD可用的时间获取日志。

硬盘启动后,有没有办法缓冲这些消息并将其打印到文件中?

我启动appender的方法:

fun startLogger() {
logger.debug("Starting HDD logger")
val lc = LoggerFactory.getILoggerFactory() as LoggerContext
lc.reset()
try {
val root = lc.getLogger(Logger.ROOT_LOGGER_NAME)
logFileAppender.apply {
context = lc
name = "logFile"
file = "/mnt/hdd/cz.myq.roger.ricoh/logs/logfile.log"
encoder = PatternLayoutEncoder().apply {
context = lc
pattern = "%-12date{yyyy-MM-dd HH:mm:ss.SSS} %logger{12} %-5level - %msg%n"
start()
}
isAppend = true
rollingPolicy = TimeBasedRollingPolicy<ILoggingEvent>().apply {
context = lc
fileNamePattern = "/mnt/hdd/cz.myq.roger.ricoh/logs/logfile-%d{yyyy-MM-dd}.log.zip"
maxHistory = 7
setTotalSizeCap(FileSize.valueOf("100MB"))
}.also {
it.setParent(this@apply)
it.start()
}
start()
}
root.addAppender(logFileAppender)
lc.getLogger(DNSIncoming::class.java).level = Level.WARN
} catch (e: Exception) {
logger.error("Error starting log", e)
}
}

适用于任何寻求答案的人。我遵循了@kdgregory的评论,并以这种方式实现了它:

class MyAppender : RollingFileAppender<ILoggingEvent>() {
private val buffer = mutableListOf<ILoggingEvent>()
fun initHdd() {
if (hddInit) return
try {
super.openFile(file)
hddInit = true
buffer.forEach {
append(it)
}
buffer.clear()
} catch (e: Exception) {
}
}

override fun openFile(file_name: String?): Boolean {
if (!hddInit) outputStream = NullOutputStream()
else super.openFile(file_name)
return true
}

override fun subAppend(event: ILoggingEvent) {
if (hddInit) super.subAppend(event)
else {
if (buffer.size >= MAX_BUFFER_SIZE) return
buffer.add(event)
}
}
companion object {
private const val MAX_BUFFER_SIZE = 1000;
private const val MAX_TAG_LENGTH = 23
var hddInit = false
}
}

最新更新