private static void LogException(Exception ex, PyRevitCLILogLevel logLevel) { if (logLevel == PyRevitCLILogLevel.Debug) { logger.Error(string.Format("{0} ({1})\n{2}", ex.Message, ex.GetType().ToString(), ex.StackTrace)); } else { logger.Error(string.Format("{0}\nRun with \"--debug\" option to see debug messages", ex.Message)); } }
// cli entry point: static void Main(string[] args) { // process arguments for logging level var argsList = new List <string>(args); // setup logger // process arguments for hidden debug mode switch PyRevitCLILogLevel logLevel = PyRevitCLILogLevel.InfoMessages; var config = new LoggingConfiguration(); var logconsole = new ConsoleTarget("logconsole") { Layout = @"${level}: ${message} ${exception}" }; config.AddTarget(logconsole); config.AddRule(LogLevel.Error, LogLevel.Fatal, logconsole); if (argsList.Contains("--verbose")) { argsList.Remove("--verbose"); logLevel = PyRevitCLILogLevel.InfoMessages; config.AddRule(LogLevel.Info, LogLevel.Info, logconsole); } if (argsList.Contains("--debug")) { argsList.Remove("--debug"); logLevel = PyRevitCLILogLevel.Debug; config.AddRule(LogLevel.Debug, LogLevel.Debug, logconsole); } // config logger LogManager.Configuration = config; try { // process docopt // docopt raises exception if pattern matching fails arguments = new Docopt().Apply(UsagePatterns, argsList, exit: false, help: false); // print active arguments in debug mode if (logLevel == PyRevitCLILogLevel.Debug) { PrintArguments(arguments); } // setup output log if (arguments["--log"] != null) { var logfile = new FileTarget("logfile") { FileName = arguments["--log"].Value as string }; config.AddTarget(logfile); config.AddRuleForAllLevels(logfile); arguments.Remove("--log"); // update logger config LogManager.Configuration = config; } // check if requesting version IsVersionMode = arguments["--version"].IsTrue || arguments["-V"].IsTrue; // check if requesting help IsHelpMode = arguments["--help"].IsTrue || arguments["-h"].IsTrue; // check if requesting help with full usage patterns IsHelpUsagePatternMode = arguments["--usage"].IsTrue; try { // now call methods based on inputs ProcessArguments(); // process global error codes ProcessErrorCodes(); } catch (Exception ex) { LogException(ex, logLevel); } // Flush and close down internal threads and timers LogManager.Shutdown(); } catch (Exception ex) { // when docopt fails, print help logger.Debug("Arg processing failed. | {0}", ex.Message); PyRevitCLIAppHelps.PrintHelp(PyRevitCLICommandType.Main); } }