Skip to content

Commit 821c17c

Browse files
committed
Better structured logs
1 parent 5114a22 commit 821c17c

File tree

6 files changed

+80
-25
lines changed

6 files changed

+80
-25
lines changed

Taxes.Tests/ProcessUtilsTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ public class ProcessUtilsTest
99
public void PrintEnvironmentAndSettings()
1010
{
1111
using var writer = new StringWriter();
12-
ProcessUtils.PrintEnvironmentAndSettings(writer);
12+
ProcessUtils.PrintEnvironmentAndSettings(writer, "dummy.log");
1313
var output = writer.ToString();
1414
Assert.IsTrue(output.Contains("Date and time: "));
1515
Assert.IsTrue(output.Contains("Machine name: "));
1616
Assert.IsTrue(output.Contains("User name: "));
1717
Assert.IsTrue(output.Contains("AppContext base directory: "));
1818
Assert.IsTrue(output.Contains("Current working directory: "));
1919
Assert.IsTrue(output.Contains("Command line parameters: "));
20-
Assert.IsTrue(output.Contains("Commit hash: "));
21-
Assert.IsTrue(output.Contains("Modified files: "));
20+
Assert.IsTrue(output.Contains("Git commit hash: "));
21+
Assert.IsTrue(output.Contains("## Git Modified Files"));
2222
Assert.IsTrue(output.Contains("MD5 digest of files in Reports folder:"));
2323
}
2424

Taxes/Basics.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,18 @@ var r when Regex_RoundingWithResolutionAroundZero().Match(r) is { Success: true,
9090
?? throw new InvalidDataException($"Invalid {nameof(BaseCurrency)} in {basicsFileName}");
9191

9292
BeginTaxPeriodOfInterest = DateTime.ParseExact(
93-
basicsFile.BeginTaxPeriodOfInterest, "yyyy-MM-dd", DefaultCulture);
93+
basicsFile.BeginTaxPeriodOfInterest
94+
?? throw new InvalidDataException($"Invalid {nameof(basicsFile.BeginTaxPeriodOfInterest)} in {basicsFileName}"),
95+
"yyyy-MM-dd",
96+
DefaultCulture);
9497
EndTaxPeriodOfInterest = DateTime.ParseExact(
95-
basicsFile.EndTaxPeriodOfInterest, "yyyy-MM-dd", DefaultCulture);
98+
basicsFile.EndTaxPeriodOfInterest
99+
?? throw new InvalidDataException($"Invalid {nameof(basicsFile.EndTaxPeriodOfInterest)} in {basicsFileName}"),
100+
"yyyy-MM-dd",
101+
DefaultCulture);
96102
FilterTaxFormsByPeriodOfInterest = bool.Parse(
97-
basicsFile.FilterTaxFormsByPeriodOfInterest);
103+
basicsFile.FilterTaxFormsByPeriodOfInterest
104+
?? throw new InvalidDataException($"Invalid {nameof(FilterTaxFormsByPeriodOfInterest)} in {basicsFileName}"));
98105

99106
Positions = new ReadOnlyDictionary<string, Position>(basicsFile.Positions
100107
?? throw new InvalidDataException($"Invalid {nameof(Positions)} in {basicsFileName}"));

Taxes/CryptoEventsReader.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,11 @@ private sealed class EventStr
302302
[Name("Base currency")] public string BaseCurrency { get; set; } = string.Empty;
303303
[Name("State")] public string State { get; set; } = string.Empty;
304304
[Name("Balance")] public string Balance { get; set; } = string.Empty;
305+
306+
public override string ToString()
307+
{
308+
return $"{Type},{Product},{StartedDate},{CompletedDate},{Description},{Amount},{Currency},{FiatAmount},{FiatAmountIncFees},{Fee},{BaseCurrency},{State},{Balance}";
309+
}
305310
}
306311

307312
[Delimiter(",")]

Taxes/ProcessUtils.cs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,41 @@ namespace Taxes;
66

