mirror of
https://github.com/corda/corda.git
synced 2025-06-16 14:18:20 +00:00
ENT-2695 Restore async logging (#4195)
* Replace error code generation technique with custom event re-writer. Switch to RandomAccessFile appenders because they supposedly give higher throughput. * Review feedback
This commit is contained in:
@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
<!-- Will generate up to 100 log files for a given day. During every rollover it will delete
|
<!-- Will generate up to 100 log files for a given day. During every rollover it will delete
|
||||||
those that are older than 60 days, but keep the most recent 10 GB -->
|
those that are older than 60 days, but keep the most recent 10 GB -->
|
||||||
<RollingFile name="RollingFile-Appender"
|
<RollingRandomAccessFile name="RollingFile-Appender"
|
||||||
fileName="${log-path}/${log-name}.log"
|
fileName="${log-path}/${log-name}.log"
|
||||||
filePattern="${archive}/${log-name}.%date{yyyy-MM-dd}-%i.log.gz">
|
filePattern="${archive}/${log-name}.%date{yyyy-MM-dd}-%i.log.gz">
|
||||||
|
|
||||||
@ -71,29 +71,44 @@
|
|||||||
</Delete>
|
</Delete>
|
||||||
</DefaultRolloverStrategy>
|
</DefaultRolloverStrategy>
|
||||||
|
|
||||||
</RollingFile>
|
</RollingRandomAccessFile>
|
||||||
|
|
||||||
|
<Rewrite name="Console-ErrorCode-Appender">
|
||||||
|
<AppenderRef ref="Console-Appender"/>
|
||||||
|
<ErrorCodeRewritePolicy/>
|
||||||
|
</Rewrite>
|
||||||
|
|
||||||
|
<Rewrite name="Console-ErrorCode-Appender-Println">
|
||||||
|
<AppenderRef ref="Console-Appender-Println"/>
|
||||||
|
<ErrorCodeRewritePolicy/>
|
||||||
|
</Rewrite>
|
||||||
|
|
||||||
|
<Rewrite name="RollingFile-ErrorCode-Appender">
|
||||||
|
<AppenderRef ref="RollingFile-Appender"/>
|
||||||
|
<ErrorCodeRewritePolicy/>
|
||||||
|
</Rewrite>
|
||||||
</Appenders>
|
</Appenders>
|
||||||
|
|
||||||
<Loggers>
|
<Loggers>
|
||||||
<Root level="${defaultLogLevel}">
|
<Root level="${defaultLogLevel}">
|
||||||
<AppenderRef ref="Console-Appender" level="${consoleLogLevel}"/>
|
<AppenderRef ref="Console-ErrorCode-Appender" level="${consoleLogLevel}"/>
|
||||||
<AppenderRef ref="RollingFile-Appender"/>
|
<AppenderRef ref="RollingFile-ErrorCode-Appender"/>
|
||||||
</Root>
|
</Root>
|
||||||
<Logger name="BasicInfo" additivity="false">
|
<Logger name="BasicInfo" additivity="false">
|
||||||
<AppenderRef ref="Console-Appender-Println"/>
|
<AppenderRef ref="Console-ErrorCode-Appender-Println"/>
|
||||||
<AppenderRef ref="RollingFile-Appender" />
|
<AppenderRef ref="RollingFile-ErrorCode-Appender"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
<Logger name="org.hibernate.SQL" level="info" additivity="false">
|
<Logger name="org.hibernate.SQL" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console-Appender"/>
|
<AppenderRef ref="Console-ErrorCode-Appender"/>
|
||||||
<AppenderRef ref="RollingFile-Appender"/>
|
<AppenderRef ref="RollingFile-ErrorCode-Appender"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
<Logger name="org.apache.activemq.artemis.core.server" level="error" additivity="false">
|
<Logger name="org.apache.activemq.artemis.core.server" level="error" additivity="false">
|
||||||
<AppenderRef ref="Console-Appender"/>
|
<AppenderRef ref="Console-ErrorCode-Appender"/>
|
||||||
<AppenderRef ref="RollingFile-Appender"/>
|
<AppenderRef ref="RollingFile-ErrorCode-Appender"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
<Logger name="org.jolokia" additivity="true" level="warn">
|
<Logger name="org.jolokia" additivity="true" level="warn">
|
||||||
<AppenderRef ref="Console-Appender-Println"/>
|
<AppenderRef ref="Console-ErrorCode-Appender-Println"/>
|
||||||
<AppenderRef ref="RollingFile-Appender" />
|
<AppenderRef ref="RollingFile-ErrorCode-Appender"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
</Loggers>
|
</Loggers>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
log4jContextSelector=net.corda.node.utilities.logging.AsyncLoggerContextSelectorNoThreadLocal
|
Log4jContextSelector=net.corda.node.utilities.logging.AsyncLoggerContextSelectorNoThreadLocal
|
||||||
AsyncLogger.RingBufferSize=262144
|
AsyncLogger.RingBufferSize=262144
|
@ -0,0 +1,12 @@
|
|||||||
|
package net.corda.node.utilities.logging
|
||||||
|
|
||||||
|
import org.junit.Test
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncLoggingTest {
|
||||||
|
@Test
|
||||||
|
fun `async logging is configured`() {
|
||||||
|
assertTrue(AsyncLoggerContextSelectorNoThreadLocal.isSelected())
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Configuration status="info">
|
<Configuration status="info" packages="net.corda.cliutils">
|
||||||
|
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="log-path">${sys:log-path:-logs}</Property>
|
<Property name="log-path">${sys:log-path:-logs}</Property>
|
||||||
@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
<!-- Will generate up to 100 log files for a given day. During every rollover it will delete
|
<!-- Will generate up to 100 log files for a given day. During every rollover it will delete
|
||||||
those that are older than 60 days, but keep the most recent 10 GB -->
|
those that are older than 60 days, but keep the most recent 10 GB -->
|
||||||
<RollingFile name="RollingFile-Appender"
|
<RollingRandomAccessFile name="RollingFile-Appender"
|
||||||
fileName="${log-path}/${log-name}.log"
|
fileName="${log-path}/${log-name}.log"
|
||||||
filePattern="${archive}/${log-name}.%date{yyyy-MM-dd}-%i.log.gz">
|
filePattern="${archive}/${log-name}.%date{yyyy-MM-dd}-%i.log.gz">
|
||||||
|
|
||||||
@ -59,32 +59,47 @@
|
|||||||
</Delete>
|
</Delete>
|
||||||
</DefaultRolloverStrategy>
|
</DefaultRolloverStrategy>
|
||||||
|
|
||||||
</RollingFile>
|
</RollingRandomAccessFile>
|
||||||
|
|
||||||
|
<Rewrite name="Console-ErrorCode-Appender">
|
||||||
|
<AppenderRef ref="Console-Appender"/>
|
||||||
|
<ErrorCodeRewritePolicy/>
|
||||||
|
</Rewrite>
|
||||||
|
|
||||||
|
<Rewrite name="Console-ErrorCode-Appender-Println">
|
||||||
|
<AppenderRef ref="Console-Appender-Println"/>
|
||||||
|
<ErrorCodeRewritePolicy/>
|
||||||
|
</Rewrite>
|
||||||
|
|
||||||
|
<Rewrite name="RollingFile-ErrorCode-Appender">
|
||||||
|
<AppenderRef ref="RollingFile-Appender"/>
|
||||||
|
<ErrorCodeRewritePolicy/>
|
||||||
|
</Rewrite>
|
||||||
</Appenders>
|
</Appenders>
|
||||||
|
|
||||||
<Loggers>
|
<Loggers>
|
||||||
<Root level="info">
|
<Root level="info">
|
||||||
<AppenderRef ref="Console-Appender"/>
|
<AppenderRef ref="Console-ErrorCode-Appender"/>
|
||||||
</Root>
|
</Root>
|
||||||
<Logger name="net.corda" level="${defaultLogLevel}" additivity="false">
|
<Logger name="net.corda" level="${defaultLogLevel}" additivity="false">
|
||||||
<AppenderRef ref="Console-Appender"/>
|
<AppenderRef ref="Console-ErrorCode-Appender"/>
|
||||||
<AppenderRef ref="RollingFile-Appender" />
|
<AppenderRef ref="RollingFile-ErrorCode-Appender" />
|
||||||
</Logger>
|
</Logger>
|
||||||
<Logger name="BasicInfo" additivity="false">
|
<Logger name="BasicInfo" additivity="false">
|
||||||
<AppenderRef ref="Console-Appender-Println"/>
|
<AppenderRef ref="Console-ErrorCode-Appender-Println"/>
|
||||||
<AppenderRef ref="RollingFile-Appender" />
|
<AppenderRef ref="RollingFile-ErrorCode-Appender"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
<Logger name="org.hibernate.SQL" level="info" additivity="false">
|
<Logger name="org.hibernate.SQL" level="info" additivity="false">
|
||||||
<AppenderRef ref="Console-Appender"/>
|
<AppenderRef ref="Console-ErrorCode-Appender"/>
|
||||||
<AppenderRef ref="RollingFile-Appender"/>
|
<AppenderRef ref="RollingFile-ErrorCode-Appender"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
<Logger name="org.apache.activemq.artemis.core.server" level="error" additivity="false">
|
<Logger name="org.apache.activemq.artemis.core.server" level="error" additivity="false">
|
||||||
<AppenderRef ref="Console-Appender"/>
|
<AppenderRef ref="Console-ErrorCode-Appender"/>
|
||||||
<AppenderRef ref="RollingFile-Appender"/>
|
<AppenderRef ref="RollingFile-ErrorCode-Appender"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
<Logger name="org.jolokia" additivity="true" level="warn">
|
<Logger name="org.jolokia" additivity="true" level="warn">
|
||||||
<AppenderRef ref="Console-Appender-Println"/>
|
<AppenderRef ref="Console-ErrorCode-Appender-Println"/>
|
||||||
<AppenderRef ref="RollingFile-Appender" />
|
<AppenderRef ref="RollingFile-ErrorCode-Appender"/>
|
||||||
</Logger>
|
</Logger>
|
||||||
</Loggers>
|
</Loggers>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
package net.corda.cliutils
|
|
||||||
|
|
||||||
import org.apache.logging.log4j.core.LoggerContext
|
|
||||||
import org.apache.logging.log4j.core.config.Configuration
|
|
||||||
import org.apache.logging.log4j.core.config.ConfigurationFactory
|
|
||||||
import org.apache.logging.log4j.core.config.ConfigurationSource
|
|
||||||
import org.apache.logging.log4j.core.config.Order
|
|
||||||
import org.apache.logging.log4j.core.config.plugins.Plugin
|
|
||||||
import org.apache.logging.log4j.core.config.xml.XmlConfiguration
|
|
||||||
import org.apache.logging.log4j.core.impl.LogEventFactory
|
|
||||||
|
|
||||||
@Plugin(name = "CordaLog4j2ConfigFactory", category = "ConfigurationFactory")
|
|
||||||
@Order(Integer.MAX_VALUE)
|
|
||||||
class CordaLog4j2ConfigFactory : ConfigurationFactory() {
|
|
||||||
private companion object {
|
|
||||||
private val SUPPORTED_TYPES = arrayOf(".xml", "*")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getConfiguration(loggerContext: LoggerContext, source: ConfigurationSource): Configuration = ErrorCodeAppendingConfiguration(loggerContext, source)
|
|
||||||
|
|
||||||
override fun getSupportedTypes() = SUPPORTED_TYPES
|
|
||||||
|
|
||||||
private class ErrorCodeAppendingConfiguration(loggerContext: LoggerContext, source: ConfigurationSource) : XmlConfiguration(loggerContext, source) {
|
|
||||||
override fun doConfigure() {
|
|
||||||
super.doConfigure()
|
|
||||||
loggers.values.forEach {
|
|
||||||
val existingFactory = it.logEventFactory
|
|
||||||
it.logEventFactory = LogEventFactory { loggerName, marker, fqcn, level, message, properties, error ->
|
|
||||||
existingFactory.createEvent(loggerName, marker, fqcn, level, message?.withErrorCodeFor(error, level), properties, error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,28 @@
|
|||||||
|
package net.corda.cliutils
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.core.Core
|
||||||
|
import org.apache.logging.log4j.core.LogEvent
|
||||||
|
import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy
|
||||||
|
import org.apache.logging.log4j.core.config.plugins.Plugin
|
||||||
|
import org.apache.logging.log4j.core.config.plugins.PluginFactory
|
||||||
|
import org.apache.logging.log4j.core.impl.Log4jLogEvent
|
||||||
|
|
||||||
|
@Plugin(name = "ErrorCodeRewritePolicy", category = Core.CATEGORY_NAME, elementType = "rewritePolicy", printObject = false)
|
||||||
|
class ErrorCodeRewritePolicy : RewritePolicy {
|
||||||
|
override fun rewrite(source: LogEvent?): LogEvent? {
|
||||||
|
val newMessage = source?.message?.withErrorCodeFor(source.thrown, source.level)
|
||||||
|
return if (newMessage == source?.message) {
|
||||||
|
source
|
||||||
|
} else {
|
||||||
|
Log4jLogEvent.Builder(source).setMessage(newMessage).build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@JvmStatic
|
||||||
|
@PluginFactory
|
||||||
|
fun createPolicy(): ErrorCodeRewritePolicy {
|
||||||
|
return ErrorCodeRewritePolicy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1 +0,0 @@
|
|||||||
log4j.configurationFactory=net.corda.cliutils.CordaLog4j2ConfigFactory
|
|
Reference in New Issue
Block a user