Plugin Documentation

CloudWatchLink
Amazon CloudWatch for Blueprints and C++

Forward UE_LOG output to CloudWatch Logs, send FPS, frame, memory and custom game metrics, query your logs with Logs Insights, and manage alarms and dashboards — with Amazon Cognito credentials, built on the official AWS SDK for C++.

v1.0
UE 4.27 & 5.8
Win64, Linux & Android
90 Blueprint nodes
Category Networking
Alpha XP

Overview

CloudWatchLink connects Unreal Engine 4.27 and 5.8 to Amazon CloudWatch and CloudWatch Logs. Your game clients and dedicated servers send their log output and performance metrics to your AWS account, where you search them, chart them on dashboards and get alarms when something goes wrong. Requests run on background worker threads with automatic retries; every result arrives on the game thread.

  • CloudWatchLink Logger (game-instance subsystem): UE_LOG forwarding with level, category and wildcard filters, structured JSON lines with context fields, background batching, flush on exit.
  • CloudWatchLink Metrics (actor component): FPS, frame time, game / render / RHI thread time, GPU time, memory, player count, ping, plus counters, gauges and timings.
  • CloudWatch Logs: groups, streams, retention, Put Log Events with automatic batching, Get Log Events, Filter Log Events.
  • Logs Insights: Run Query And Wait returns a result table in one node; ten presets for game logs; CSV export.
  • CloudWatch metrics: Put Metric(s), Get Metric Data (metric math), Get Metric Statistics (percentiles), List Metrics, Embedded Metric Format.
  • Alarms and dashboards for live-ops tools, with widget and body builders.

Requirements

RequirementDetails
Unreal Engine4.27 and 5.8
PlatformsWin64, Linux and Android
ModulesCloudWatchLink (Runtime), CloudWatchLinkSdk (prebuilt AWS SDK for C++ 1.11.916 in Source/ThirdParty)
DependenciesNo other plugins. On Linux and Android the SDK uses the engine's libcurl, OpenSSL and certificate store.
AWSAn AWS account. CloudWatch, CloudWatch Logs and Cognito usage is billed by AWS (see Costs).

Installation

  1. Install CloudWatchLink from Fab into your engine, or copy the CloudWatchLink folder into your project's Plugins folder.
  2. Enable CloudWatchLink in Edit > Plugins and restart the editor.
  3. Open Project Settings > Plugins > CloudWatchLink and set Region, Identity Pool Id, Log Group Name and Default Namespace.
  4. C++ only: add PublicDependencyModuleNames.Add("CloudWatchLink"); to your Build.cs.
Several AWS plugins in one projectEach Alpha XP cloud plugin carries its own copy of the SDK under a plugin-specific name, so they install side by side without conflicts.

Setting up AWS

  1. In Amazon Cognito create an identity pool with guest access (game clients send logs before players sign in).
  2. Create the log group, for example /mygame/client, with a retention period (or let CloudWatchLink create it — that needs logs:CreateLogGroup and logs:PutRetentionPolicy).
  3. Give the player role of the pool only what the game client needs — writing to its own log group and putting metrics in its own namespace:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
      "Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/mygame/client:*"
    },
    {
      "Effect": "Allow",
      "Action": "cloudwatch:PutMetricData",
      "Resource": "*",
      "Condition": { "StringEquals": { "cloudwatch:namespace": "Game/MyGame" } }
    }
  ]
}

If the role may not create the group, create it in the console first: the logger's first CreateLogGroup then fails with AccessDeniedException, but the group exists and forwarding continues (the stream is created with logs:CreateLogStream). To let the plugin create the group too, add logs:CreateLogGroup and logs:PutRetentionPolicy on arn:aws:logs:us-east-1:123456789012:log-group:/mygame/client.

