From 2bfa977d991353beb2eaf147fb02396c75a75bab Mon Sep 17 00:00:00 2001 From: Gardient Date: Thu, 27 Oct 2016 15:51:04 +0300 Subject: [PATCH] Adds support for livestreaming logstreams --- .../Models/CommandOptions.cs | 3 +++ CloudWatchLogDownloader/Program.cs | 23 +++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/CloudWatchLogDownloader/Models/CommandOptions.cs b/CloudWatchLogDownloader/Models/CommandOptions.cs index a1843fb..3296cf6 100644 --- a/CloudWatchLogDownloader/Models/CommandOptions.cs +++ b/CloudWatchLogDownloader/Models/CommandOptions.cs @@ -17,6 +17,9 @@ namespace CloudWatchLogDownloader.Models [ValueOption(2)] public string OutputFilePath { get; set; } + [Option('l', "liveStream", HelpText="Keep pulling logs until Ctrl+C is applied")] + public bool LiveStream { get; set; } + [ParserState] public IParserState ParserState { get; set; } diff --git a/CloudWatchLogDownloader/Program.cs b/CloudWatchLogDownloader/Program.cs index 55f3976..ae33ffc 100644 --- a/CloudWatchLogDownloader/Program.cs +++ b/CloudWatchLogDownloader/Program.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.IO; +using Amazon; namespace CloudWatchLogDownloader { @@ -19,7 +20,7 @@ namespace CloudWatchLogDownloader client = new AmazonCloudWatchLogsClient(); var logGroup = GetLogGroup(opt.LogGroup); var logStream = GetLogStream(logGroup, opt.LogStream); - WriteLogToFile(logGroup, logStream, opt.OutputFilePath); + WriteLogToFile(logGroup, logStream, opt.LiveStream, opt.OutputFilePath); } } @@ -80,7 +81,7 @@ namespace CloudWatchLogDownloader allStreams = allStreams.Where(x => x.LogStreamName.StartsWith(logStream)).ToList(); } - allStreams = allStreams.OrderBy(x => x.CreationTime).ToList(); + allStreams = allStreams.OrderByDescending(x => x.CreationTime).ToList(); for (int i = 0, len = allStreams.Count; i < len; ++i) Console.WriteLine(i + ") " + allStreams[i].LogStreamName); @@ -99,7 +100,7 @@ namespace CloudWatchLogDownloader return ls; } - private static void WriteLogToFile(LogGroup logGroup, LogStream logStream, string outputFilePath = null) + private static void WriteLogToFile(LogGroup logGroup, LogStream logStream, bool liveStream, string outputFilePath = null) { Console.WriteLine("Choose Output file [logs/" + logStream.LogStreamName + ".log]: "); var output = Console.ReadLine(); @@ -108,6 +109,10 @@ namespace CloudWatchLogDownloader if (!Directory.GetParent(output).Exists) Directory.CreateDirectory(Directory.GetParent(output).FullName); + Console.WriteLine("Downloading log into " + output); + + bool lsMessage = !liveStream; + using (StreamWriter sw = new StreamWriter(output)) { GetLogEventsResponse leResponse = null; @@ -125,7 +130,17 @@ namespace CloudWatchLogDownloader sw.WriteLine(ev.Message); sw.Flush(); - } while (leResponse.NextForwardToken != null && leResponse.Events.Any()); + + if (!leResponse.Events.Any() && !lsMessage) + { + lsMessage = true; + ConsoleColor oldcolor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine("Now streaming live from lg: " + logGroup.LogGroupName + " ls: " + logStream.LogStreamName + " into " + output); + Console.ForegroundColor = oldcolor; + Console.WriteLine("{0}{0}Press CTRL+C to stop...", Environment.NewLine); + } + } while ((leResponse.NextForwardToken != null && leResponse.Events.Any()) || liveStream); } }