<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" packages="net.corda.common.logging" shutdownHook="disable">

    <Properties>
        <Property name="log-path">${sys:log-path:-logs}</Property>
        <Property name="log-name">node-${hostName}</Property>
        <Property name="diagnostic-log-name">diagnostic-${hostName}</Property>
        <Property name="archive">${log-path}/archive</Property>
        <Property name="defaultLogLevel">${sys:defaultLogLevel:-info}</Property>
        <Property name="consoleLogLevel">${sys:consoleLogLevel:-error}</Property>
    </Properties>

    <Appenders>
        <ScriptAppenderSelector name="Console-Selector">
            <Script language="nashorn"><![CDATA[
                var System = Java.type('java.lang.System');
                var level = System.getProperty("consoleLogLevel");
                var enabled = System.getProperty("consoleLoggingEnabled");
                enabled == "true" && (level == "debug" || level == "trace") ? "Console-Debug-Appender" : "Console-Appender";
            ]]></Script>
            <AppenderSet>

                <!-- The default console appender - prints no exception information -->
                <Console name="Console-Appender" target="SYSTEM_OUT">
                    <PatternLayout>
                        <ScriptPatternSelector
                                defaultPattern="%highlight{[%level{length=5}] %date{HH:mm:ssZ} [%t] %c{2}.%method - %msg%n%throwable{0}}{INFO=white,WARN=red,FATAL=bright red}">
                            <Script name="MDCSelector" language="javascript"><![CDATA[
                                result = null;
                                if (!logEvent.getContextData().size() == 0) {
                                    result = "WithMDC";
                                } else {
                                    result = null;
                                }
                                result;
                                ]]>
                            </Script>
                            <PatternMatch key="WithMDC" pattern="%highlight{[%level{length=5}] %date{HH:mm:ssZ} [%t] %c{2}.%method - %msg %X%n%throwable{0}}{INFO=white,WARN=red,FATAL=bright red}"/>
                        </ScriptPatternSelector>
                    </PatternLayout>
                </Console>

                <!-- The console appender when debug or trace level logging is specified. Prints full stack trace -->
                <Console name="Console-Debug-Appender" target="SYSTEM_OUT">
                    <PatternLayout>
                        <ScriptPatternSelector defaultPattern="%highlight{[%level{length=5}] %date{HH:mm:ssZ} [%t] %c{2}.%method - %msg%n%throwable{}}{INFO=white,WARN=red,FATAL=bright red}">
                            <Script name="MDCSelector" language="javascript"><![CDATA[
                                result = null;
                                if (!logEvent.getContextData().size() == 0) {
                                    result = "WithMDC";
                                } else {
                                    result = null;
                                }
                                result;
                                ]]>
                            </Script>
                            <PatternMatch key="WithMDC" pattern="%highlight{[%level{length=5}] %date{HH:mm:ssZ} [%t] %c{2}.%method - %msg %X%n%throwable{}}{INFO=white,WARN=red,FATAL=bright red}"/>
                        </ScriptPatternSelector>
                    </PatternLayout>
                </Console>
            </AppenderSet>
        </ScriptAppenderSelector>

        <!-- Required for printBasicInfo -->
        <Console name="Console-Appender-Println" target="SYSTEM_OUT">
            <PatternLayout pattern="%msg%n%throwable{0}" />
        </Console>

        <!-- 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 -->
        <RollingRandomAccessFile name="RollingFile-Appender"
                     fileName="${log-path}/${log-name}.log"
                     filePattern="${archive}/${log-name}.%date{yyyy-MM-dd}-%i.log.gz">

            <PatternLayout>
                <ScriptPatternSelector defaultPattern="[%-5level] %date{ISO8601}{UTC}Z [%t] %c{2}.%method - %msg%n">
                    <Script name="MDCSelector" language="javascript"><![CDATA[
                    result = null;
                    if (!logEvent.getContextData().size() == 0) {
                        result = "WithMDC";
                    } else {
                        result = null;
                    }
                    result;
               ]]>
                    </Script>
                    <PatternMatch key="WithMDC" pattern="[%-5level] %date{ISO8601}{UTC}Z [%t] %c{2}.%method - %msg %X%n"/>
                </ScriptPatternSelector>
            </PatternLayout>

            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>

            <DefaultRolloverStrategy min="1" max="100">
                <Delete basePath="${archive}" maxDepth="1">
                    <IfFileName glob="${log-name}*.log.gz"/>
                    <IfLastModified age="60d">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="10 GB"/>
                        </IfAny>
                    </IfLastModified>
                </Delete>
            </DefaultRolloverStrategy>

        </RollingRandomAccessFile>

        <!-- 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 -->
        <RollingRandomAccessFile name="Diagnostic-RollingFile-Appender"
                     fileName="${log-path}/${diagnostic-log-name}.log"
                     filePattern="${archive}/${diagnostic-log-name}.%date{yyyy-MM-dd}-%i.log.gz">

            <PatternLayout>
                <ScriptPatternSelector defaultPattern="[%-5level] %date{ISO8601}{UTC}Z [%t] %c{2}.%method - %msg%n">
                    <Script name="MDCSelector" language="javascript"><![CDATA[
                    result = null;
                    if (!logEvent.getContextData().size() == 0) {
                        result = "WithMDC";
                    } else {
                        result = null;
                    }
                    result;
               ]]>
                    </Script>
                    <PatternMatch key="WithMDC" pattern="[%-5level] %date{ISO8601}{UTC}Z [%t] %c{2}.%method - %msg %X%n"/>
                </ScriptPatternSelector>
            </PatternLayout>

            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>

            <DefaultRolloverStrategy min="1" max="100">
                <Delete basePath="${archive}" maxDepth="1">
                    <IfFileName glob="${log-name}*.log.gz"/>
                    <IfLastModified age="60d">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="10 GB"/>
                        </IfAny>
                    </IfLastModified>
                </Delete>
            </DefaultRolloverStrategy>

        </RollingRandomAccessFile>

        <RollingFile name="Checkpoint-Agent-RollingFile-Appender"
                     fileName="${log-path}/checkpoints_agent-${date:yyyyMMdd-HHmmss}.log"
                     filePattern="${archive}/checkpoints_agent.%date{yyyy-MM-dd}-%i.log.gz">

            <PatternLayout pattern="[%-5level] %date{ISO8601}{UTC}Z [%t] %c{2}.%method - %msg%n"/>

            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>

            <DefaultRolloverStrategy min="1" max="100">
                <Delete basePath="${archive}" maxDepth="1">
                    <IfFileName glob="${log-name}*.log.gz"/>
                    <IfLastModified age="60d">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="10 GB"/>
                        </IfAny>
                    </IfLastModified>
                </Delete>
            </DefaultRolloverStrategy>

        </RollingFile>

        <Rewrite name="Console-ErrorCode-Selector">
            <AppenderRef ref="Console-Selector"/>
            <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>
        <Rewrite name="Diagnostic-RollingFile-ErrorCode-Appender">
            <AppenderRef ref="Diagnostic-RollingFile-Appender"/>
            <ErrorCodeRewritePolicy/>
        </Rewrite>
    </Appenders>

    <Loggers>
        <Root level="${defaultLogLevel}">
            <AppenderRef ref="Console-ErrorCode-Selector" level="${consoleLogLevel}"/>
            <AppenderRef ref="RollingFile-ErrorCode-Appender"/>
        </Root>
        <Logger name="BasicInfo" additivity="false">
            <AppenderRef ref="Console-ErrorCode-Appender-Println"/>
            <AppenderRef ref="RollingFile-ErrorCode-Appender"/>
        </Logger>
        <Logger name="org.hibernate" level="warn" additivity="false">
            <AppenderRef ref="Diagnostic-RollingFile-ErrorCode-Appender"/>
        </Logger>
        <Logger name="org.hibernate.SQL" level="info" additivity="false">
            <AppenderRef ref="Console-ErrorCode-Selector"/>
            <AppenderRef ref="RollingFile-ErrorCode-Appender"/>
        </Logger>
        <Logger name="org.apache.activemq.artemis.core.server" level="error" additivity="false">
            <AppenderRef ref="Console-ErrorCode-Selector"/>
            <AppenderRef ref="RollingFile-ErrorCode-Appender"/>
        </Logger>
        <Logger name="org.jolokia" additivity="true" level="warn">
            <AppenderRef ref="Console-ErrorCode-Appender-Println"/>
            <AppenderRef ref="RollingFile-ErrorCode-Appender"/>
        </Logger>
        <Logger name="CheckpointAgent" level="debug" additivity="false">
            <AppenderRef ref="Checkpoint-Agent-RollingFile-Appender"/>
        </Logger>
    </Loggers>
</Configuration>
