Esempio n. 1
0
 public static void InitializeLogObserverHolder(this DiagClient diag, ref LogObserverHolder holder,
                                                LogObserver observer, object arguments)
 {
     holder.Observer     = observer;
     holder.IsRegistered = false;
     holder.Arguments    = arguments;
 }
Esempio n. 2
0
 public static void UnregisterLogObserver(this DiagClient diag, LogObserverHolder observerHolder)
 {
     diag.Impl.GetLogObserverManager().UnregisterObserver(observerHolder);
 }
Esempio n. 3
0
        private static bool Run(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
            var ctx = new Context();

            ctx.Options = CliParser.Parse(args);
            if (ctx.Options == null)
            {
                return(false);
            }

            StreamWriter      logWriter    = null;
            ResultLogger      resultLogger = null;
            LogObserverHolder logObserver  = null;

            try
            {
                using (var logger = new ProgressBar())
                {
                    ctx.Logger = logger;
                    OpenKeySet(ctx);
                    InitializeHorizon(ctx);

                    if (ctx.Options.AccessLog != null)
                    {
                        logWriter   = new StreamWriter(ctx.Options.AccessLog);
                        logObserver = new LogObserverHolder();

                        // ReSharper disable once AccessToDisposedClosure
                        // References to logWriter should be gone by the time it's disposed
                        ctx.Horizon.Diag.InitializeLogObserverHolder(ref logObserver,
                                                                     (in LogMetaData data, in LogBody body, object arguments) =>
                                                                     logWriter.Write(body.Message.ToString()), null);

                        ctx.Horizon.Diag.RegisterLogObserver(logObserver);

                        ctx.Horizon.Fs.SetLocalSystemAccessLogForDebug(true);
                        ctx.Horizon.Fs.SetGlobalAccessLogMode(GlobalAccessLogMode.Log).ThrowIfFailure();
                    }

                    if (ctx.Options.ResultLog != null)
                    {
                        resultLogger = new ResultLogger(new StreamWriter(ctx.Options.ResultLog),
                                                        printStackTrace: true, printSourceInfo: true, combineRepeats: true);

                        Result.SetLogger(resultLogger);
                    }

                    if (ctx.Options.RunCustom)
                    {
                        CustomTask(ctx);
                        return(true);
                    }

                    RunTask(ctx);
                }
            }
            finally
            {
                if (logObserver != null)
                {
                    ctx.Horizon.Diag.UnregisterLogObserver(logObserver);
                }

                logWriter?.Dispose();

                if (resultLogger != null)
                {
                    Result.SetLogger(null);
                    resultLogger.Dispose();
                }
            }

            return(true);
        }