From 96d8e8f9cbc1a8d74e390274df9b873b6f4fd83e Mon Sep 17 00:00:00 2001 From: amidofu Date: Wed, 10 May 2023 11:38:11 +0800 Subject: [PATCH 1/4] drop logs if exceptions happen --- src/AWS.Logger.Core/Core/AWSLoggerCore.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/AWS.Logger.Core/Core/AWSLoggerCore.cs b/src/AWS.Logger.Core/Core/AWSLoggerCore.cs index c696f72..e2b764a 100644 --- a/src/AWS.Logger.Core/Core/AWSLoggerCore.cs +++ b/src/AWS.Logger.Core/Core/AWSLoggerCore.cs @@ -23,6 +23,9 @@ namespace AWS.Logger.Core /// public class AWSLoggerCore : IAWSLoggerCore { + private const string MSG_PREFIX = "JamesVerAWSLogger: "; + private static TimeSpan s_LogTimestampOffset = TimeSpan.Zero; + const int MAX_MESSAGE_SIZE_IN_BYTES = 256000; #region Private Members @@ -240,6 +243,7 @@ private string GetServiceUrl() private void AddSingleMessage(string message) { + message = MSG_PREFIX + message; if (_pendingMessageQueue.Count > _config.MaxQueuedMessages) { if (_maxBufferTimeStamp.AddMinutes(MAX_BUFFER_TIMEDIFF) < DateTime.UtcNow) @@ -252,7 +256,7 @@ private void AddSingleMessage(string message) _maxBufferTimeStamp = DateTime.UtcNow; _pendingMessageQueue.Enqueue(new InputLogEvent { - Timestamp = DateTime.UtcNow, + Timestamp = DateTime.UtcNow + s_LogTimestampOffset, Message = message, }); } @@ -261,7 +265,7 @@ private void AddSingleMessage(string message) { _pendingMessageQueue.Enqueue(new InputLogEvent { - Timestamp = DateTime.UtcNow, + Timestamp = DateTime.UtcNow + s_LogTimestampOffset, Message = message, }); } @@ -399,6 +403,10 @@ private async Task Monitor(CancellationToken token) // We don't want to kill the main monitor loop. We will simply log the error, then continue. // If it is an OperationCancelledException, die LogLibraryServiceError(ex); + + //drop logs in sending batch since those logs may cause exceptions + _repo.Reset(null); + LogLibraryServiceError(new Exception("Logs in sending batch are dropped because of exceptions")); } } } From 009bc4002b07408ec6acbd7c172179491ee23ff9 Mon Sep 17 00:00:00 2001 From: amidofu Date: Wed, 10 May 2023 12:11:00 +0800 Subject: [PATCH 2/4] avoid 24 hours rule --- src/AWS.Logger.Core/Core/AWSLoggerCore.cs | 34 +++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/AWS.Logger.Core/Core/AWSLoggerCore.cs b/src/AWS.Logger.Core/Core/AWSLoggerCore.cs index e2b764a..a8a12a8 100644 --- a/src/AWS.Logger.Core/Core/AWSLoggerCore.cs +++ b/src/AWS.Logger.Core/Core/AWSLoggerCore.cs @@ -411,6 +411,25 @@ private async Task Monitor(CancellationToken token) } } + private void PrepareLogEventBatchForSending() + { + //Make sure the log events are in the right order. + _repo._request.LogEvents.Sort((ev1, ev2) => ev1.Timestamp.CompareTo(ev2.Timestamp)); + if (_repo._request.LogEvents.Count > 0) + { + DateTime latestLogDateTime = _repo._request.LogEvents.Last().Timestamp; + + //avoid the error that the log events should be in a 24 hours range + //https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs/client/put_log_events.html#put-log-events + while (_repo._request.LogEvents.Count > 0 && + (latestLogDateTime - _repo._request.LogEvents.First().Timestamp > TimeSpan.FromHours(24)) + ) + { + _repo.RemoveMessageAt(0); + } + } + } + /// /// Method to transmit the PutLogEvent Request /// @@ -420,8 +439,7 @@ private async Task SendMessages(CancellationToken token) { try { - //Make sure the log events are in the right order. - _repo._request.LogEvents.Sort((ev1, ev2) => ev1.Timestamp.CompareTo(ev2.Timestamp)); + PrepareLogEventBatchForSending(); var response = await _client.PutLogEventsAsync(_repo._request, token).ConfigureAwait(false); _repo.Reset(response.NextSequenceToken); _requestCount = 5; @@ -634,6 +652,18 @@ public void AddMessage(InputLogEvent ev) _request.LogEvents.Add(ev); } + public void RemoveMessageAt(int index) + { + if (index < 0 || index >= _request.LogEvents.Count) + { + return; + } + Encoding unicode = Encoding.Unicode; + InputLogEvent ev = _request.LogEvents[index]; + _totalMessageSize -= unicode.GetMaxByteCount(ev.Message.Length); + _request.LogEvents.RemoveAt(index); + } + public void Reset(string SeqToken) { _request.LogEvents.Clear(); From da03021dd45d4afa6b6829257cee4276357e7b7c Mon Sep 17 00:00:00 2001 From: amidofu Date: Wed, 10 May 2023 12:12:24 +0800 Subject: [PATCH 3/4] remove test code --- src/AWS.Logger.Core/Core/AWSLoggerCore.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/AWS.Logger.Core/Core/AWSLoggerCore.cs b/src/AWS.Logger.Core/Core/AWSLoggerCore.cs index a8a12a8..2906362 100644 --- a/src/AWS.Logger.Core/Core/AWSLoggerCore.cs +++ b/src/AWS.Logger.Core/Core/AWSLoggerCore.cs @@ -23,9 +23,6 @@ namespace AWS.Logger.Core /// public class AWSLoggerCore : IAWSLoggerCore { - private const string MSG_PREFIX = "JamesVerAWSLogger: "; - private static TimeSpan s_LogTimestampOffset = TimeSpan.Zero; - const int MAX_MESSAGE_SIZE_IN_BYTES = 256000; #region Private Members @@ -243,7 +240,6 @@ private string GetServiceUrl() private void AddSingleMessage(string message) { - message = MSG_PREFIX + message; if (_pendingMessageQueue.Count > _config.MaxQueuedMessages) { if (_maxBufferTimeStamp.AddMinutes(MAX_BUFFER_TIMEDIFF) < DateTime.UtcNow) @@ -256,7 +252,7 @@ private void AddSingleMessage(string message) _maxBufferTimeStamp = DateTime.UtcNow; _pendingMessageQueue.Enqueue(new InputLogEvent { - Timestamp = DateTime.UtcNow + s_LogTimestampOffset, + Timestamp = DateTime.UtcNow, Message = message, }); } @@ -265,7 +261,7 @@ private void AddSingleMessage(string message) { _pendingMessageQueue.Enqueue(new InputLogEvent { - Timestamp = DateTime.UtcNow + s_LogTimestampOffset, + Timestamp = DateTime.UtcNow, Message = message, }); } From c71f6ec17bf584124260d44fc2d2c92545baf09a Mon Sep 17 00:00:00 2001 From: amidofu Date: Thu, 11 May 2023 16:28:22 +0800 Subject: [PATCH 4/4] combine exceptions --- src/AWS.Logger.Core/Core/AWSLoggerCore.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/AWS.Logger.Core/Core/AWSLoggerCore.cs b/src/AWS.Logger.Core/Core/AWSLoggerCore.cs index 2906362..d405775 100644 --- a/src/AWS.Logger.Core/Core/AWSLoggerCore.cs +++ b/src/AWS.Logger.Core/Core/AWSLoggerCore.cs @@ -396,13 +396,11 @@ private async Task Monitor(CancellationToken token) } catch (Exception ex) { - // We don't want to kill the main monitor loop. We will simply log the error, then continue. - // If it is an OperationCancelledException, die - LogLibraryServiceError(ex); - //drop logs in sending batch since those logs may cause exceptions _repo.Reset(null); - LogLibraryServiceError(new Exception("Logs in sending batch are dropped because of exceptions")); + // We don't want to kill the main monitor loop. We will simply log the error, then continue. + // If it is an OperationCancelledException, die + LogLibraryServiceError(new Exception("Logs in the sending batch are dropped because of exceptions", ex)); } } }