77
public static class ProcessUtils
88
{
9-
public static void PrintEnvironmentAndSettings(TextWriter outWriter)
9+
public static void PrintEnvironmentAndSettings(TextWriter outWriter, string logFilePath)
1010
{
1111
outWriter.WriteLine("# ENVIRONMENT AND SETTINGS");
1212
outWriter.WriteLine();
13-
outWriter.WriteLine($"Date and time: {DateTime.Now}");
14-
outWriter.WriteLine($"Machine name: {Environment.MachineName}");
15-
outWriter.WriteLine($"User name: {Environment.UserName}");
16-
outWriter.WriteLine($"AppContext base directory: {AppContext.BaseDirectory}");
17-
outWriter.WriteLine($"Current working directory: {Environment.CurrentDirectory}");
18-
outWriter.WriteLine($"Command line parameters: {string.Join(' ', Environment.GetCommandLineArgs())}");
19-
outWriter.WriteLine($"Commit hash: {CommandOutput("git rev-parse HEAD").Trim()}");
20-
outWriter.WriteLine($"Modified files: {CommandOutput("git diff")}");
13+
14+
outWriter.WriteLine("## General settings");
15+
outWriter.WriteLine();
16+
outWriter.WriteLine($"- Date and time: {DateTime.Now:o}");
17+
outWriter.WriteLine($"- Machine name: {Environment.MachineName}");
18+
outWriter.WriteLine($"- User name: {Environment.UserName}");
19+
outWriter.WriteLine($"- AppContext base directory: {AppContext.BaseDirectory}");
20+
outWriter.WriteLine($"- Current working directory: {Environment.CurrentDirectory}");
21+
outWriter.WriteLine($"- Command line parameters: {string.Join(' ', Environment.GetCommandLineArgs())}");
22+
outWriter.WriteLine($"- Git commit hash: {CommandOutput("git rev-parse HEAD").Trim()}");
23+
outWriter.WriteLine();
24+
25+
outWriter.WriteLine("## Output files");
26+
outWriter.WriteLine();
27+
outWriter.WriteLine($"- Log file: {logFilePath}");
28+
outWriter.WriteLine();
29+
30+
outWriter.WriteLine("## MD5 digests");
31+
outWriter.WriteLine();
2132
outWriter.WriteLine("MD5 digest of files in Reports folder:");
2233
foreach (var filePath in Directory.GetFiles("Reports"))
2334
{
2435
outWriter.WriteLine($"- {filePath}: {FileUtils.CalculateMD5Digest(filePath)}");
2536
}
37+
outWriter.WriteLine();
2638

27-
outWriter.WriteLine(new string('=', 100));
39+
outWriter.WriteLine("## Git Modified Files");
40+
outWriter.WriteLine();
41+
outWriter.WriteLine("```diff");
42+
outWriter.Write(CommandOutput("git diff"));
43+
outWriter.WriteLine("\n```");
2844
}
2945

3046
internal /* for testing */ static string CommandOutput(string command, string? workingDirectory = null)

Taxes/Program.cs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
primaryWriter: Console.Out);
99
var outWriters = new OutWriters(teeTextWriter, new StringWriter(), new StringWriter());
1010

11-
ProcessUtils.PrintEnvironmentAndSettings(outWriters.Default);
11+
ProcessUtils.PrintEnvironmentAndSettings(outWriters.Default, teeTextWriter.FilePath);
1212

1313
var basics = new Basics(Path.Combine(appBaseDirectory, "Reports"));
1414
var fxRatesFilePath = Path.Combine(basics.ReportsDirectoryPath, basics.FXRatesFilePath);
@@ -17,23 +17,31 @@
1717
var cryptoPortfolioValuesFilePath = Path.Combine(basics.ReportsDirectoryPath, basics.CryptoPortfolioValuesFilePath);
1818
var cryptoPortfolioValues = new CryptoPortfolioValues(basics, fxRates, cryptoPortfolioValuesFilePath);
1919

20+
await outWriters.Default.WriteLineAsync("");
2021
await outWriters.Default.WriteLineAsync("# STOCKS");
22+
await outWriters.Default.WriteLineAsync("");
23+
await outWriters.Default.WriteLineAsync("## Parsing files");
24+
await outWriters.Default.WriteLineAsync("");
2125
var stockEventsReader = new StockEventsReader(basics);
2226
basics.StockEventsFiles
2327
.FindEventsFiles(basics, outWriters)
2428
.SelectMany(eventsFileAndBroker => stockEventsReader
2529
.Parse(eventsFileAndBroker.FilePath, fxRates, eventsFileAndBroker.Broker, outWriters.Default))
26-
.PrintEachElement(outWriters.Default, @event => $"Parsing Event {@event}...")
30+
.PrintEachElement(outWriters.Default, @event => $" - Parsing Event {@event}...")
2731
.ToList()
2832
.ProcessEvents(basics, cryptoPortfolioValues, outWriters);
2933

