Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 9 additions & 101 deletions src/Docfx.Common/Loggers/ReportLogListener.cs
Original file line number Diff line number Diff line change
@@ -1,136 +1,44 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Text.Json.Serialization;
using Newtonsoft.Json;

namespace Docfx.Common;

public sealed class ReportLogListener : ILoggerListener
{
private readonly string _repoRoot;
private readonly string _root;
private readonly StreamWriter _writer;

private const LogLevel LogLevelThreshold = LogLevel.Diagnostic;

public ReportLogListener(string reportPath, string repoRoot, string root)
public ReportLogListener(string reportPath)
{
var dir = Path.GetDirectoryName(reportPath);
if (!string.IsNullOrEmpty(dir))
{
Directory.CreateDirectory(dir);
}
_writer = new StreamWriter(reportPath, true);
_repoRoot = repoRoot;
_root = root;
}

public void WriteLine(ILogItem item)
{
ArgumentNullException.ThrowIfNull(item);

var level = item.LogLevel;
var message = item.Message;
var file = item.File;
var line = item.Line;
if (level < LogLevelThreshold) return;

var reportItem = new ReportItem
_writer.WriteLine(JsonUtility.Serialize(new
{
Severity = GetSeverity(level),
Message = message,
File = TransformFile(file),
Line = line,
DateTime = DateTime.UtcNow,
Code = item.Code,
};

_writer.WriteLine(JsonUtility.Serialize(reportItem));
severity = item.LogLevel,
message = item.Message,
file = item.File,
line = item.Line,
date_time = DateTime.UtcNow,
code = item.Code,
}));
}

public void Dispose()
{
_writer.Dispose();
}

private static MessageSeverity GetSeverity(LogLevel level)
{
switch (level)
{
case LogLevel.Diagnostic:
return MessageSeverity.Diagnostic;
case LogLevel.Verbose:
return MessageSeverity.Verbose;
case LogLevel.Info:
return MessageSeverity.Info;
case LogLevel.Suggestion:
return MessageSeverity.Suggestion;
case LogLevel.Warning:
return MessageSeverity.Warning;
case LogLevel.Error:
return MessageSeverity.Error;
default:
throw new NotSupportedException(level.ToString());
}
}

private string TransformFile(string fileFromRoot)
{
if (fileFromRoot == null)
{
return null;
}
if (string.IsNullOrEmpty(_repoRoot))
{
return fileFromRoot;
}

string file = ((RelativePath)fileFromRoot).RemoveWorkingFolder();
string basePath = Path.GetFullPath(_repoRoot);
string fullPath = Path.GetFullPath(Path.Combine(_root, file));
return PathUtility.MakeRelativePath(basePath, fullPath);
}

public void Flush()
{
_writer.Flush();
}

public class ReportItem
{
[JsonProperty("message")]
[JsonPropertyName("message")]
public string Message { get; set; }

[JsonProperty("file")]
[JsonPropertyName("file")]
public string File { get; set; }

[JsonProperty("line")]
[JsonPropertyName("line")]
public string Line { get; set; }

[JsonProperty("date_time")]
[JsonPropertyName("date_time")]
public DateTime DateTime { get; set; }

[JsonProperty("message_severity")]
[JsonPropertyName("message_severity")]
public MessageSeverity Severity { get; set; }

[JsonProperty("code")]
[JsonPropertyName("code")]
public string Code { get; set; }
}

public enum MessageSeverity
{
Error,
Warning,
Suggestion,
Info,
Verbose,
Diagnostic
}
}
9 changes: 5 additions & 4 deletions src/docfx/Models/CommandHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,19 @@ public static int Run(LogOptions options, Action run)
var consoleLogListener = new ConsoleLogListener();
Logger.RegisterListener(consoleLogListener);

var buildOption = options as BuildCommandOptions;
var root = Path.GetDirectoryName(buildOption?.ConfigFile ?? Directory.GetCurrentDirectory());

if (!string.IsNullOrWhiteSpace(options.LogFilePath))
{
Logger.RegisterListener(new ReportLogListener(options.LogFilePath, options.RepoRoot ?? string.Empty, root));
Logger.RegisterListener(new ReportLogListener(options.LogFilePath));
}

if (options.LogLevel.HasValue)
{
Logger.LogLevelThreshold = options.LogLevel.Value;
}
else if (options.Verbose)
{
Logger.LogLevelThreshold = LogLevel.Verbose;
}

Logger.WarningsAsErrors = options.WarningsAsErrors;

Expand Down
12 changes: 6 additions & 6 deletions src/docfx/Models/LogOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ namespace Docfx;

internal class LogOptions : CommandSettings
{
[Description("Specify the file name to save processing log")]
[Description("Save log as structured JSON to the specified file")]
[CommandOption("-l|--log")]
public string LogFilePath { get; set; }

[Description("Specify to which log level will be logged. By default log level >= Info will be logged. The acceptable value could be Verbose, Info, Warning, Error.")]
[Description("Set log level to error, warning, info, verbose or diagnostic")]
[CommandOption("--logLevel")]
public LogLevel? LogLevel { get; set; }

[Description("Specify the GIT repository root folder.")]
[CommandOption("--repositoryRoot")]
public string RepoRoot { get; set; }
[Description("Set log level to verbose")]
[CommandOption("--verbose")]
public bool Verbose { get; set; }

[Description("Specify if warnings should be treated as errors.")]
[Description("Treats warnings as errors")]
[CommandOption("--warningsAsErrors")]
public bool WarningsAsErrors { get; set; }
}
76 changes: 0 additions & 76 deletions test/Docfx.Common.Tests/ReportLoggerListenerTest.cs

This file was deleted.