7 Commits

Author SHA1 Message Date
gardient
3942527292 some commit 2017-11-15 22:04:39 +02:00
Gardient
46687f004e adds build badge to readme 2016-11-17 12:17:59 +02:00
Gardient
ad2edf098d renames travis-ci yaml 2016-11-17 12:08:36 +02:00
Gardient
b7f06adce4 Adds travis-ci yaml 2016-11-17 12:06:54 +02:00
Gardient
de6becc208 adds debug logging 2016-11-15 14:48:41 +02:00
gardient
917624ad52 Adds license file 2016-11-10 14:04:19 +02:00
Gardient
e9c060cd0d #1 - fixes ignored command line argument 2016-11-10 13:47:37 +02:00
8 changed files with 138 additions and 6 deletions

2
.travis.yml Normal file
View File

@@ -0,0 +1,2 @@
language: csharp
solution: CloudWatchLogDownloader.sln

View File

@@ -56,6 +56,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DebugLogger.cs" />
<Compile Include="Models\CommandOptions.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />

View File

@@ -0,0 +1,87 @@
using System;
namespace CloudWatchLogDownloader
{
internal static class DebugLogger
{
private static bool _debug;
public static bool Debug
{
get { return _debug; }
set
{
if (value && !_debug)
{
WriteLine("debug mode active");
}
_debug = value;
}
}
public static void Write(string str)
{
if (_debug)
{
var oldcolor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write(str);
Console.ForegroundColor = oldcolor;
}
}
public static void Write(object obj)
{
if (_debug)
{
var oldcolor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write(obj);
Console.ForegroundColor = oldcolor;
}
}
public static void Write(string format, params object[] args)
{
if (_debug)
{
var oldcolor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write(format, args);
Console.ForegroundColor = oldcolor;
}
}
public static void WriteLine(string str)
{
if (_debug)
{
var oldcolor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine(str);
Console.ForegroundColor = oldcolor;
}
}
public static void WriteLine(object obj)
{
if (_debug)
{
var oldcolor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine(obj);
Console.ForegroundColor = oldcolor;
}
}
public static void WriteLine(string format, params object[] args)
{
if (_debug)
{
var oldcolor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine(format, args);
Console.ForegroundColor = oldcolor;
}
}
}
}

View File

@@ -20,6 +20,9 @@ namespace CloudWatchLogDownloader.Models
[Option('l', "liveStream", HelpText="Keep pulling logs until Ctrl+C is applied")]
public bool LiveStream { get; set; }
[Option('d',"debug", HelpText = "print additional logs to console")]
public bool Debug { get; set; }
[ParserState]
public IParserState ParserState { get; set; }

View File

@@ -5,7 +5,6 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using Amazon;
namespace CloudWatchLogDownloader
{
@@ -17,6 +16,8 @@ namespace CloudWatchLogDownloader
var opt = new CommandOptions();
if (CommandLine.Parser.Default.ParseArguments(args, opt))
{
DebugLogger.Debug = opt.Debug;
client = new AmazonCloudWatchLogsClient();
var logGroup = GetLogGroup(opt.LogGroup);
var logStream = GetLogStream(logGroup, opt.LogStream);
@@ -30,8 +31,10 @@ namespace CloudWatchLogDownloader
DescribeLogGroupsResponse lgResponse = null;
do
{
DebugLogger.WriteLine("Getting logGroups...");
lgResponse = client.DescribeLogGroups(new DescribeLogGroupsRequest { NextToken = (lgResponse != null ? lgResponse.NextToken : null) });
allGroups.AddRange(lgResponse.LogGroups);
DebugLogger.WriteLine("Got logGroups, have {0}, {1} more pages", allGroups.Count, (!string.IsNullOrWhiteSpace(lgResponse.NextToken) ? "still" : "no"));
} while (!string.IsNullOrWhiteSpace(lgResponse.NextToken));
if (string.IsNullOrWhiteSpace(logGroup) || logGroup[logGroup.Length - 1] == '*')
@@ -65,12 +68,14 @@ namespace CloudWatchLogDownloader
DescribeLogStreamsResponse lsResponse = null;
do
{
DebugLogger.WriteLine("Getting logStreams...");
lsResponse = client.DescribeLogStreams(new DescribeLogStreamsRequest
{
NextToken = (lsResponse != null ? lsResponse.NextToken : null),
LogGroupName = logGroup.LogGroupName
});
allStreams.AddRange(lsResponse.LogStreams);
DebugLogger.WriteLine("Got logStreams, have {0}, {1} more pages", allStreams.Count, (!string.IsNullOrWhiteSpace(lsResponse.NextToken) ? "still" : "no"));
} while (!string.IsNullOrWhiteSpace(lsResponse.NextToken));
if (string.IsNullOrWhiteSpace(logStream) || logStream[logStream.Length - 1] == '*')
@@ -101,11 +106,20 @@ namespace CloudWatchLogDownloader
}
private static void WriteLogToFile(LogGroup logGroup, LogStream logStream, bool liveStream, string outputFilePath = null)
{
string output = null;
if (string.IsNullOrWhiteSpace(outputFilePath))
{
Console.WriteLine("Choose Output file [logs/" + logStream.LogStreamName + ".log]: ");
var output = Console.ReadLine();
output = Console.ReadLine();
if (string.IsNullOrWhiteSpace(output))
output = "logs/" + logStream.LogStreamName + ".log";
}
else
{
output = outputFilePath;
}
if (!Directory.GetParent(output).Exists)
Directory.CreateDirectory(Directory.GetParent(output).FullName);
@@ -118,6 +132,7 @@ namespace CloudWatchLogDownloader
GetLogEventsResponse leResponse = null;
do
{
DebugLogger.WriteLine("Getting events...");
leResponse = client.GetLogEvents(new GetLogEventsRequest
{
LogGroupName = logGroup.LogGroupName,
@@ -125,13 +140,14 @@ namespace CloudWatchLogDownloader
StartFromHead = true,
NextToken = (leResponse != null ? leResponse.NextForwardToken : null)
});
DebugLogger.WriteLine("Got {0} events", leResponse.Events.Count);
foreach (var ev in leResponse.Events)
sw.WriteLine(ev.Message);
sw.Flush();
if (!leResponse.Events.Any() && !lsMessage)
if (!leResponse.Events.Any() && !lsMessage && liveStream)
{
lsMessage = true;
ConsoleColor oldcolor = Console.ForegroundColor;

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2016 gardient
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,6 +1,8 @@
# CloudWatchLogDownloader
Download full logs from AWS CloudWatch
[![Build Status](https://travis-ci.org/gardient/CloudWatchLogDownloader.svg)](https://travis-ci.org/gardient/CloudWatchLogDownloader)
## Who is it for?
For idiots like me who just want a text dump of the cloud watch log without going through S3

BIN
asd.txt Normal file

Binary file not shown.