From 3ca3456f607d8acce67e0219691a4704a350af03 Mon Sep 17 00:00:00 2001 From: shweta Date: Tue, 28 Feb 2017 18:27:03 +0530 Subject: [PATCH 1/4] modify static fields/methods to non-static and enhanced memory consumption --- source/log4net-loggly/LogglyAppender.cs | 13 +- source/log4net-loggly/LogglyAsyncHandler.cs | 4 +- .../LogglyBufferringAppender.cs | 6 +- source/log4net-loggly/LogglyClient.cs | 112 ++++++++------- source/log4net-loggly/LogglyFormatter.cs | 6 +- .../log4net-loggly/LogglySendBufferedLogs.cs | 32 +++-- .../log4net-loggly/LogglyStoreLogsInBuffer.cs | 9 +- source/log4net-loggly/log4net-loggly.csproj | 134 +++++++++--------- source/log4net-loggly/packages.config | 4 +- 9 files changed, 169 insertions(+), 151 deletions(-) diff --git a/source/log4net-loggly/LogglyAppender.cs b/source/log4net-loggly/LogglyAppender.cs index c7fcd32..0394466 100644 --- a/source/log4net-loggly/LogglyAppender.cs +++ b/source/log4net-loggly/LogglyAppender.cs @@ -8,13 +8,14 @@ namespace log4net.loggly { - public class LogglyAppender : AppenderSkeleton + public class LogglyAppender : AppenderSkeleton { List lstLogs = new List(); string[] arr = new string[100]; - public static readonly string InputKeyProperty = "LogglyInputKey"; - public static ILogglyFormatter Formatter = new LogglyFormatter(); - public static ILogglyClient Client = new LogglyClient(); + public readonly string InputKeyProperty = "LogglyInputKey"; + public ILogglyFormatter Formatter = new LogglyFormatter(); + public ILogglyClient Client = new LogglyClient(); + public LogglySendBufferedLogs _sendBufferedLogs = new LogglySendBufferedLogs(); private ILogglyAppenderConfig Config = new LogglyAppenderConfig(); public string RootUrl { set { Config.RootUrl = value; } } public string InputKey { set { Config.InputKey = value; } } @@ -43,7 +44,7 @@ void t_Elapsed(object sender, Timer.ElapsedEventArgs e) { SendAllEvents(lstLogs.ToArray()); } - LogglySendBufferedLogs.sendBufferedLogsToLoggly(Config, Config.LogMode == "bulk/"); + _sendBufferedLogs.sendBufferedLogsToLoggly(Config, Config.LogMode == "bulk/"); } protected override void Append(LoggingEvent loggingEvent) @@ -97,7 +98,7 @@ private void SendAllEvents(string[] events) { lstLogs.Clear(); String bulkLog = String.Join(System.Environment.NewLine, events); - LogglyAsync.PostMessage(bulkLog, Config); + LogglyAsync.PostMessage(bulkLog, Config); } } diff --git a/source/log4net-loggly/LogglyAsyncHandler.cs b/source/log4net-loggly/LogglyAsyncHandler.cs index 4aa4ad4..d699015 100644 --- a/source/log4net-loggly/LogglyAsyncHandler.cs +++ b/source/log4net-loggly/LogglyAsyncHandler.cs @@ -11,9 +11,9 @@ class LogglyAsyncHandler protected bool IsRunning = false; //static list of all the queues the le appender might be managing. - private static ConcurrentBag> _allQueues = new ConcurrentBag>(); + private ConcurrentBag> _allQueues = new ConcurrentBag>(); - public static ILogglyClient Client = new LogglyClient(); + public ILogglyClient Client = new LogglyClient(); public LogglyAsyncHandler() { Queue = new BlockingCollection(); diff --git a/source/log4net-loggly/LogglyBufferringAppender.cs b/source/log4net-loggly/LogglyBufferringAppender.cs index 0edf281..b6f4825 100644 --- a/source/log4net-loggly/LogglyBufferringAppender.cs +++ b/source/log4net-loggly/LogglyBufferringAppender.cs @@ -5,10 +5,10 @@ namespace log4net.loggly { public class LogglyBufferringAppender : BufferingAppenderSkeleton { - public static readonly string InputKeyProperty = "LogglyInputKey"; + public readonly string InputKeyProperty = "LogglyInputKey"; - public static ILogglyFormatter Formatter = new LogglyFormatter(); - public static ILogglyClient Client = new LogglyClient(); + public ILogglyFormatter Formatter = new LogglyFormatter(); + public ILogglyClient Client = new LogglyClient(); private ILogglyAppenderConfig Config = new LogglyAppenderConfig(); diff --git a/source/log4net-loggly/LogglyClient.cs b/source/log4net-loggly/LogglyClient.cs index 052447d..653b7d0 100644 --- a/source/log4net-loggly/LogglyClient.cs +++ b/source/log4net-loggly/LogglyClient.cs @@ -8,24 +8,25 @@ namespace log4net.loggly { public class LogglyClient : ILogglyClient { - static bool isValidToken = true; + bool isValidToken = true; + public LogglyStoreLogsInBuffer _storeLogsInBuffer = new LogglyStoreLogsInBuffer(); - public static void setTokenValid(bool flag) + public void setTokenValid(bool flag) { isValidToken = flag; } - void storeLogs(string message, ILogglyAppenderConfig config, bool isBulk) + public void storeLogs(string message, ILogglyAppenderConfig config, bool isBulk) { List messageBulk = new List(); if (isBulk) { messageBulk = message.Split('\n').ToList(); - LogglyStoreLogsInBuffer.storeBulkLogs(config, messageBulk, isBulk); + _storeLogsInBuffer.storeBulkLogs(config, messageBulk, isBulk); } else { - LogglyStoreLogsInBuffer.storeInputLogs(config, message, isBulk); + _storeLogsInBuffer.storeInputLogs(config, message, isBulk); } } @@ -42,6 +43,9 @@ public virtual void Send(ILogglyAppenderConfig config, string message) string _tag = config.Tag; bool isBulk = config.LogMode.Contains("bulk"); + HttpWebResponse webResponse; + HttpWebRequest webRequest; + //keeping userAgent backward compatible if (!string.IsNullOrWhiteSpace(config.UserAgent)) { @@ -51,49 +55,56 @@ public virtual void Send(ILogglyAppenderConfig config, string message) while (isValidToken && totalRetries < maxRetryAllowed) { totalRetries++; - try - { - var bytes = Encoding.UTF8.GetBytes(message); - var webRequest = CreateWebRequest(config, _tag); - - using (var dataStream = webRequest.GetRequestStream()) - { - dataStream.Write(bytes, 0, bytes.Length); - dataStream.Flush(); - dataStream.Close(); - } - var webResponse = webRequest.GetResponse(); - webResponse.Close(); - break; - } + try + { + var bytes = Encoding.UTF8.GetBytes(message); + webRequest = CreateWebRequest(config, _tag); - catch (WebException e) - { - if (totalRetries == 1) - { - var response = (HttpWebResponse)e.Response; - if (response != null) - { - // Check for bad token - if (response.StatusCode == HttpStatusCode.Forbidden) - { - // set valid token flag to false - setTokenValid(false); - } - else - { - // store logs to buffer - storeLogs(message, config, isBulk); - } - printErrorMessage(e.Message); - } - else - { - // store logs to buffer - storeLogs(message, config, isBulk); - } - } - } + using (var dataStream = webRequest.GetRequestStream()) + { + dataStream.Write(bytes, 0, bytes.Length); + dataStream.Flush(); + dataStream.Close(); + } + webResponse = (HttpWebResponse)webRequest.GetResponse(); + webResponse.Close(); + break; + } + + catch (WebException e) + { + if (totalRetries == 1) + { + var response = (HttpWebResponse)e.Response; + if (response != null) + { + // Check for bad token + if (response.StatusCode == HttpStatusCode.Forbidden) + { + // set valid token flag to false + setTokenValid(false); + } + else + { + // store logs to buffer + storeLogs(message, config, isBulk); + } + printErrorMessage(e.Message); + } + else + { + // store logs to buffer + storeLogs(message, config, isBulk); + } + } + } + + finally + { + webRequest = null; + webResponse = null; + GC.Collect(); + } } } @@ -109,7 +120,7 @@ public void Send(ILogglyAppenderConfig config, string message, bool isbulk) _tag = _tag + "," + config.UserAgent; } var bytes = Encoding.UTF8.GetBytes(message); - var webRequest = CreateWebRequest(config, _tag); + var webRequest = CreateWebRequest(config, _tag); using (var dataStream = webRequest.GetRequestStream()) { @@ -117,7 +128,7 @@ public void Send(ILogglyAppenderConfig config, string message, bool isbulk) dataStream.Flush(); dataStream.Close(); } - var webResponse = (HttpWebResponse)webRequest.GetResponse(); + var webResponse = (HttpWebResponse)webRequest.GetResponse(); webResponse.Close(); } } @@ -127,7 +138,8 @@ protected virtual HttpWebRequest CreateWebRequest(ILogglyAppenderConfig config, var url = String.Concat(config.RootUrl, config.LogMode, config.InputKey); //adding userAgent as tag in the log url = String.Concat(url, "/tag/" + tag); - var request = (HttpWebRequest)WebRequest.Create(url); + HttpWebRequest request = null; + request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ReadWriteTimeout = request.Timeout = config.TimeoutInSeconds * 1000; request.UserAgent = config.UserAgent; diff --git a/source/log4net-loggly/LogglyFormatter.cs b/source/log4net-loggly/LogglyFormatter.cs index a67b48b..2bbbe0a 100644 --- a/source/log4net-loggly/LogglyFormatter.cs +++ b/source/log4net-loggly/LogglyFormatter.cs @@ -221,7 +221,7 @@ private string GetMessageAndObjectInfo(LoggingEvent loggingEvent, out object obj { string message = string.Empty; objInfo = null; - int bytesLengthAllowdToLoggly = EVENT_SIZE; + int bytesLengthAllowedToLoggly = EVENT_SIZE; if (loggingEvent.MessageObject != null) { @@ -232,9 +232,9 @@ private string GetMessageAndObjectInfo(LoggingEvent loggingEvent, out object obj { message = loggingEvent.MessageObject.ToString(); int messageSizeInBytes = Encoding.Default.GetByteCount(message); - if (messageSizeInBytes > bytesLengthAllowdToLoggly) + if (messageSizeInBytes > bytesLengthAllowedToLoggly) { - message = message.Substring(0, bytesLengthAllowdToLoggly); + message = message.Substring(0, bytesLengthAllowedToLoggly); } } else diff --git a/source/log4net-loggly/LogglySendBufferedLogs.cs b/source/log4net-loggly/LogglySendBufferedLogs.cs index ff92266..92825cf 100644 --- a/source/log4net-loggly/LogglySendBufferedLogs.cs +++ b/source/log4net-loggly/LogglySendBufferedLogs.cs @@ -7,47 +7,53 @@ namespace log4net.loggly { public class LogglySendBufferedLogs { - public static string message; - public static List arrayMessage = new List(); - public static ILogglyClient Client = new LogglyClient(); + public string message = null; + public List arrayMessage = new List(); + public ILogglyClient Client = new LogglyClient(); + public LogglyClient _logClient = new LogglyClient(); + public LogglyStoreLogsInBuffer _storeEventsInBuffer = new LogglyStoreLogsInBuffer(); - public static void sendBufferedLogsToLoggly(ILogglyAppenderConfig config, bool isBulk) + public void sendBufferedLogsToLoggly(ILogglyAppenderConfig config, bool isBulk) { - if (LogglyStoreLogsInBuffer.arrBufferedMessage.Count > 0) + if (_storeEventsInBuffer.arrBufferedMessage.Count > 0) { - int bulkModeBunch = 100; int inputModeBunch = 1; int logInBunch = isBulk ? bulkModeBunch : inputModeBunch; - arrayMessage = LogglyStoreLogsInBuffer.arrBufferedMessage.Take(logInBunch).ToList(); + arrayMessage = _storeEventsInBuffer.arrBufferedMessage.Take(logInBunch).ToList(); message = isBulk ? String.Join(System.Environment.NewLine, arrayMessage) : arrayMessage[0]; try { Client.Send(config, message, isBulk); - var tempList = LogglyStoreLogsInBuffer.arrBufferedMessage; - if (LogglyStoreLogsInBuffer.arrBufferedMessage.Count < arrayMessage.Count) + var tempList = _storeEventsInBuffer.arrBufferedMessage; + if (_storeEventsInBuffer.arrBufferedMessage.Count < arrayMessage.Count) { - LogglyStoreLogsInBuffer.arrBufferedMessage.Clear(); + _storeEventsInBuffer.arrBufferedMessage.Clear(); } else { tempList.RemoveRange(0, arrayMessage.Count); } - LogglyStoreLogsInBuffer.arrBufferedMessage = tempList; + _storeEventsInBuffer.arrBufferedMessage = tempList; } catch (WebException e) { var response = (HttpWebResponse)e.Response; if (response != null && response.StatusCode == HttpStatusCode.Forbidden) { - LogglyClient.setTokenValid(false); + _logClient.setTokenValid(false); Console.WriteLine("Loggly error: {0}", e.Message); return; } } + finally + { + arrayMessage.Clear(); + arrayMessage = null; + GC.Collect(); + } } } - } } diff --git a/source/log4net-loggly/LogglyStoreLogsInBuffer.cs b/source/log4net-loggly/LogglyStoreLogsInBuffer.cs index 8b63930..3bfa42a 100644 --- a/source/log4net-loggly/LogglyStoreLogsInBuffer.cs +++ b/source/log4net-loggly/LogglyStoreLogsInBuffer.cs @@ -4,12 +4,11 @@ namespace log4net.loggly { - class LogglyStoreLogsInBuffer + public class LogglyStoreLogsInBuffer { - public static List arrBufferedMessage = new List(); - public static List tempList = new List(); + public List arrBufferedMessage = new List(); - public static void storeBulkLogs(ILogglyAppenderConfig config, List logs, bool isBulk) + public void storeBulkLogs(ILogglyAppenderConfig config, List logs, bool isBulk) { if (logs.Count == 0) return; int numberOfLogsToBeRemoved = (arrBufferedMessage.Count + logs.Count) - config.BufferSize; @@ -18,7 +17,7 @@ public static void storeBulkLogs(ILogglyAppenderConfig config, List logs arrBufferedMessage = logs.Concat(arrBufferedMessage).ToList(); } - public static void storeInputLogs(ILogglyAppenderConfig config, string message, bool isBulk) + public void storeInputLogs(ILogglyAppenderConfig config, string message, bool isBulk) { if (message == String.Empty) return; int numberOfLogsToBeRemoved = (arrBufferedMessage.Count + 1) - config.BufferSize; diff --git a/source/log4net-loggly/log4net-loggly.csproj b/source/log4net-loggly/log4net-loggly.csproj index 8a7dbcf..ccf192a 100644 --- a/source/log4net-loggly/log4net-loggly.csproj +++ b/source/log4net-loggly/log4net-loggly.csproj @@ -1,72 +1,72 @@  - - Debug - AnyCPU - 8.0.30703 - 2.0 - {ABE2B1B6-A83C-4604-AF87-FAAC3976530D} - Library - Properties - log4net.loggly - log4net-loggly - v4.0 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\packages\log4net.2.0.3\lib\net40-full\log4net.dll - - - ..\packages\Newtonsoft.Json.8.0.1\lib\net40\Newtonsoft.Json.dll - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/source/log4net-loggly/packages.config b/source/log4net-loggly/packages.config index 5c61bc7..a11abe5 100644 --- a/source/log4net-loggly/packages.config +++ b/source/log4net-loggly/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file From c729fdc600d8f599a8e39c908fbff691d9ffa97f Mon Sep 17 00:00:00 2001 From: Shwetajain148 Date: Tue, 7 Mar 2017 20:12:37 +0530 Subject: [PATCH 3/4] Update LogglySendBufferedLogs.cs --- .../log4net-loggly/LogglySendBufferedLogs.cs | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/source/log4net-loggly/LogglySendBufferedLogs.cs b/source/log4net-loggly/LogglySendBufferedLogs.cs index af57ac7..19abec9 100644 --- a/source/log4net-loggly/LogglySendBufferedLogs.cs +++ b/source/log4net-loggly/LogglySendBufferedLogs.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net; @@ -11,30 +11,29 @@ public class LogglySendBufferedLogs public List arrayMessage = new List(); public ILogglyClient Client = new LogglyClient(); public LogglyClient _logClient = new LogglyClient(); - public LogglyStoreLogsInBuffer _storeEventsInBuffer = new LogglyStoreLogsInBuffer(); public void sendBufferedLogsToLoggly(ILogglyAppenderConfig config, bool isBulk) { - if (_storeEventsInBuffer.arrBufferedMessage.Count > 0) + if (LogglyStoreLogsInBuffer.arrBufferedMessage.Count > 0) { int bulkModeBunch = 100; int inputModeBunch = 1; int logInBunch = isBulk ? bulkModeBunch : inputModeBunch; - arrayMessage = _storeEventsInBuffer.arrBufferedMessage.Take(logInBunch).ToList(); + arrayMessage = LogglyStoreLogsInBuffer.arrBufferedMessage.Take(logInBunch).ToList(); message = isBulk ? String.Join(System.Environment.NewLine, arrayMessage) : arrayMessage[0]; try { Client.Send(config, message, isBulk); - var tempList = _storeEventsInBuffer.arrBufferedMessage; - if (_storeEventsInBuffer.arrBufferedMessage.Count < arrayMessage.Count) + var tempList = LogglyStoreLogsInBuffer.arrBufferedMessage; + if (LogglyStoreLogsInBuffer.arrBufferedMessage.Count < arrayMessage.Count) { - _storeEventsInBuffer.arrBufferedMessage.Clear(); + LogglyStoreLogsInBuffer.arrBufferedMessage.Clear(); } else { tempList.RemoveRange(0, arrayMessage.Count); } - _storeEventsInBuffer.arrBufferedMessage = tempList; + LogglyStoreLogsInBuffer.arrBufferedMessage = tempList; } catch (WebException e) { @@ -46,14 +45,13 @@ public void sendBufferedLogsToLoggly(ILogglyAppenderConfig config, bool isBulk) return; } } - finally - { + finally + { arrayMessage.Clear(); arrayMessage = null; GC.Collect(); } - } + } } } } - From 16e41cb434190a52f8400aa5c1ec0711252ec94d Mon Sep 17 00:00:00 2001 From: Shwetajain148 Date: Tue, 7 Mar 2017 20:15:13 +0530 Subject: [PATCH 4/4] Update LogglyStoreLogsInBuffer.cs --- source/log4net-loggly/LogglyStoreLogsInBuffer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/log4net-loggly/LogglyStoreLogsInBuffer.cs b/source/log4net-loggly/LogglyStoreLogsInBuffer.cs index 3bfa42a..e4faa4a 100644 --- a/source/log4net-loggly/LogglyStoreLogsInBuffer.cs +++ b/source/log4net-loggly/LogglyStoreLogsInBuffer.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; @@ -6,7 +6,7 @@ namespace log4net.loggly { public class LogglyStoreLogsInBuffer { - public List arrBufferedMessage = new List(); + public static List arrBufferedMessage = new List(); public void storeBulkLogs(ILogglyAppenderConfig config, List logs, bool isBulk) {