Skip to content

Commit 7a50d7a

Browse files
authored
Merge pull request #15437 from tamasvajk/feature/log-verbosity
C#: Introduce log verbosity extractor option
2 parents 52d7bd9 + c4849f9 commit 7a50d7a

File tree

16 files changed

+362
-238
lines changed

16 files changed

+362
-238
lines changed

csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,11 @@ protected string RequireEnvironmentVariable(string name)
267267

268268
protected DiagnosticClassifier DiagnosticClassifier { get; }
269269

270-
private readonly ILogger logger = new ConsoleLogger(Verbosity.Info, logThreadId: false);
270+
private readonly ILogger logger = new ConsoleLogger(
271+
VerbosityExtensions.ParseVerbosity(
272+
Environment.GetEnvironmentVariable("CODEQL_VERBOSITY"),
273+
logThreadId: false) ?? Verbosity.Info,
274+
logThreadId: false);
271275

272276
private readonly IDiagnosticsWriter diagnostics;
273277

csharp/codeql-extractor.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,21 @@ options:
4848
The default is 'true'.
4949
type: string
5050
pattern: "^(false|true)$"
51+
logging:
52+
title: Options pertaining to logging.
53+
type: object
54+
properties:
55+
verbosity:
56+
title: Extractor logging verbosity level.
57+
description: >
58+
Controls the level of verbosity of the extractor.
59+
The supported levels are (in order of increasing verbosity):
60+
- off
61+
- errors
62+
- warnings
63+
- info or progress
64+
- debug or progress+
65+
- trace or progress++
66+
- progress+++
67+
type: string
68+
pattern: "^(off|errors|warnings|(info|progress)|(debug|progress\\+)|(trace|progress\\+\\+)|progress\\+\\+\\+)$"

csharp/extractor/Semmle.Extraction.CIL.Driver/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public static void Main(string[] args)
3838
}
3939

4040
var options = new ExtractorOptions(args);
41-
using var logger = new ConsoleLogger(options.Verbosity, logThreadId: false);
41+
using ILogger logger = new ConsoleLogger(options.Verbosity, logThreadId: false);
4242

4343
var actions = options.AssembliesToExtract
4444
.Select(asm => asm.Filename)

csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ public override bool HandleFlag(string key, bool value)
1515
{
1616
switch (key)
1717
{
18-
case "silent":
19-
Verbosity = value ? Verbosity.Off : Verbosity.Info;
20-
return true;
2118
case "help":
2219
Help = true;
2320
return true;

csharp/extractor/Semmle.Extraction.Tests/Options.cs

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void DefaultOptions()
2727
Assert.Null(options.CompilerName);
2828
Assert.Empty(options.CompilerArguments);
2929
Assert.True(options.Threads >= 1);
30-
Assert.Equal(Verbosity.Info, options.Verbosity);
30+
Assert.Equal(Verbosity.Info, options.LegacyVerbosity);
3131
Assert.False(options.Console);
3232
Assert.False(options.PDB);
3333
Assert.False(options.Fast);
@@ -80,29 +80,60 @@ public void CompilerArguments()
8080
public void VerbosityTests()
8181
{
8282
options = CSharp.Options.CreateWithEnvironment(new string[] { "--verbose" });
83-
Assert.Equal(Verbosity.Debug, options.Verbosity);
83+
Assert.Equal(Verbosity.Debug, options.LegacyVerbosity);
8484

8585
options = CSharp.Options.CreateWithEnvironment(new string[] { "--verbosity", "0" });
86-
Assert.Equal(Verbosity.Off, options.Verbosity);
86+
Assert.Equal(Verbosity.Off, options.LegacyVerbosity);
8787

8888
options = CSharp.Options.CreateWithEnvironment(new string[] { "--verbosity", "1" });
89-
Assert.Equal(Verbosity.Error, options.Verbosity);
89+
Assert.Equal(Verbosity.Error, options.LegacyVerbosity);
9090

9191
options = CSharp.Options.CreateWithEnvironment(new string[] { "--verbosity", "2" });
92-
Assert.Equal(Verbosity.Warning, options.Verbosity);
92+
Assert.Equal(Verbosity.Warning, options.LegacyVerbosity);
9393

9494
options = CSharp.Options.CreateWithEnvironment(new string[] { "--verbosity", "3" });
95-
Assert.Equal(Verbosity.Info, options.Verbosity);
95+
Assert.Equal(Verbosity.Info, options.LegacyVerbosity);
9696

9797
options = CSharp.Options.CreateWithEnvironment(new string[] { "--verbosity", "4" });
98-
Assert.Equal(Verbosity.Debug, options.Verbosity);
98+
Assert.Equal(Verbosity.Debug, options.LegacyVerbosity);
9999

100100
options = CSharp.Options.CreateWithEnvironment(new string[] { "--verbosity", "5" });
101-
Assert.Equal(Verbosity.Trace, options.Verbosity);
101+
Assert.Equal(Verbosity.Trace, options.LegacyVerbosity);
102102

103103
Assert.Throws<FormatException>(() => CSharp.Options.CreateWithEnvironment(new string[] { "--verbosity", "X" }));
104104
}
105105

106+
107+
private const string extractorVariableName = "CODEQL_EXTRACTOR_CSHARP_OPTION_LOGGING_VERBOSITY";
108+
private const string cliVariableName = "CODEQL_VERBOSITY";
109+
110+
private void CheckVerbosity(string? extractor, string? cli, Verbosity expected)
111+
{
112+
var currentExtractorVerbosity = Environment.GetEnvironmentVariable(extractorVariableName);
113+
var currentCliVerbosity = Environment.GetEnvironmentVariable(cliVariableName);
114+
try
115+
{
116+
Environment.SetEnvironmentVariable(extractorVariableName, extractor);
117+
Environment.SetEnvironmentVariable(cliVariableName, cli);
118+
119+
options = CSharp.Options.CreateWithEnvironment(new string[] { "--verbose" });
120+
Assert.Equal(expected, options.Verbosity);
121+
}
122+
finally
123+
{
124+
Environment.SetEnvironmentVariable(extractorVariableName, currentExtractorVerbosity);
125+
Environment.SetEnvironmentVariable(cliVariableName, currentCliVerbosity);
126+
}
127+
}
128+
129+
[Fact]
130+
public void VerbosityTests_WithExtractorOption()
131+
{
132+
CheckVerbosity("progress+++", "progress++", Verbosity.All);
133+
CheckVerbosity(null, "progress++", Verbosity.Trace);
134+
CheckVerbosity(null, null, Verbosity.Debug);
135+
}
136+
106137
[Fact]
107138
public void Console()
108139
{
@@ -142,7 +173,7 @@ public void StandaloneDefaults()
142173
public void StandaloneOptions()
143174
{
144175
standaloneOptions = CSharp.Standalone.Options.Create(new string[] { "--silent" });
145-
Assert.Equal(Verbosity.Off, standaloneOptions.Verbosity);
176+
Assert.Equal(Verbosity.Off, standaloneOptions.LegacyVerbosity);
146177
Assert.False(standaloneOptions.Errors);
147178
Assert.False(standaloneOptions.Help);
148179
}

csharp/extractor/Semmle.Extraction/Options.cs

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,39 @@ public abstract class CommonOptions : ICommandLineOptions
1616
public int Threads { get; private set; } = EnvironmentVariables.GetDefaultNumberOfThreads();
1717

1818
/// <summary>
19-
/// The verbosity used in output and logging.
19+
/// The verbosity used specified by the '--silent' or '--verbose' flags or the '--verbosity' option.
2020
/// </summary>
21-
public Verbosity Verbosity { get; protected set; } = Verbosity.Info;
21+
public Verbosity LegacyVerbosity { get; protected set; } = Verbosity.Info;
22+
23+
private Verbosity? verbosity = null;
24+
public Verbosity Verbosity
25+
{
26+
get
27+
{
28+
if (verbosity != null)
29+
{
30+
return verbosity.Value;
31+
}
32+
33+
var envVarValue = EnvironmentVariables.GetExtractorOption("LOGGING_VERBOSITY");
34+
verbosity = VerbosityExtensions.ParseVerbosity(envVarValue, logThreadId: true);
35+
if (verbosity != null)
36+
{
37+
return verbosity.Value;
38+
}
39+
40+
envVarValue = Environment.GetEnvironmentVariable("CODEQL_VERBOSITY");
41+
verbosity = VerbosityExtensions.ParseVerbosity(envVarValue, logThreadId: true);
42+
if (verbosity != null)
43+
{
44+
return verbosity.Value;
45+
}
46+
47+
// This only works, because we already parsed the provided options, so `LegacyVerbosity` is already set (or it still has the default value).
48+
verbosity = LegacyVerbosity;
49+
return verbosity.Value;
50+
}
51+
}
2252

2353
/// <summary>
2454
/// Whether to output to the console.
@@ -63,7 +93,7 @@ public virtual bool HandleOption(string key, string value)
6393
Threads = int.Parse(value);
6494
return true;
6595
case "verbosity":
66-
Verbosity = (Verbosity)int.Parse(value);
96+
LegacyVerbosity = (Verbosity)int.Parse(value);
6797
return true;
6898
case "trap_compression":
6999
if (Enum.TryParse<TrapWriter.CompressionMode>(value, true, out var mode))
@@ -87,11 +117,10 @@ public virtual bool HandleFlag(string flag, bool value)
87117
switch (flag)
88118
{
89119
case "silent":
90-
if (value)
91-
Verbosity = Verbosity.Off;
120+
LegacyVerbosity = value ? Verbosity.Off : Verbosity.Info;
92121
return true;
93122
case "verbose":
94-
Verbosity = value ? Verbosity.Debug : Verbosity.Error;
123+
LegacyVerbosity = value ? Verbosity.Debug : Verbosity.Error;
95124
return true;
96125
case "console":
97126
Console = value;

0 commit comments

Comments
 (0)