Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Commit 5a79695

Browse files
authored
Log non-output messages to stderr. (#367)
1 parent 26e2849 commit 5a79695

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

src/Program.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ static async Task<int> Main(string[] args)
8181
_ when ex is TaskCanceledException => string.Empty,
8282
ODataError _e when ex is ODataError => $"Error {_e.ResponseStatusCode}({_e.Error?.Code}) from API:\n {_e.Error?.Message}",
8383
ApiException _e when ex is ApiException => $"Error {_e.ResponseStatusCode} from API.",
84+
AuthenticationFailedException e => $"Authentication failed: {e.Message}",
85+
Identity.Client.MsalException e => $"Authentication failed: {e.Message}",
8486
_ => ex.Message
8587
};
8688

@@ -124,7 +126,14 @@ static CommandLineBuilder BuildCommandLine()
124126
builder.AddMiddleware(async (ic, next) =>
125127
{
126128
debugEnabled = ic.ParseResult.GetValueForOption<bool>(debugOption);
127-
listener = AzureEventSourceListener.CreateConsoleLogger(debugEnabled ? EventLevel.LogAlways : EventLevel.Critical);
129+
if (debugEnabled)
130+
{
131+
listener = CreateStdErrLogger(EventLevel.LogAlways);
132+
}
133+
else
134+
{
135+
listener = CreateStdErrLogger(EventLevel.Error);
136+
}
128137
await next(ic);
129138
});
130139

@@ -198,6 +207,9 @@ static IHostBuilder CreateHostBuilder(string[] args) =>
198207
}).ConfigureLogging((ctx, logBuilder) =>
199208
{
200209
logBuilder.SetMinimumLevel(LogLevel.Warning);
210+
logBuilder.ClearProviders();
211+
// Log everything to stderr. Investigate if this breaks scripts that check for stderr instead of the exit code.
212+
logBuilder.AddConsole(c => c.LogToStandardErrorThreshold = LogLevel.Trace);
201213
// Allow runtime selection of log level
202214
logBuilder.AddFilter("Microsoft.Graph.Cli", level => level >= (debugEnabled ? LogLevel.Debug : LogLevel.Warning));
203215
});
@@ -214,5 +226,14 @@ static void ConfigureAppConfiguration(IConfigurationBuilder builder, string[] ar
214226
builder.AddJsonFile(authCache.GetAuthenticationCacheFilePath(), optional: true, reloadOnChange: true);
215227
builder.AddEnvironmentVariables(prefix: "MGC_");
216228
}
229+
230+
static AzureEventSourceListener CreateStdErrLogger(EventLevel level = EventLevel.Informational)
231+
{
232+
return new AzureEventSourceListener(delegate (EventWrittenEventArgs eventData, string text)
233+
{
234+
// By default, AzureEventSourceListener.CreateConsoleLogger logs to stdout. Use stderr instead.
235+
Console.Error.WriteLine("[{1}] {0}: {2}", eventData.EventSource.Name, eventData.Level, text);
236+
}, level);
237+
}
217238
}
218239
}

0 commit comments

Comments
 (0)