34+
await outWriters.Default.WriteLineAsync("");
3035
await outWriters.Default.WriteLineAsync("# CRYPTO");
36+
await outWriters.Default.WriteLineAsync("");
37+
await outWriters.Default.WriteLineAsync("## Parsing files");
38+
await outWriters.Default.WriteLineAsync("");
3139
var cryptoEventsReader = new CryptoEventsReader(basics);
3240
basics.CryptoEventsFiles
3341
.FindEventsFiles(basics, outWriters)
3442
.SelectMany(eventsFileAndBroker => cryptoEventsReader
3543
.ParseFile(eventsFileAndBroker.FilePath, fxRates, eventsFileAndBroker.Broker, outWriters.Default))
36-
.PrintEachElement(outWriters.Default, @event => $"Parsing Event {@event}...")
44+
.PrintEachElement(outWriters.Default, @event => $" - Parsing Event {@event}...")
3745
.ToList()
3846
.ProcessEvents(basics, cryptoPortfolioValues, outWriters);
3947

@@ -47,12 +55,15 @@ public static IEnumerable<EventsFileAndBroker> FindEventsFiles(this IEnumerable<
4755
.EnsureNonEmpty()
4856
.Select(path => new EventsFileAndBroker(path, eventsFiles.Broker)))
4957
.OrderBy(eventsFileAndBroker => eventsFileAndBroker.FilePath)
50-
.PrintEachElement(outWriters.Default, filePath => $"Parsing File {filePath}...");
58+
.PrintEachElement(outWriters.Default, efb => $"- Parsing File {System.IO.Path.GetFileName(efb.FilePath)}...");
5159

5260
public static void ProcessEvents(this IList<Event> events, Basics basics, CryptoPortfolioValues cryptoPortfolioValues, OutWriters outWriters)
5361
{
5462
var tickerProcessing = new TickerProcessing(basics, cryptoPortfolioValues);
5563

64+
outWriters.Default.WriteLine(); // Empty line before H2
65+
outWriters.Default.WriteLine("## Process events");
66+
5667
// Taken into account in each ticker
5768
var nonTickerRelatedEvents = (
5869
from e in events
@@ -72,6 +83,9 @@ from e in eventsByTicker
7283
select tickerProcessing.ProcessTicker(e.ticker, e.tickerEvents, outWriters))
7384
.ToList();
7485

86+
outWriters.Default.WriteLine();
87+
outWriters.Default.WriteLine("## Aggregated Metrics");
88+
outWriters.Default.WriteLine();
7589
tickerStates.PrintAggregatedMetrics(outWriters.Default, basics);
7690

7791
var anyCryptoEvent = events.Any(e =>
@@ -84,10 +98,16 @@ select tickerProcessing.ProcessTicker(e.ticker, e.tickerEvents, outWriters))
8498
case (true, true):
8599
throw new InvalidOperationException(
86100
$"Cannot process crypto and non-crypto events at the same time. Please split them into different {nameof(ProcessEvents)} executions.");
87-
case (true, false):
101+
case (true, false): // Crypto case -> 2086 Form
102+
outWriters.Default.WriteLine();
103+
outWriters.Default.WriteLine("## 2086 Form");
104+
outWriters.Default.WriteLine();
88105
outWriters.Default.Write(outWriters.Form2086Writer.ToString());
89106
break;
90-
case (false, true):
107+
case (false, true): // Stocks case -> 2074 Form
108+
outWriters.Default.WriteLine();
109+
outWriters.Default.WriteLine("## 2074 Form");
110+
outWriters.Default.WriteLine();
91111
outWriters.Default.Write(outWriters.Form2047Writer.ToString());
92112
break;
93113
case (false, false):

Taxes/TickerProcessing.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,17 @@ public TickerState ProcessTicker(string ticker, IList<Event> tickerEvents, OutWr
1313

1414
var isin = (string.IsNullOrWhiteSpace(ticker) ? "" : basics.Positions[ticker].ISIN);
1515
if (string.IsNullOrWhiteSpace(ticker))
16-
outWriter.WriteLine($"PROCESS NON-TICKER-RELATED EVENTS");
16+
{
17+
outWriter.WriteLine();
18+
outWriter.WriteLine($"### Non-Ticker-Related Events");
19+
outWriter.WriteLine();
20+
}
1721
else
18-
outWriter.WriteLine($"PROCESS {ticker} [{isin}]");
22+
{
23+
outWriter.WriteLine();
24+
outWriter.WriteLine($"### {ticker} [{isin}]");
25+
outWriter.WriteLine();
26+
}
1927

2028
var eventIndex = 0;
2129
var tickerState = new TickerState(ticker, isin);
@@ -44,7 +52,6 @@ public TickerState ProcessTicker(string ticker, IList<Event> tickerEvents, OutWr
4452
outWriter.WriteLine();
4553
}
4654

47-
outWriter.WriteLine(Separator);
4855
return tickerState;
4956
}
5057

0 commit comments

Comments
 (0)