Adds support for livestreaming logstreams

This commit is contained in:
Gardient
2016-10-27 15:51:04 +03:00
parent ce5d85d143
commit 2bfa977d99
2 changed files with 22 additions and 4 deletions

View File

@@ -17,6 +17,9 @@ namespace CloudWatchLogDownloader.Models
[ValueOption(2)] [ValueOption(2)]
public string OutputFilePath { get; set; } public string OutputFilePath { get; set; }
[Option('l', "liveStream", HelpText="Keep pulling logs until Ctrl+C is applied")]
public bool LiveStream { get; set; }
[ParserState] [ParserState]
public IParserState ParserState { get; set; } public IParserState ParserState { get; set; }

View File

@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.IO; using System.IO;
using Amazon;
namespace CloudWatchLogDownloader namespace CloudWatchLogDownloader
{ {
@@ -19,7 +20,7 @@ namespace CloudWatchLogDownloader
client = new AmazonCloudWatchLogsClient(); client = new AmazonCloudWatchLogsClient();
var logGroup = GetLogGroup(opt.LogGroup); var logGroup = GetLogGroup(opt.LogGroup);
var logStream = GetLogStream(logGroup, opt.LogStream); 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.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) for (int i = 0, len = allStreams.Count; i < len; ++i)
Console.WriteLine(i + ") " + allStreams[i].LogStreamName); Console.WriteLine(i + ") " + allStreams[i].LogStreamName);
@@ -99,7 +100,7 @@ namespace CloudWatchLogDownloader
return ls; 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]: "); Console.WriteLine("Choose Output file [logs/" + logStream.LogStreamName + ".log]: ");
var output = Console.ReadLine(); var output = Console.ReadLine();
@@ -108,6 +109,10 @@ namespace CloudWatchLogDownloader
if (!Directory.GetParent(output).Exists) if (!Directory.GetParent(output).Exists)
Directory.CreateDirectory(Directory.GetParent(output).FullName); Directory.CreateDirectory(Directory.GetParent(output).FullName);
Console.WriteLine("Downloading log into " + output);
bool lsMessage = !liveStream;
using (StreamWriter sw = new StreamWriter(output)) using (StreamWriter sw = new StreamWriter(output))
{ {
GetLogEventsResponse leResponse = null; GetLogEventsResponse leResponse = null;
@@ -125,7 +130,17 @@ namespace CloudWatchLogDownloader
sw.WriteLine(ev.Message); sw.WriteLine(ev.Message);
sw.Flush(); 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);
} }
} }