Admin and read nodesReading logs (logs:GetLogEvents, logs:FilterLogEvents, logs:Describe*, logs:StartQuery, logs:GetQueryResults, logs:StopQuery), reading metrics (cloudwatch:GetMetricData, cloudwatch:GetMetricStatistics, cloudwatch:ListMetrics), deleting log groups / streams, alarms (cloudwatch:PutMetricAlarm, DescribeAlarms, SetAlarmState, DeleteAlarms, EnableAlarmActions, DisableAlarmActions) and dashboards (cloudwatch:PutDashboard, GetDashboard, ListDashboards, DeleteDashboards) belong in live-ops tools, editor utilities and dedicated servers using Static Keys or the Default Credential Chain — never give them to the player role: players could read each other's logs.
Never ship access keysStatic keys in the settings end up in DefaultGame.ini and in packaged games. Shipping builds refuse settings keys unless Allow Static Keys In Shipping is enabled (dedicated servers).

Quick start

Forward the Output Log

  1. Enable Auto Start Forwarding in the settings — or, in your Game Instance's Init event, get CloudWatchLink Logger and call Start Forwarding.
  2. After login call Set Context Field with Name player and the player id.
  3. Play. Lines appear in CloudWatch Logs under /mygame/client, stream MyGame/Windows/<session id>, as JSON such as {"timestamp":"2026-10-29T12:00:00.123Z","level":"Warning","category":"LogNet","message":"...","session":"...","platform":"Windows","build":"...","project":"MyGame","player":"p-42"}.

Send game metrics

  1. Add a CloudWatchLink Metrics component to your GameState (or player controller). It starts at BeginPlay.
  2. Call Increment Counter (Kills), Set Gauge (EnemiesAlive) or Record Timing (LoadTime) from gameplay.
  3. Every 60 seconds the component sends FPS, FrameTime, GameThreadTime, RenderThreadTime, RHIThreadTime, GPUTime, MemoryUsed, MemoryAvailable, PlayerCount, Ping and your metrics with the dimensions Map and Platform.

