Aracılığıyla paylaş


Loggers oluşturmak

Loggers işleminizde çıktısını özelleştirmek ve yapı belirli olaylara yanıt iletileri, hataları ve uyarıları görüntülemek için bir yol sağlar.Her günlük olarak uygulanan bir.Uygulayan net sınıf ILogger Microsoft.Build.Framework.dll derlemede tanımlı arabirim.

Bir günlükçü uygularken kullanabileceğiniz iki yaklaşım vardır:

  • Implement ILogger doğrudan arabirim.

  • Sınıfınızın yardımcı sınıfından türer Logger, Microsoft.Build.Utilities.dll derlemede tanımlı.Loggeruygulayan ILogger ve bazı varsayılan uygulamaları sağlar ILogger üyeleri.

Bu konuda türetildiği basit bir günlükçü yazma anlatılmıştır Logger, ve olayları yanıt olarak belirli bir konsol iletileri görüntüler oluşturmak.

Olayları kaydediliyor

Bir günlükçü amacı, oluþturma motoru tarafından bildirilen gibi yapı ilerleme hakkında bilgi toplamak ve bu bilgileri yararlı biçimde sonra rapor etmektir.Tüm loggers kılmalısınız Initialize yöntemi, olduğu yerde günlükçü olayları kaydeder.Bu örnekte günlükçü için kayıtları TargetStarted, ProjectStarted, ve ProjectFinished olayları.

    public class MySimpleLogger : Logger
    {
        public override void Initialize(Microsoft.Build.Framework.IEventSource eventSource)
        {
            //Register for the ProjectStarted, TargetStarted, and ProjectFinished events
            eventSource.ProjectStarted += new ProjectStartedEventHandler(eventSource_ProjectStarted);
            eventSource.TargetStarted += new TargetStartedEventHandler(eventSource_TargetStarted);
            eventSource.ProjectFinished += new ProjectFinishedEventHandler(eventSource_ProjectFinished);
        }

Olaylarını yanıtlama

Belirli olayları günlüğü kayıtlı değil artık, ortaya çıkan olayları işlemek gerekiyor.İçin ProjectStarted, ve ProjectFinished olayları, günlükçü yalnızca yazar kısa tümcecik ve olayla ilişkili proje dosyasının adı.Tüm iletileri günlükçü konsol penceresine yazılır.


        void eventSource_ProjectStarted(object sender, ProjectStartedEventArgs e)
        {
            Console.WriteLine("Project Started: " + e.ProjectFile);         
        }

        void eventSource_ProjectFinished(object sender, ProjectFinishedEventArgs e)
        {
            Console.WriteLine("Project Finished: " + e.ProjectFile);
        }

Günlükçü ayrıntı değerlerini yanıt

Bazı durumlarda, yalnızca bilgi bir olay oturum isteyebilirsiniz MSBuild.exe /verbosity anahtarını belirli bir değer içeriyor.Bu örnekte, TargetStarted olay işleyicisi, bir ileti yalnızca oturum Verbosity tarafından ayarlanan özellik /verbosity geçin, eşittir LoggerVerbosityDetailed.

        void eventSource_TargetStarted(object sender, TargetStartedEventArgs e)
        {
            if (Verbosity == LoggerVerbosity.Detailed)
            {
                Console.WriteLine("Target Started: " + e.TargetName);
            }
        }

Bir günlükçü belirtme

Günlüğü, bir derleme derlenmiş bir kez söylemeniz gerekebilir MSBuild o günlükçü yapýlarý sýrasýnda kullanılacak.Bu yapılır kullanarak /logger MSBuild.exe ile geçin.MSBuild.exe için kullanılabilen anahtarlar hakkında daha fazla bilgi için bkz: MSBuild Komut Satırı Başvurusu.

Aşağıdaki komut satırını bir proje oluşturur MyProject.csproj ve günlükçü sınıfı uygulanan, SimpleLogger.dll./nologo Anahtarı, başlık ve telif hakkı iletisini gizler ve /noconsolelogger anahtarı devre dışı bırakır, varsayılan MSBuild konsol günlükçü.

MSBuild /nologo /noconsolelogger /logger:SimpleLogger.dll

Proje ile aynı günlükçü ancak ile aşağıdaki komut satırı oluşturur bir Verbosity düzeyini Detailed.

MSBuild /nologo /noconsolelogger /logger:SimpleLogger.dll /verbosity:Detailed

Örnek

ms171471.collapse_all(tr-tr,VS.110).gifDescription

Aşağıdaki örnek için günlükçü tam kodu içerir.

ms171471.collapse_all(tr-tr,VS.110).gifKod

using System;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;

namespace SimpleLogger
{

    public class MySimpleLogger : Logger
    {
        public override void Initialize(Microsoft.Build.Framework.IEventSource eventSource)
        {
            //Register for the ProjectStarted, TargetStarted, and ProjectFinished events
            eventSource.ProjectStarted += new ProjectStartedEventHandler(eventSource_ProjectStarted);
            eventSource.TargetStarted += new TargetStartedEventHandler(eventSource_TargetStarted);
            eventSource.ProjectFinished += new ProjectFinishedEventHandler(eventSource_ProjectFinished);
        }

        void eventSource_ProjectStarted(object sender, ProjectStartedEventArgs e)
        {
            Console.WriteLine("Project Started: " + e.ProjectFile);         
        }

        void eventSource_ProjectFinished(object sender, ProjectFinishedEventArgs e)
        {
            Console.WriteLine("Project Finished: " + e.ProjectFile);
        }
        void eventSource_TargetStarted(object sender, TargetStartedEventArgs e)
        {
            if (Verbosity == LoggerVerbosity.Detailed)
            {
                Console.WriteLine("Target Started: " + e.TargetName);
            }
        }
    }
}

Örnek

ms171471.collapse_all(tr-tr,VS.110).gifDescription

Aşağıdaki örnek, konsol penceresinde görüntülemek yerine bir dosyaya günlük Yazar günlükçü uygulamak gösterilmiştir.

ms171471.collapse_all(tr-tr,VS.110).gifKod

using System;
using System.IO;
using System.Security;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace MyLoggers
{
    // This logger will derive from the Microsoft.Build.Utilities.Logger class,
    // which provides it with getters and setters for Verbosity and Parameters,
    // and a default empty Shutdown() implementation.
    public class BasicFileLogger : Logger
    {
        /// <summary>
        /// Initialize is guaranteed to be called by MSBuild at the start of the build
        /// before any events are raised.
        /// </summary>
        public override void Initialize(IEventSource eventSource)
        {
            // The name of the log file should be passed as the first item in the
            // "parameters" specification in the /logger switch.  It is required
            // to pass a log file to this logger. Other loggers may have zero or more than 
            // one parameters.
            if (null == Parameters)
            {
                throw new LoggerException("Log file was not set.");
            }
            string[] parameters = Parameters.Split(';');
            
            string logFile = parameters[0];
            if (String.IsNullOrEmpty(logFile))
            {
                throw new LoggerException("Log file was not set.");
            }
            
            if (parameters.Length > 1)
            {
                throw new LoggerException("Too many parameters passed.");
            }
            
            try
            {
                // Open the file
                this.streamWriter = new StreamWriter(logFile);
            }
            catch (Exception ex)
            {
                if
                (
                    ex is UnauthorizedAccessException
                    || ex is ArgumentNullException
                    || ex is PathTooLongException
                    || ex is DirectoryNotFoundException
                    || ex is NotSupportedException
                    || ex is ArgumentException
                    || ex is SecurityException
                    || ex is IOException
                )
                {
                    throw new LoggerException("Failed to create log file: " + ex.Message);
                }
                else
                {
                    // Unexpected failure
                    throw;
                }
            }

            // For brevity, we'll only register for certain event types. Loggers can also
            // register to handle TargetStarted/Finished and other events.
            eventSource.ProjectStarted += new ProjectStartedEventHandler(eventSource_ProjectStarted);
            eventSource.TaskStarted += new TaskStartedEventHandler(eventSource_TaskStarted);
            eventSource.MessageRaised += new BuildMessageEventHandler(eventSource_MessageRaised);
            eventSource.WarningRaised += new BuildWarningEventHandler(eventSource_WarningRaised);
            eventSource.ErrorRaised += new BuildErrorEventHandler(eventSource_ErrorRaised);
            eventSource.ProjectFinished += new ProjectFinishedEventHandler(eventSource_ProjectFinished);
        }

        void eventSource_ErrorRaised(object sender, BuildErrorEventArgs e)
        {
            // BuildErrorEventArgs adds LineNumber, ColumnNumber, File, amongst other parameters
            string line = String.Format(": ERROR {0}({1},{2}): ", e.File, e.LineNumber, e.ColumnNumber);
            WriteLineWithSenderAndMessage(line, e);
        }
        
        void eventSource_WarningRaised(object sender, BuildWarningEventArgs e)
        {
            // BuildWarningEventArgs adds LineNumber, ColumnNumber, File, amongst other parameters
            string line = String.Format(": Warning {0}({1},{2}): ", e.File, e.LineNumber, e.ColumnNumber);
            WriteLineWithSenderAndMessage(line, e);
        }

        void eventSource_MessageRaised(object sender, BuildMessageEventArgs e)
        {
            // BuildMessageEventArgs adds Importance to BuildEventArgs
            // Let's take account of the verbosity setting we've been passed in deciding whether to log the message
            if ((e.Importance == MessageImportance.High && IsVerbosityAtLeast(LoggerVerbosity.Minimal))
                || (e.Importance == MessageImportance.Normal && IsVerbosityAtLeast(LoggerVerbosity.Normal))
                || (e.Importance == MessageImportance.Low && IsVerbosityAtLeast(LoggerVerbosity.Detailed))              
                )
            {
                WriteLineWithSenderAndMessage(String.Empty, e);
            }
        }

        void eventSource_TaskStarted(object sender, TaskStartedEventArgs e)
        {
            // TaskStartedEventArgs adds ProjectFile, TaskFile, TaskName
            // To keep this log clean, this logger will ignore these events.
        }
        
        void eventSource_ProjectStarted(object sender, ProjectStartedEventArgs e)
        {
            // ProjectStartedEventArgs adds ProjectFile, TargetNames
            // Just the regular message string is good enough here, so just display that.
            WriteLine(String.Empty, e);
            indent++;
        }

        void eventSource_ProjectFinished(object sender, ProjectFinishedEventArgs e)
        {
            // The regular message string is good enough here too.
            indent--;
            WriteLine(String.Empty, e);
        }
        
        /// <summary>
        /// Write a line to the log, adding the SenderName and Message
        /// (these parameters are on all MSBuild event argument objects)
        /// </summary>
        private void WriteLineWithSenderAndMessage(string line, BuildEventArgs e)
        {
            if (0 == String.Compare(e.SenderName, "MSBuild", true /*ignore case*/))
            {
                // Well, if the sender name is MSBuild, let's leave it out for prettiness
                WriteLine(line, e);
            }
            else
            {
                WriteLine(e.SenderName + ": " + line, e);
            }
        }
        
        /// <summary>
        /// Just write a line to the log
        /// </summary>
        private void WriteLine(string line, BuildEventArgs e)
        {
            for (int i = indent; i > 0; i--)
            {
                streamWriter.Write("\t");
            }
            streamWriter.WriteLine(line + e.Message);
        }
        
        /// <summary>
        /// Shutdown() is guaranteed to be called by MSBuild at the end of the build, after all 
        /// events have been raised.
        /// </summary>
        public override void Shutdown()
        {
            // Done logging, let go of the file
            streamWriter.Close();
        }

        private StreamWriter streamWriter;
        private int indent;
    }
}

Ayrıca bkz.

Kavramlar

MSBuild ile Yapı Günlükleri Alma

Diğer Kaynaklar

MSBuild kavramları