improve(logger/log4j): use reusable message for better performance

This commit is contained in:
AdoptOSS 2022-02-12 20:28:48 +08:00 committed by Him188
parent 1d2c219b9d
commit 4586203c80

View File

@ -13,45 +13,51 @@ import net.mamoe.mirai.utils.MiraiLoggerPlatformBase
import org.apache.logging.log4j.Marker import org.apache.logging.log4j.Marker
import org.apache.logging.log4j.MarkerManager import org.apache.logging.log4j.MarkerManager
import org.apache.logging.log4j.message.Message import org.apache.logging.log4j.message.Message
import org.apache.logging.log4j.message.SimpleMessage import org.apache.logging.log4j.message.ReusableMessageFactory
import org.apache.logging.log4j.message.SimpleMessageFactory import org.apache.logging.log4j.message.ReusableSimpleMessage
import java.util.logging.Level as JulLevel import java.util.logging.Level as JulLevel
import java.util.logging.Logger as JulLogger import java.util.logging.Logger as JulLogger
private inline fun ReusableMessageFactory.takeMessage(message: String?, crossinline block: (message: Message) -> Unit) {
val msg = this.newMessage(message) as ReusableSimpleMessage
block(msg)
msg.clear()
}
internal class Log4jLoggerAdapter( internal class Log4jLoggerAdapter(
private val logger: org.apache.logging.log4j.Logger, private val logger: org.apache.logging.log4j.Logger,
override val marker: Marker?, override val marker: Marker?,
) : MiraiLoggerPlatformBase(), MarkedMiraiLogger { ) : MiraiLoggerPlatformBase(), MarkedMiraiLogger {
val factory: SimpleMessageFactory = SimpleMessageFactory.INSTANCE val factory: ReusableMessageFactory = ReusableMessageFactory.INSTANCE
override fun verbose0(message: String?, e: Throwable?) { override fun verbose0(message: String?, e: Throwable?) {
val marker = marker factory.takeMessage(message) {
if (marker != null) logger.trace(marker, factory.newMessage(message), e) logger.trace(marker, it, e)
else logger.trace(factory.newMessage(message), e) }
} }
override fun debug0(message: String?, e: Throwable?) { override fun debug0(message: String?, e: Throwable?) {
val marker = marker factory.takeMessage(message) {
if (marker != null) logger.debug(marker, factory.newMessage(message), e) logger.debug(marker, it, e)
else logger.debug(factory.newMessage(message), e) }
} }
override fun info0(message: String?, e: Throwable?) { override fun info0(message: String?, e: Throwable?) {
val marker = marker factory.takeMessage(message) {
if (marker != null) logger.info(marker, factory.newMessage(message), e) logger.info(marker, it, e)
else logger.info(factory.newMessage(message), e) }
} }
override fun warning0(message: String?, e: Throwable?) { override fun warning0(message: String?, e: Throwable?) {
val marker = marker factory.takeMessage(message) {
if (marker != null) logger.warn(marker, factory.newMessage(message), e) logger.warn(marker, it, e)
else logger.warn(factory.newMessage(message), e) }
} }
override fun error0(message: String?, e: Throwable?) { override fun error0(message: String?, e: Throwable?) {
val marker = marker factory.takeMessage(message) {
if (marker != null) logger.error(marker, factory.newMessage(message), e) logger.error(marker, it, e)
else logger.error(factory.newMessage(message), e) }
} }
override val isVerboseEnabled: Boolean get() = logger.isTraceEnabled override val isVerboseEnabled: Boolean get() = logger.isTraceEnabled