From d98fe2341169ba2ac49eae8a2c3556ed61935ca7 Mon Sep 17 00:00:00 2001 From: Andre Kurait Date: Tue, 23 Apr 2024 11:25:17 -0500 Subject: [PATCH 1/7] Move log4j2 appenders to high performance async loggers Signed-off-by: Andre Kurait --- TrafficCapture/trafficCaptureProxyServer/build.gradle | 10 ++++++---- .../src/main/resources/log4j2.component.properties | 2 ++ TrafficCapture/trafficReplayer/build.gradle | 11 +++++++---- .../src/main/resources/log4j2.component.properties | 2 ++ 4 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.component.properties create mode 100644 TrafficCapture/trafficReplayer/src/main/resources/log4j2.component.properties diff --git a/TrafficCapture/trafficCaptureProxyServer/build.gradle b/TrafficCapture/trafficCaptureProxyServer/build.gradle index 43528ea3a..87e63c8ca 100644 --- a/TrafficCapture/trafficCaptureProxyServer/build.gradle +++ b/TrafficCapture/trafficCaptureProxyServer/build.gradle @@ -29,10 +29,12 @@ dependencies { implementation project(':coreUtilities') implementation group: 'io.netty', name: 'netty-all', version: '4.1.100.Final' - implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0' - implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0' - implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j2-impl', version: '2.20.0' - implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.7' + + implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.23.1' + implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.23.1' + implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j2-impl', version: '2.23.1' + implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.13' + implementation group: 'com.lmax', name: 'disruptor', version: '4.0.0' implementation group: 'com.beust', name: 'jcommander', version: '1.82' implementation 'com.google.protobuf:protobuf-java:3.22.2' diff --git a/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.component.properties b/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.component.properties new file mode 100644 index 000000000..62c51de25 --- /dev/null +++ b/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.component.properties @@ -0,0 +1,2 @@ +Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector +AsyncLogger.WaitStrategy=Yield \ No newline at end of file diff --git a/TrafficCapture/trafficReplayer/build.gradle b/TrafficCapture/trafficReplayer/build.gradle index bf00fe21b..1f3af04f9 100644 --- a/TrafficCapture/trafficReplayer/build.gradle +++ b/TrafficCapture/trafficReplayer/build.gradle @@ -50,11 +50,14 @@ dependencies { implementation group: 'io.github.resilience4j', name: 'resilience4j-ratelimiter', version:"${resilience4jVersion}" implementation group: 'io.github.resilience4j', name: 'resilience4j-retry', version:"${resilience4jVersion}" implementation group: 'io.netty', name: 'netty-all', version: '4.1.100.Final' + implementation group: 'org.apache.kafka', name: 'kafka-clients', version: '3.6.0' - implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0' - implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0' - implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j2-impl', version: '2.20.0' - implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.7' + implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.23.1' + implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.23.1' + implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j2-impl', version: '2.23.1' + implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.13' + implementation group: 'com.lmax', name: 'disruptor', version: '4.0.0' + implementation group: 'software.amazon.awssdk', name: 'arns', version: '2.20.102' implementation group: 'software.amazon.awssdk', name: 'auth', version: '2.20.102' implementation group: 'software.amazon.awssdk', name: 'sdk-core', version: '2.20.102' diff --git a/TrafficCapture/trafficReplayer/src/main/resources/log4j2.component.properties b/TrafficCapture/trafficReplayer/src/main/resources/log4j2.component.properties new file mode 100644 index 000000000..62c51de25 --- /dev/null +++ b/TrafficCapture/trafficReplayer/src/main/resources/log4j2.component.properties @@ -0,0 +1,2 @@ +Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector +AsyncLogger.WaitStrategy=Yield \ No newline at end of file From a641dffc2d873954f2ce7fe50611bc2414c0a95e Mon Sep 17 00:00:00 2001 From: Andre Kurait Date: Tue, 23 Apr 2024 11:25:49 -0500 Subject: [PATCH 2/7] Enhance logging with microsecond clock and enhanced performance options Signed-off-by: Andre Kurait --- .../src/main/resources/log4j2.properties | 3 ++- .../src/main/resources/log4j2.properties | 22 ++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties b/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties index b7cda4aeb..25a544032 100644 --- a/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties +++ b/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties @@ -6,7 +6,8 @@ appender.console.type = Console appender.console.name = STDERR appender.console.target = SYSTEM_ERR appender.console.layout.type = PatternLayout -appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss,SSS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx=\{\}}{}%n +appender.console.layout.pattern = [%-5level] %d{DEFAULT_MICROS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx=\{\}}{}%n +appender.console.direct = true rootLogger.level = info rootLogger.appenderRefs = stderr diff --git a/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties b/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties index e495efd21..078ae896b 100644 --- a/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties +++ b/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties @@ -1,4 +1,4 @@ -status = error +status = warn property.tupleDir = ${env:TUPLE_DIR_PATH:-./logs/tuples} @@ -8,14 +8,15 @@ appender.console.type = Console appender.console.name = STDERR appender.console.target = SYSTEM_ERR appender.console.layout.type = PatternLayout -appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss,SSS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx={}}{}%n +appender.console.layout.pattern = [%-5level] %d{DEFAULT_MICROS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx={}}{}%n +appender.console.direct = true -appender.ReplayerLogFile.type = RollingFile +appender.ReplayerLogFile.type = RollingRandomAccessFile appender.ReplayerLogFile.name = ReplayerLogFile appender.ReplayerLogFile.fileName = logs/replayer.log appender.ReplayerLogFile.filePattern = logs/%d{yyyy-MM}{UTC}/replayer-%d{yyyy-MM-dd-HH-mm}{UTC}-%i.log.gz appender.ReplayerLogFile.layout.type = PatternLayout -appender.ReplayerLogFile.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss,SSS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx={}}{}%n +appender.ReplayerLogFile.layout.pattern = [%-5level] %d{DEFAULT_MICROS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx={}}{}%n appender.ReplayerLogFile.policies.type = Policies appender.ReplayerLogFile.policies.time.type = TimeBasedTriggeringPolicy appender.ReplayerLogFile.policies.time.interval = 60 @@ -23,10 +24,10 @@ appender.ReplayerLogFile.policies.time.modulate = true appender.ReplayerLogFile.strategy.type = DefaultRolloverStrategy appender.ReplayerLogFile.strategy.max = 288 -appender.OUTPUT_TUPLES.type = RollingFile +appender.OUTPUT_TUPLES.type = RollingRandomAccessFile appender.OUTPUT_TUPLES.name = OUTPUT_TUPLES appender.OUTPUT_TUPLES.fileName = ${tupleDir}/tuples.log -appender.OUTPUT_TUPLES.filePattern = ${tupleDir}/tuples-%d{yyyy-MM-dd-HH:mm}{UTC}.log +appender.OUTPUT_TUPLES.filePattern = ${tupleDir}/tuples-%d{yyyy-MM-dd-HH:mm}{UTC}-%i.log.gz appender.OUTPUT_TUPLES.layout.type = PatternLayout appender.OUTPUT_TUPLES.layout.pattern = %m%n appender.OUTPUT_TUPLES.policies.type = Policies @@ -38,9 +39,10 @@ appender.TRANSACTION_SUMMARIES.type = Console appender.TRANSACTION_SUMMARIES.name = TransactionSummariesConsole appender.TRANSACTION_SUMMARIES.target = SYSTEM_OUT appender.TRANSACTION_SUMMARIES.layout.type = PatternLayout -appender.TRANSACTION_SUMMARIES.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS}{UTC}: %msg%n +appender.TRANSACTION_SUMMARIES.layout.pattern = %d{DEFAULT_MICROS}{UTC}: %msg%n +appender.TRANSACTION_SUMMARIES.direct = true -appender.TRANSACTION_SUMMARIES_LOGFILE.type = RollingFile +appender.TRANSACTION_SUMMARIES_LOGFILE.type = RollingRandomAccessFile appender.TRANSACTION_SUMMARIES_LOGFILE.name = TransactionSummariesFile appender.TRANSACTION_SUMMARIES_LOGFILE.fileName = logs/progress.log appender.TRANSACTION_SUMMARIES_LOGFILE.filePattern = logs/%d{yyyy-MM}{UTC}/progress-%d{yyyy-MM-dd-HH-mm}{UTC}-%i.log.gz @@ -53,10 +55,10 @@ appender.TRANSACTION_SUMMARIES_LOGFILE.policies.time.modulate = true appender.TRANSACTION_SUMMARIES_LOGFILE.strategy.type = DefaultRolloverStrategy appender.TRANSACTION_SUMMARIES_LOGFILE.strategy.max = 720 -appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.type = RollingFile +appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.type = RollingRandomAccessFile appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.name = AllActiveWorkMonitorFile appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.fileName = logs/longRunningActivity.log -appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.filePattern = logs/%d{yyyy-MM}{UTC}/longRunningActivity-%d{yyyy-MM-dd-HH-mm}{UTC}-%i.log +appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.filePattern = logs/%d{yyyy-MM}{UTC}/longRunningActivity-%d{yyyy-MM-dd-HH-mm}{UTC}-%i.log.gz appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.layout.type = PatternLayout appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.layout.pattern = %msg ([%-5level] %d{yyyy-MM-dd HH:mm:ss,SSS}{UTC})%n appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.policies.type = Policies From 0a18fbb03a8083e51b31f6108c68893d92fde7ab Mon Sep 17 00:00:00 2001 From: Andre Kurait Date: Tue, 23 Apr 2024 11:26:44 -0500 Subject: [PATCH 3/7] Add multilinePattern to log driver Signed-off-by: Andre Kurait --- .../lib/service-stacks/migration-service-core.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts index e0ed0a071..254b1722f 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts @@ -12,7 +12,8 @@ import { ServiceConnectService, Ulimit, OperatingSystemFamily, - Volume + Volume, + AwsLogDriverMode } from "aws-cdk-lib/aws-ecs"; import {DockerImageAsset} from "aws-cdk-lib/aws-ecr-assets"; import {RemovalPolicy, Stack} from "aws-cdk-lib"; @@ -130,7 +131,13 @@ export class MigrationServiceCore extends Stack { portMappings: props.portMappings, logging: LogDrivers.awsLogs({ streamPrefix: `${props.serviceName}-logs`, - logGroup: serviceLogGroup + logGroup: serviceLogGroup, + // E.g. "[INFO ] 2024-12-31 23:59:59..." + // and "[ERROR] 2024-12-31 23:59:59..." + // and "2024-12-31 23:59:59..." + multilinePattern: "^(\\[[A-Z ]{1,5}\\] )?\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}", + // Log appenders are non-blocking so defer async behavior to them + mode: AwsLogDriverMode.BLOCKING, }), ulimits: props.ulimits }); From 718aa6a8493fb36ecd74de06af680cce5fc855ea Mon Sep 17 00:00:00 2001 From: Andre Kurait Date: Tue, 23 Apr 2024 14:15:48 -0500 Subject: [PATCH 4/7] Add includeLocation and immediateFlush parameters to log4j2.properties Signed-off-by: Andre Kurait --- .../src/main/resources/log4j2.properties | 1 + .../trafficReplayer/src/main/resources/log4j2.properties | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties b/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties index 25a544032..dab5cc7d4 100644 --- a/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties +++ b/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties @@ -8,6 +8,7 @@ appender.console.target = SYSTEM_ERR appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%-5level] %d{DEFAULT_MICROS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx=\{\}}{}%n appender.console.direct = true +appender.console.includeLocation = true rootLogger.level = info rootLogger.appenderRefs = stderr diff --git a/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties b/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties index 078ae896b..5dc5dbacf 100644 --- a/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties +++ b/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties @@ -9,6 +9,7 @@ appender.console.name = STDERR appender.console.target = SYSTEM_ERR appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%-5level] %d{DEFAULT_MICROS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx={}}{}%n +appender.console.includeLocation = true appender.console.direct = true appender.ReplayerLogFile.type = RollingRandomAccessFile @@ -23,6 +24,8 @@ appender.ReplayerLogFile.policies.time.interval = 60 appender.ReplayerLogFile.policies.time.modulate = true appender.ReplayerLogFile.strategy.type = DefaultRolloverStrategy appender.ReplayerLogFile.strategy.max = 288 +appender.ReplayerLogFile.includeLocation = true +appender.ReplayerLogFile.immediateFlush = false appender.OUTPUT_TUPLES.type = RollingRandomAccessFile appender.OUTPUT_TUPLES.name = OUTPUT_TUPLES @@ -34,6 +37,7 @@ appender.OUTPUT_TUPLES.policies.type = Policies appender.OUTPUT_TUPLES.policies.size.type = SizeBasedTriggeringPolicy appender.OUTPUT_TUPLES.policies.size.size = 10 MB appender.OUTPUT_TUPLES.strategy.type = DefaultRolloverStrategy +appender.OUTPUT_TUPLES.immediateFlush = false appender.TRANSACTION_SUMMARIES.type = Console appender.TRANSACTION_SUMMARIES.name = TransactionSummariesConsole @@ -54,6 +58,7 @@ appender.TRANSACTION_SUMMARIES_LOGFILE.policies.time.interval = 60 appender.TRANSACTION_SUMMARIES_LOGFILE.policies.time.modulate = true appender.TRANSACTION_SUMMARIES_LOGFILE.strategy.type = DefaultRolloverStrategy appender.TRANSACTION_SUMMARIES_LOGFILE.strategy.max = 720 +appender.TRANSACTION_SUMMARIES_LOGFILE.immediateFlush = false appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.type = RollingRandomAccessFile appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.name = AllActiveWorkMonitorFile @@ -67,6 +72,7 @@ appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.policies.time.interval = 60 appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.policies.time.modulate = true appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.strategy.type = DefaultRolloverStrategy appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.strategy.max = 4 +appender.ALL_ACTIVE_WORK_MONITOR_LOGFILE.immediateFlush = false rootLogger.level = info rootLogger.appenderRef.STDERR.ref = STDERR From 5d5d8c7117819fd3ad4e90ec0668bff4e486936b Mon Sep 17 00:00:00 2001 From: Andre Kurait Date: Tue, 23 Apr 2024 15:20:57 -0500 Subject: [PATCH 5/7] Use synchronous logger in tests Signed-off-by: Andre Kurait --- TrafficCapture/build.gradle | 2 ++ .../trafficReplayer/src/test/resources/log4j2.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/TrafficCapture/build.gradle b/TrafficCapture/build.gradle index 1caf48447..7cbcc5f65 100644 --- a/TrafficCapture/build.gradle +++ b/TrafficCapture/build.gradle @@ -110,6 +110,8 @@ allprojects { // Disable parallel test execution, see MIGRATIONS-1666 systemProperty 'junit.jupiter.execution.parallel.enabled', 'false' } + systemProperty 'log4j2.contextSelector', 'org.apache.logging.log4j.core.selector.BasicContextSelector' + jvmArgs '-ea' } test { diff --git a/TrafficCapture/trafficReplayer/src/test/resources/log4j2.properties b/TrafficCapture/trafficReplayer/src/test/resources/log4j2.properties index 52d5190a1..c97fd4ccb 100644 --- a/TrafficCapture/trafficReplayer/src/test/resources/log4j2.properties +++ b/TrafficCapture/trafficReplayer/src/test/resources/log4j2.properties @@ -1,4 +1,4 @@ -status = error +status = error # Root logger options rootLogger.level = info From f5eac213eb13f1db5da02e1573980585a4363869 Mon Sep 17 00:00:00 2001 From: Andre Kurait Date: Tue, 23 Apr 2024 16:06:42 -0500 Subject: [PATCH 6/7] Update comment in migration-service-core.ts Signed-off-by: Andre Kurait --- .../lib/service-stacks/migration-service-core.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts index 254b1722f..b5b4fc482 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts @@ -136,7 +136,7 @@ export class MigrationServiceCore extends Stack { // and "[ERROR] 2024-12-31 23:59:59..." // and "2024-12-31 23:59:59..." multilinePattern: "^(\\[[A-Z ]{1,5}\\] )?\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}", - // Log appenders are non-blocking so defer async behavior to them + // Defer buffering behavior to log4j2 for greater flexibility mode: AwsLogDriverMode.BLOCKING, }), ulimits: props.ulimits From 643e8e9dc6ecd17f822c90a79cecd9f2b88b1fa2 Mon Sep 17 00:00:00 2001 From: Andre Kurait Date: Tue, 23 Apr 2024 17:30:05 -0500 Subject: [PATCH 7/7] Remove include location Signed-off-by: Andre Kurait --- .../src/main/resources/log4j2.properties | 1 - .../trafficReplayer/src/main/resources/log4j2.properties | 2 -- 2 files changed, 3 deletions(-) diff --git a/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties b/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties index dab5cc7d4..25a544032 100644 --- a/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties +++ b/TrafficCapture/trafficCaptureProxyServer/src/main/resources/log4j2.properties @@ -8,7 +8,6 @@ appender.console.target = SYSTEM_ERR appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%-5level] %d{DEFAULT_MICROS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx=\{\}}{}%n appender.console.direct = true -appender.console.includeLocation = true rootLogger.level = info rootLogger.appenderRefs = stderr diff --git a/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties b/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties index 5dc5dbacf..36a75d032 100644 --- a/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties +++ b/TrafficCapture/trafficReplayer/src/main/resources/log4j2.properties @@ -9,7 +9,6 @@ appender.console.name = STDERR appender.console.target = SYSTEM_ERR appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%-5level] %d{DEFAULT_MICROS}{UTC} [%t] %c{1} - %msg%equals{ ctx=%mdc}{ ctx={}}{}%n -appender.console.includeLocation = true appender.console.direct = true appender.ReplayerLogFile.type = RollingRandomAccessFile @@ -24,7 +23,6 @@ appender.ReplayerLogFile.policies.time.interval = 60 appender.ReplayerLogFile.policies.time.modulate = true appender.ReplayerLogFile.strategy.type = DefaultRolloverStrategy appender.ReplayerLogFile.strategy.max = 288 -appender.ReplayerLogFile.includeLocation = true appender.ReplayerLogFile.immediateFlush = false appender.OUTPUT_TUPLES.type = RollingRandomAccessFile