Read the latest errors back (tool)

  1. Run Query And Wait with Query = Make Logs Insights Query (Recent Errors), Log Groups empty (= the settings' group).
  2. On Success, show Results > Rows (each row a map: @timestamp, level, category, message, session) or save Query Results To CSV.

Logger (UE_LOG forwarding)

The forwarder is an output device registered with GLog plus one background sender thread, shared by the whole process.

  • Thread-safe: UE_LOG may be called from any thread. The capture step only checks level and category, copies the line into a bounded in-memory queue and returns; formatting, wildcard filtering and the network requests happen on the sender thread.
  • Never blocks the game thread: no request is ever made on the logging thread. Stop Forwarding and the end of Play In Editor return immediately; the rest is sent in the background.
  • No recursion: the category LogCloudWatchLink (the plugin's own messages and AWS SDK warnings) is never forwarded, nor is anything logged on the sender thread itself.
  • Batching: lines are sent every Flush Interval Seconds (5) or as soon as Max Batch Lines (1000) are waiting, sorted by time and split by the PutLogEvents limits (10,000 events, 1 MB, 24 hours per request, 256 KB per event).
  • Bounded memory: at most Max Buffered Lines (20,000) are kept while CloudWatch is unreachable; newer lines are counted in Get Dropped Count. Failed sends with retryable errors keep their lines for the next attempt.
  • Shutdown: on engine exit the forwarder detaches from GLog, sends what is left within Shutdown Flush Seconds (3), aborts the request in flight if it takes longer and stops its thread before the module unloads.
  • Destination: the log group from the settings (or Start Forwarding), stream <Log Stream Prefix>/<platform>/<session>; both are created when missing.

Metrics component

Frame metrics are sampled every frame, memory / players / ping every Sample Interval (5 s); everything is aggregated per Flush Interval (60 s) into statistic sets (sample count, sum, minimum, maximum), so one minute of frame times costs one data point. Counters are summed, gauges and timings become statistic sets. Thread and GPU times are measured only where frames are drawn (they are left out on dedicated servers); ping is sent on clients only. Retryable failures (throttling, network) keep the data for the next flush, up to Max Pending Datums.

MetricUnitSource
FPS / FrameTimeCount / MillisecondsReal frame time (not time-dilated)
GameThreadTime / RenderThreadTime / RHIThreadTimeMillisecondsEngine thread timers
GPUTimeMillisecondsRHI GPU frame time
MemoryUsed / MemoryAvailableMegabytesPlatform memory statistics
PlayerCount / PingCount / MillisecondsGame state player array / local player state

Node reference

All 90 nodes, grouped by Blueprint category. Latent nodes run in the background, fire exactly one final pin on the game thread and can be stopped with Cancel. Nodes marked (admin) need admin IAM permissions. Unset times on read nodes mean "the last hour" unless stated otherwise.

Config and identity

NodeKindInputsOutputsPurpose
Set RegionCallableRegion-Switches the AWS region for every following request.
Set Credential ModeCallableMode-Overrides the credential mode from the settings.
Set Login TokenCallableProvider, Token-Signs the player in to the identity pool with a provider token.
Clear Login TokensCallable--Forgets all tokens; the player becomes a guest.
Set Static CredentialsCallableAccess Key Id, Secret Access Key, Session Token-Uses these keys from now on (Static Keys mode).
Get Identity IdPure-Identity IdThe player's Cognito identity id (empty until resolved).
Make User Pool Provider NamePureRegion, User Pool IdProviderLogin key of a Cognito user pool.
Is ConfiguredPure-bool, ProblemFalse plus a reason when the settings are incomplete.
Resolve IdentityLatentForce RefreshOn Success / On Failure (Identity Id, Error)Fetches Cognito credentials now so errors show up early.
CancelCallable(latent node)-None of the node's pins fire any more; Run Query And Wait also stops its query.
Is FinishedPure(latent node)boolTrue after the node finished or was cancelled.

Logger (CloudWatchLink Logger subsystem)

NodeKindInputsOutputsPurpose
Start ForwardingCallableLog Group, Log Stream (both optional)bool, ProblemStarts capturing UE_LOG lines with the settings' filters.
Stop ForwardingCallableSend Remaining-Stops capturing; buffered lines are sent in the background or discarded.
Is ForwardingPure-boolTrue while lines are captured.
Flush NowCallable--Sends the buffer now (returns immediately).
Get Buffered CountPure-intLines waiting to be sent.
Get Dropped CountPure-int64Lines lost (buffer full, rejected, permanent errors).
Log MessageCallableLevel, Category, Message, Fields, Also Print To Output LogboolWrites your own line with extra JSON fields (no filters apply).
Log Metrics EMFCallableMetrics, Dimensions, NamespaceboolWrites metrics as an Embedded Metric Format line (no PutMetricData cost).
Set Context FieldCallableName, Value-Adds a field to every following JSON line (player, match, server...).
Remove Context FieldCallableName-Removes one context field.
Clear ContextCallable--Removes all your context fields (standard fields stay).
Set Minimum LevelCallableLevel-Forwards this level and more severe ones.
Set Category FiltersCallableAllow, Deny-Category allow list (empty = all) and deny list.
Set Message FiltersCallableInclude, Exclude-Message wildcards (* and ?).
Set Flush SettingsCallableInterval Seconds, Max Batch Lines-Send interval and early-send threshold.
Get Session IdPure-Session IdRandom id of this process (stream name, "session" field).
Get Log DestinationPure-Log Group, Log StreamWhere lines are sent.
Get Forwarder StatsPure-StatsForwarding, buffered, sent, dropped, requests, failures, last error, last flush.

Metrics component (CloudWatchLink Metrics)

NodeKindInputsOutputsPurpose
Start CollectingCallable--Starts sampling and periodic sending (automatic with Auto Start).
Stop CollectingCallableSend Remaining-Stops sampling; optionally sends what was collected.
Is CollectingPure-boolTrue while collecting.
Increment CounterCallableMetric Name, Delta-Counter summed per interval (unit Count).
Set GaugeCallableMetric Name, Value, Unit-Gauge value; min / max / average per interval.
Record TimingCallableMetric Name, Milliseconds-One duration, sent as a statistic set.
Flush MetricsCallable-boolSends everything collected now.
Set Metric DimensionCallableName, Value-Sets a dimension of every following datum.
Remove Metric DimensionCallableName-Removes a dimension.
Get Pending Datum CountPure-intData points the next flush would send.
Get Last SnapshotPure-SnapshotFPS, frame / thread / GPU ms, memory, players, ping, map of the last sample.
Set IntervalsCallableFlush Interval, Sample Interval-Changes the intervals at runtime.

Events: On Flushed (Datum Count) and On Failed (Error).

Logs

NodeKindInputsOutputsPurpose
Create Log GroupLatentLog Group, Retention Days (-1 = settings), Ignore ExistingOn Success / On Failure (Error)Creates a group and sets its retention (admin).
Create Log StreamLatentLog Group, Log Stream, Ignore ExistingOn Success / On Failure (Error)Creates a stream.
Put Log EventsLatentLog Group, Log Stream, Events, Create If MissingOn Success / On Failure (Result, Error)Writes events: sorted, split by the API limits; accepted / rejected / requests.
Get Log EventsLatentLog Group, Log Stream, Start / End Time (unset = no bound), Limit, Start From Head, Next TokenOn Success / On Failure (Page, Error)Reads a stream page by page.
Filter Log EventsLatentLog Group, Filter Pattern, Start / End Time, Log Streams, Stream Prefix, Limit, Next TokenOn Success / On Failure (Page, Error)Searches a group with a filter pattern.
Describe Log GroupsLatentPrefix, Limit, Next TokenOn Success / On Failure (Result, Error)Lists log groups with retention and size.
Describe Log StreamsLatentLog Group, Prefix, Newest First, Limit, Next TokenOn Success / On Failure (Result, Error)Lists streams by last event time or name.
Delete Log StreamLatentLog Group, Log StreamOn Success / On Failure (Error)Deletes a stream (admin).
Delete Log GroupLatentLog GroupOn Success / On Failure (Error)Deletes a group and all its data (admin).
Put Retention PolicyLatentLog Group, Retention Days (0 = never expire)On Success / On Failure (Error)Sets how long events are kept (admin).
Make JSON Filter PatternPureField, Operator, Value, NumericPatternBuilds { $.level = "Error" } style patterns.
Make Log Stream NamePurePrefix, SessionName<prefix>/<platform>/<session>, cleaned for CloudWatch.

Logs Insights

NodeKindInputsOutputsPurpose
Start QueryLatentLog Groups (empty = settings), Query, Start / End Time, LimitOn Success / On Failure (Results with Query Id, Error)Starts a query.
Get Query ResultsLatentQuery IdOn Success / On Failure (Results, Error)Status, columns, rows and statistics.
Stop QueryLatentQuery IdOn Success / On Failure (Error)Stops a running query.
Run Query And WaitLatentLog Groups, Query, Start / End Time, Limit, Timeout SecondsOn Success / On Failure (Results, Error)Start, poll with back-off (1-5 s), return the table; Cancel / timeout stop the query.
Make Logs Insights QueryPurePreset, Filter, LimitQueryTen ready-made queries for logger lines (see presets).
Get Query Result ValuePureRow, Fieldbool, ValueOne cell of a result row.
Query Results To CSVPureResultsCSVResult table as RFC 4180 CSV.

Metrics

NodeKindInputsOutputsPurpose
Put MetricLatentMetric Name, Value, Unit, Dimensions, Namespace, High ResolutionOn Success / On Failure (Error)Sends one value.
Put MetricsLatentData, NamespaceOn Success / On Failure (Error)Sends any number of data points (1000 per request, below 1 MB).
Get Metric DataLatentQueries, Start / End Time, Max Datapoints, Ascending, Next TokenOn Success / On Failure (Result, Error)Time series for metrics and metric math.
Get Metric StatisticsLatentMetric Name, Dimensions, Start / End Time, Period, Statistics, Percentiles, Namespace, UnitOn Success / On Failure (Datapoints, Error)Statistics per period, sorted by time.
List MetricsLatentNamespace, Metric Name, Dimension Filters, Recently Active, Next TokenOn Success / On Failure (Result, Error)Finds metrics.
Make DimensionPureName, ValueDimensionDimension filter for List Metrics (empty value = any).
Make Metric DatumPureMetric Name, Value, Unit, Dimensions, High Resolution, TimestampDatumA single-value data point.
Make Statistic Set DatumPureMetric Name, Sample Count, Sum, Minimum, Maximum, Unit, DimensionsDatumA pre-aggregated data point.
Make Distribution DatumPureMetric Name, Values, Counts, Unit, DimensionsDatumValues with counts (percentiles work on it).
Add Datum DimensionPureDatum, Name, ValueDatumAdds a dimension (max 30).
Unit To TextPureUnitTextCloudWatch unit name such as Bytes/Second.
Make Metric QueryPureId, Metric Name, Dimensions, Stat, Period, Namespace, LabelQueryA Get Metric Data query.
Make Metric Math QueryPureId, Expression, Label, PeriodQueryA metric math expression.
Summarize SeriesPureValues, TimestampsSummaryCount, min, max, average, sum, latest.
Build EMF LinePureNamespace, Metrics, Dimensions, PropertiesJSON lineEmbedded Metric Format document.

Alarms

NodeKindInputsOutputsPurpose
Make Metric AlarmPureAlarm Name, Metric Name, Dimensions, Statistic, Comparison, Threshold, Period, Evaluation Periods, Alarm ActionsAlarmBuilds an alarm (all other fields are editable on the struct).
Put Metric AlarmLatentAlarmOn Success / On Failure (Error)Creates or updates an alarm (admin).
Describe AlarmsLatentAlarm Names, Prefix, State, Max Records, Next TokenOn Success / On Failure (Result, Error)Metric alarms with state and reason.
Set Alarm StateLatentAlarm Name, State, Reason, Reason Data JsonOn Success / On Failure (Error)Temporarily sets a state (test notifications).
Delete AlarmsLatentAlarm NamesOn Success / On Failure (Error)Deletes alarms (admin).
Enable Alarm ActionsLatentAlarm NamesOn Success / On Failure (Error)Turns actions back on (admin).
Disable Alarm ActionsLatentAlarm NamesOn Success / On Failure (Error)Mutes actions, e.g. during maintenance (admin).

Dashboards

NodeKindInputsOutputsPurpose
Put DashboardLatentDashboard Name, BodyOn Success / On Failure (Dashboard with Validation Messages, Error)Creates or replaces a dashboard (admin).
Get DashboardLatentDashboard NameOn Success / On Failure (Dashboard, Error)Reads the body JSON.
List DashboardsLatentPrefix, Next TokenOn Success / On Failure (Result, Error)Lists dashboards.
Delete DashboardsLatentDashboard NamesOn Success / On Failure (Error)Deletes dashboards (admin).
Make Dashboard Metric WidgetPureTitle, Metrics, Single Value, Region, X, Y, Width, HeightWidget JSONGraph or number widget.
Make Dashboard Log WidgetPureTitle, Log Group, Query, Region, X, Y, Width, HeightWidget JSONLogs Insights table widget.
Make Dashboard BodyPureWidgetsBody JSONJoins widgets for Put Dashboard.

JSON

NodeKindInputsOutputsPurpose
Get JSON FieldPureJson, Pathbool, ValueReads a.b[2].c from a JSON document (log lines, EMF, dashboard bodies).

Logs Insights presets

PresetQuery (Limit = rows)
Recent Errorsfields @timestamp, level, category, message, session | filter level in ["Error", "Fatal"] | sort @timestamp desc
Errors By Categoryfilter level in ["Error", "Fatal"] | stats count(*) as errors by category | sort errors desc
Warnings By Categoryfilter level = "Warning" | stats count(*) as warnings by category
Top Messagesstats count(*) as occurrences by message | sort occurrences desc
Log Volume Over Timestats count(*) as lines by bin(5m), level
Session Timelineevery line of the session given as Filter
Player Timelineevery line whose player context field equals Filter
Search Textlines whose message contains Filter
Sessions Per Platformstats count_distinct(session) as sessions by platform, build
Fatal Errors / CrashesFatal lines with session, platform and build

The presets need Structured JSON on (the default): Logs Insights discovers the JSON fields of each line automatically.

C++ API

#include "CloudWatchLinkLibrary.h"
#include "CloudWatchLinkLogger.h"

// Metrics with a game-thread callback.
TArray<FCloudWatchLinkMetricDatum> Data;
Data.Add(UCloudWatchLinkLibrary::MakeMetricDatum(TEXT("MatchLength"), 312.f, ECloudWatchLinkUnit::Seconds,
	TMap<FString, FString>(), false, FDateTime(0)));
UCloudWatchLinkLibrary::PutMetricsNative(FString(), Data,
	FCloudWatchLinkNativeDelegate::CreateLambda([](const FCloudWatchLinkError& Error) { /* ... */ }));

// The logger is a game-instance subsystem.
if (UCloudWatchLinkLogger* Logger = GetGameInstance()->GetSubsystem<UCloudWatchLinkLogger>())
{
	FString Problem;
	Logger->StartForwarding(FString(), FString(), Problem);
	Logger->SetContextField(TEXT("match"), MatchId);
}

All latent node classes (UCloudWatchLinkSimpleAction, UCloudWatchLinkQueryAction and the others) can be created from C++ through their static factory functions; bind the delegates, then call Activate().

Types

TypeKindMembers
FCloudWatchLinkMetricDatumStructMetric Name, Value, Unit, Dimensions, High Resolution, Timestamp, Is Statistic Set, Sample Count, Sum, Minimum, Maximum, Values, Counts
FCloudWatchLinkDimensionStructName, Value
FCloudWatchLinkMetricQueryStructId, Namespace, Metric Name, Dimensions, Stat, Period, Expression, Label, Return Data
FCloudWatchLinkMetricDataResult / SeriesStructSeries (Id, Label, Status Code, Timestamps, Values), Messages, Next Token
FCloudWatchLinkDatapointStructTimestamp, Sample Count, Average, Sum, Minimum, Maximum, Unit, Extended Statistics
FCloudWatchLinkMetricInfo / ListStructNamespace, Metric Name, Dimensions; Metrics, Next Token
FCloudWatchLinkAlarmSpecStructAlarm Name, Description, Namespace, Metric Name, Dimensions, Statistic, Extended Statistic, Period, Evaluation Periods, Datapoints To Alarm, Threshold, Comparison, Treat Missing Data, Unit, Alarm / OK / Insufficient Data Actions, Actions Enabled
FCloudWatchLinkAlarm / ListStructName, Arn, Description, State, State Reason, State Updated, Namespace, Metric Name, Dimensions, Statistic, Period, Evaluation Periods, Threshold, Comparison Operator, Actions Enabled, Alarm Actions
FCloudWatchLinkDashboard / ListStructName, Arn, Body, Last Modified, Size Bytes, Validation Messages
FCloudWatchLinkLogEvent / PageStructTimestamp, Message, Ingestion Time, Log Stream Name, Event Id; Events, Next Token, Backward Token
FCloudWatchLinkPutLogsResultStructAccepted, Rejected, Requests, Created Destination
FCloudWatchLinkLogGroup / Stream / ListsStructName, Arn, Creation Time, Retention In Days, Stored Bytes, Metric Filter Count; First / Last Event Time, Last Ingestion Time
FCloudWatchLinkQueryResults / RowStructQuery Id, Status, Columns, Rows (Fields map), Records Matched / Scanned, Bytes Scanned
FCloudWatchLinkForwarderStatsStructForwarding, Buffered, Sent, Dropped, Requests, Failed Requests, Last Error, Last Flush Time, Log Group, Log Stream
FCloudWatchLinkGameSnapshotStructFps, Frame Time Ms, Game / Render / RHI Thread Ms, Gpu Ms, Memory Used / Available MB, Player Count, Ping Ms, Map Name, Time
FCloudWatchLinkSeriesSummaryStructCount, Minimum, Maximum, Average, Sum, Latest
FCloudWatchLinkErrorStructCode, Message, Http Status, Retryable
EnumsEnumECloudWatchLinkCredentialMode, ECloudWatchLinkUnit, ECloudWatchLinkLogLevel, ECloudWatchLinkQueryStatus, ECloudWatchLinkStatistic, ECloudWatchLinkComparison, ECloudWatchLinkAlarmState, ECloudWatchLinkMissingData, ECloudWatchLinkInsightsPreset

Settings

Project Settings > Plugins > CloudWatchLink (saved to DefaultGame.ini). Connection changes apply to the next request; forwarding filters apply at the next Start Forwarding (or use the Set ... nodes at runtime).

SettingDefaultDescription
Regionus-east-1Region of your logs, metrics and identity pool.
Credential ModeCognito Identity PoolCognito Identity Pool, Static Keys or Default Credential Chain.
Identity Pool Id / Allow Guest Access(empty) / OnCognito identity pool and guest identities.
Access Key Id / Secret Access Key(empty)Static Keys mode - development and servers only.
Allow Static Keys In ShippingOffSettings keys are refused in Shipping builds unless enabled.
Endpoint Override(empty)Custom endpoint such as a local emulator.
Request / Connect Timeout Ms, Max Retries, Worker Threads30000 / 5000, 3, 4Request limits and background threads.
Verify SSL / Log Sdk WarningsOn / OnTLS verification; SDK warnings to LogCloudWatchLink (never forwarded).
Default Namespace(empty = Game/<project>)Metric namespace when a node leaves Namespace empty.
Log Group Name/game/clientGroup of the logger and of log nodes that leave Log Group empty.
Log Stream Prefix(empty = project name)First part of the logger's stream name.
Log Retention Days30Retention when CloudWatchLink creates a group (0 = never expire).
Auto Start Forwarding / Stop With Game InstanceOff / OnStart with the game instance; stop at the end of Play In Editor.
Minimum LevelLogForward this level and more severe ones.
Allow / Deny Categories(empty)Category filters.
Include / Exclude Patterns(empty)Message wildcards.
Structured JsonOnJSON lines (off = "[Level] Category: message").
Flush Interval Seconds / Max Batch Lines5 / 1000Send interval and early-send threshold.
Max Buffered Lines / Shutdown Flush Seconds20000 / 3Memory bound; time allowed for the last send on exit.

Costs

CloudWatch is billed per GB of ingested and stored log data, per custom metric (each unique combination of name and dimensions), per API request (reads, PutMetricData), per alarm, per dashboard and per GB scanned by Logs Insights. For large player bases keep Minimum Level at Warning in Shipping builds, use few dimensions (Map and Platform are low-cardinality; never use player ids as dimensions), keep the metrics component's Flush Interval at 60 s, and set a retention period on every log group. Log Metrics EMF is a cheap way to get metrics from servers that already forward logs.

Troubleshooting

Error codeCause and fix
NotConfiguredIdentity Pool Id or static keys missing in Project Settings > Plugins > CloudWatchLink.
AccessDeniedExceptionThe role lacks the permission (logs:PutLogEvents on the group, cloudwatch:PutMetricData with the namespace condition). See Setting up AWS.
ResourceNotFoundExceptionWrong log group / stream / dashboard name, or a different region. Put Log Events with Create If Missing creates group and stream.
InvalidParameterExceptionInvalid name, retention value (allowed: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557, 2922, 3288, 3653) or query.
MalformedQueryExceptionLogs Insights query syntax error.
Cancelled / Timeout / QueryNotCompleteRun Query And Wait was cancelled, ran longer than Timeout Seconds, or the query failed on AWS.
UnavailableThe SDK library could not be loaded or the engine is shutting down. See the Output Log (LogCloudWatchLink).
Nothing arrivesCheck Get Forwarder Stats: Last Error, Dropped. Lines older than 14 days or more than 2 hours in the future are rejected by CloudWatch (Rejected count of Put Log Events).

Credits

© 2026 Alpha XP — alphaxp.net · Support: support@alphaxp.net. Includes the AWS SDK for C++ and the AWS Common Runtime (Apache License 2.0). Built for Unreal Engine 4.27 and 5.8.