@@ -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