Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original
Este tema aún no ha recibido ninguna valoración - Valorar este tema

LogRecordSequence (Clase)

representa una secuencia de registro almacenada en LogStore.

System.Object
  System.IO.Log.LogRecordSequence

Espacio de nombres:  System.IO.Log
Ensamblado:  System.IO.Log (en System.IO.Log.dll)
public sealed class LogRecordSequence : IRecordSequence, 
	IDisposable

El tipo LogRecordSequence expone los siguientes miembros.

  NombreDescripción
Método públicoLogRecordSequence(LogStore)Inicializa una nueva instancia de la clase de LogRecordSequence con el almacén especificado del registro.
Método públicoLogRecordSequence(String, FileMode)Inicializa una nueva instancia de la clase de LogRecordSequence con una ruta de acceso especificada al almacén del registro y el modo de acceso.
Método públicoLogRecordSequence(LogStore, Int32, Int32)Inicializa una nueva instancia de la clase de LogRecordSequence con el almacén especificado del registro, el tamaño de búfer para cada registro, y el número del búfer.
Método públicoLogRecordSequence(String, FileMode, FileAccess)Inicializa una nueva instancia de la clase de LogRecordSequence con una ruta de acceso especificada al almacén del registro y los modos de acceso y la acción.
Método públicoLogRecordSequence(String, FileMode, FileAccess, FileShare)Inicializa una nueva instancia de la clase de LogRecordSequence con una ruta de acceso especificada al almacén del registro y el modo de acceso.
Método públicoLogRecordSequence(String, FileMode, FileAccess, FileShare, Int32, Int32)Inicializa una nueva instancia de la clase de LogRecordSequence con una ruta de acceso especificada al almacén del registro, los permisos de archivo, los modos de acceso y la acción, y el tamaño de búfer y el recuento de registros.
Método públicoLogRecordSequence(String, FileMode, FileAccess, FileShare, Int32, Int32, FileSecurity)Inicializa una nueva instancia de la clase LogRecordSequence.
Arriba
  NombreDescripción
Propiedad públicaBaseSequenceNumberObtiene el número de secuencia del primer registro válido en LogRecordSequenceactual.
Propiedad públicaLastSequenceNumberObtiene el número de secuencia que es mayor que el último registro anexado
Propiedad públicaLogStoreObtiene LogStore que contiene los datos de esta secuencia de registro. Este método no puede heredarse.
Propiedad públicaMaximumRecordLengthObtiene el tamaño máximo de un registro que se puede agregar a esta secuencia de registro.
Propiedad públicaReservedBytesObtiene el número total de bytes se han reservado que.
Propiedad públicaRestartSequenceNumberObtiene el número de secuencia del área de reinicio más próxima al final del registro.
Propiedad públicaRetryAppendObtiene o establece un valor que indica si anexa automáticamente se reintentados si el registro está lleno.
Arriba
  NombreDescripción
Método públicoAdvanceBaseSequenceNumberMueve el número de secuencia base de registro hacia delante. Este método no puede heredarse.
Método públicoAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions)escribe una entrada de registro a LogRecordSequence. Este método no puede heredarse.
Método públicoAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions)anexa una entrada de registro a IRecordSequence. Este método no puede heredarse.
Método públicoAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection)Anexa una entrada de registro a IRecordSequence, utilizando el espacio previamente reservado en la secuencia. Este método no puede heredarse.
Método públicoAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection)Anexa una entrada de registro a IRecordSequence, utilizando el espacio previamente reservado en la secuencia. Este método no puede heredarse.
Método públicoBeginAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, AsyncCallback, Object)Inicia un asincrónico anexa la operación. Este método no puede heredarse.
Método públicoBeginAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, AsyncCallback, Object)Inicia un asincrónico anexa la operación. Este método no puede heredarse.
Método públicoBeginAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, AsyncCallback, Object)Inicia un asincrónico anexa la operación. Este método no puede heredarse.
Método públicoBeginAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, AsyncCallback, Object)Inicia un asincrónico anexa la operación. Este método no puede heredarse.
Método públicoBeginFlushComienza una operación de vaciado asincrónica, utilizando el espacio previamente reservado en la secuencia. Este método no puede heredarse.
Método públicoBeginReserveAndAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, Int64[], AsyncCallback, Object)Inicia un reservado asincrónico y anexa la operación. Este método no puede heredarse.
Método públicoBeginReserveAndAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, Int64[], AsyncCallback, Object)Inicia un reservado asincrónico y anexa la operación. Este método no puede heredarse.
Método públicoBeginWriteRestartArea(ArraySegment<Byte>, SequenceNumber, ReservationCollection, AsyncCallback, Object)Comienza una operación de escritura asincrónica de área de reinicio, utilizando el espacio previamente reservado en la secuencia. Este método no puede heredarse.
Método públicoBeginWriteRestartArea(IList<ArraySegment<Byte>>, SequenceNumber, ReservationCollection, AsyncCallback, Object)Comienza una operación de escritura asincrónica de área de reinicio, utilizando el espacio previamente reservado en la secuencia. Este método no puede heredarse.
Método públicoCreateReservationCollectionCrea un nuevo ReservationCollection. Este método no puede heredarse.
Método públicoDisposeLibera los recursos utilizados por el componente.
Método públicoEndAppendFinaliza un asincrónico anexa la operación. Este método no puede heredarse.
Método públicoEndFlushFinaliza una operación de vaciado asincrónica. Este método no puede heredarse.
Método públicoEndReserveAndAppendFinaliza un reservado asincrónico y anexa la operación. Este método no puede heredarse.
Método públicoEndWriteRestartAreaFinaliza una operación de escritura asincrónica de área de reinicio. Este método no puede heredarse.
Método públicoEquals(Object)Determina si el objeto especificado es igual al objeto actual. (Se hereda de Object).
Método públicoFlush()Garantiza que se hayan escrito todos los registros anexados. Este método no puede heredarse.
Método públicoFlush(SequenceNumber)Garantiza que todos los registros anexados hasta e incluir el registro con el número de secuencia especificado se hayan escrito duradero. Este método no puede heredarse.
Método públicoGetHashCodeActúa como función hash para un tipo concreto. (Se hereda de Object).
Método públicoGetTypeObtiene el objeto Type de la instancia actual. (Se hereda de Object).
Método públicoReadLogRecordsdevuelve una colección enumerable de registros en la secuencia. Este método no puede heredarse.
Método públicoReadRestartAreasDevuelve una colección enumerable de las áreas de reinicio en la secuencia. Este método no puede heredarse.
Método públicoReserveAndAppend(ArraySegment<Byte>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, Int64[])Crea automáticamente una reserva única y anexa un registro a la secuencia. Este método no puede heredarse.
Método públicoReserveAndAppend(IList<ArraySegment<Byte>>, SequenceNumber, SequenceNumber, RecordAppendOptions, ReservationCollection, Int64[])Crea automáticamente una reserva única y anexa un registro a la secuencia. Este método no puede heredarse.
Método públicoSetLastRecordEstablece el último registro en LogRecordSequence.
Método públicoToStringDevuelve una cadena que representa el objeto actual. (Se hereda de Object).
Método públicoWriteRestartArea(ArraySegment<Byte>)Escribe un área de reinicio a LogRecordSequence. Este método no puede heredarse.
Método públicoWriteRestartArea(IList<ArraySegment<Byte>>)Escribe un área de reinicio a LogRecordSequence. Este método no puede heredarse.
Método públicoWriteRestartArea(ArraySegment<Byte>, SequenceNumber)Escribe un área de reinicio a LogRecordSequence y actualiza el número de secuencia base. Este método no puede heredarse.
Método públicoWriteRestartArea(IList<ArraySegment<Byte>>, SequenceNumber)Escribe un área de reinicio a LogRecordSequence y actualiza el número de secuencia base. Este método no puede heredarse.
Método públicoWriteRestartArea(ArraySegment<Byte>, SequenceNumber, ReservationCollection)Escribe un área de reinicio a LogRecordSequence mediante una reserva, y actualiza el número de secuencia base. Este método no puede heredarse.
Método públicoWriteRestartArea(IList<ArraySegment<Byte>>, SequenceNumber, ReservationCollection)Escribe un área de reinicio a LogRecordSequence mediante una reserva, y actualiza el número de secuencia base. Este método no puede heredarse.
Arriba
  NombreDescripción
Evento públicoTailPinnedSeñala la necesidad de mover la cola de la secuencia.
Arriba

La clase de LogRecordSequence proporciona una implementación de la interfaz de secuencia de registro sobre un registro (CLFS) de Sistema de archivos de registro comunes. Además del estándar las características registro-orientadas, proporciona un modelo de directiva para evitar condiciones registro-completas, y multiplexar de clientes en el mismo archivo físico. Ejecuta la clase de LogStore , que proporciona una interfaz para manipular directamente y administrar un archivo de registro de CLFS. la relación entre la clase de LogStore y la clase de LogRecordSequence es similar a la relación entre un archivo de disco y un objeto de FileStream . El archivo de disco proporciona el almacenamiento concreto, y tiene atributos como longitud y hora de último acceso; mientras que el objeto de FileStream proporciona una vista en el archivo que se puede utilizar para leer de él y para escribir en él. De igual forma, la clase de LogStore tiene atributos como una directiva y una colección de extensiones de disco; y la clase de LogRecordSequence proporciona un mecanismo registro-orientado para leer y escribir datos.

este ejemplo muestra cómo utilizar la clase de LogRecordSequence :


using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.IO.Log;

namespace MyLogRecordSequence
{
    public class MyLog
    {
        string logName = "test.log";
        string logContainer = "MyExtent0";
        int containerSize = 32 * 1024;
        LogRecordSequence sequence = null;
        bool delete = true;

        // These are used in the TailPinned event handler.
        public static LogRecordSequence MySequence = null;
        public static bool AdvanceBase = true;

        public MyLog()
        {
            // Create a LogRecordSequence.
            sequence = new LogRecordSequence(this.logName,
                                              FileMode.CreateNew,
                                              FileAccess.ReadWrite,
                                              FileShare.None);

            // At least one container/extent must be added for Log Record Sequence.
            sequence.LogStore.Extents.Add(this.logContainer, this.containerSize);

            MySequence = sequence;

        }

        public void AddExtents()
        {
            // Add two additional extents. The extents are 
            // of the same size as the first extent.
            sequence.LogStore.Extents.Add("MyExtent1");
            sequence.LogStore.Extents.Add("MyExtent2");
        }

        public void EnumerateExtents()
        {
            LogStore store = sequence.LogStore;

            Console.WriteLine("Enumerating Log Extents...");
            Console.WriteLine("    Extent Count: {0} extents", store.Extents.Count);
            Console.WriteLine("    Extents Are...");
            foreach (LogExtent extent in store.Extents)
            {
                Console.WriteLine("      {0} ({1}, {2})",
                                  Path.GetFileName(extent.Path),
                                  extent.Size,
                                  extent.State);
            }
            Console.WriteLine("    Free Extents: {0} Free", store.Extents.FreeCount);   
        }

        public void SetLogPolicy()
        {
            Console.WriteLine();
            Console.WriteLine("Setting current log policy...");

            // SET LOG POLICY

            LogPolicy policy = sequence.LogStore.Policy;

            // Set AutoGrow policy. This enables the log to automatically grow
            // when the existing extents are full. New extents are added until
            // we reach the MaximumExtentCount extents.
            // AutoGrow policy is supported only in Windows Vista and not available in R2.

            //policy.AutoGrow = true;

            // Set the Growth Rate in terms of extents. This policy specifies
            // "how much" the log should grow. 
            policy.GrowthRate = new PolicyUnit(2, PolicyUnitType.Extents);

            // Set the AutoShrink policy. This enables the log to automatically
            // shrink if the available free space exceeds the shrink percentage. 
            // AutoGrow/shrink policy is supported only in Windows Vista and not available in R2.

            //policy.AutoShrinkPercentage = new PolicyUnit(30, PolicyUnitType.Percentage);

            // Set the PinnedTailThreshold policy.
            // A tail pinned event is triggered when there is no
            // log space available and log space may be freed by advancing the base.
            // The user must handle the tail pinned event by advancing the base of the log. 
            // If the user is not able to move the base of the log, the user should report with exception in
            // the tail pinned handler.
            // PinnedTailThreashold policy dictates the amount of space that the TailPinned event requests 
            // for advancing the base of the log. The amount of space can be in percentage or in terms of bytes 
            // which is rounded off to the nearest containers in CLFS. The default is 35 percent.


            policy.PinnedTailThreshold = new PolicyUnit(10, PolicyUnitType.Percentage);

            // Set the maximum extents the log can have.
            policy.MaximumExtentCount = 6;

            // Set the minimum extents the log can have.
            policy.MinimumExtentCount = 2;

            // Set the prefix for new containers that are added. 
            // when AutoGrow is enabled.
            //policy.NewExtentPrefix = "MyLogPrefix";

            // Set the suffix number for new containers that are added.
            // when AutoGrow is enabled. 
            policy.NextExtentSuffix = 3;

            // Commit the log policy.
            policy.Commit();

            // Refresh updates the IO.Log policy properties with current log policy 
            // set in the log. 
            policy.Refresh();

            // LOG POLICY END
            // 

            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // Setting up IO.Log provided capabilities...
            // 

            // SET RETRY APPEND

            // IO.Log provides a mechanism similar to AutoGrow.
            // If the existing log is full and an append fails, setting RetryAppend
            // invokes the CLFS policy engine to add new extents and re-tries
            // record appends. If MaximumExtent count has been reached, 
            // a SequenceFullException is thrown. 
            // 

            sequence.RetryAppend = true;

            // RETRY APPEND END

            // REGISTER FOR TAILPINNED EVENT NOTIFICATIONS

            // Register for TailPinned Event by passing in an event handler.
            // An event is raised when the log full condition is reached.
            // The user should either advance the base sequence number to the 
            // nearest valid sequence number recommended in the tail pinned event or
            // report a failure that it is not able to advance the base sequence 
            // number. 
            //

            sequence.TailPinned += new EventHandler<TailPinnedEventArgs>(HandleTailPinned);  

            Console.WriteLine("Done...");
        }

        public void ShowLogPolicy()
        {
            Console.WriteLine();
            Console.WriteLine("Showing current log policy...");

            LogPolicy policy = sequence.LogStore.Policy;

            Console.WriteLine("    Minimum extent count:  {0}", policy.MinimumExtentCount);
            Console.WriteLine("    Maximum extent count:  {0}", policy.MaximumExtentCount);
            Console.WriteLine("    Growth rate:           {0}", policy.GrowthRate);
            Console.WriteLine("    Pinned tail threshold: {0}", policy.PinnedTailThreshold);
            Console.WriteLine("    Auto shrink percent:   {0}", policy.AutoShrinkPercentage);
            Console.WriteLine("    Auto grow enabled:     {0}", policy.AutoGrow);
            Console.WriteLine("    New extent prefix:     {0}", policy.NewExtentPrefix);
            Console.WriteLine("    Next extent suffix:    {0}", policy.NextExtentSuffix);

	}

        // Append records. Appending three records.  
        public void AppendRecords()
        {
            Console.WriteLine("Appending Log Records...");
            SequenceNumber previous = SequenceNumber.Invalid;

            previous = sequence.Append(CreateData("Hello World!"), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);
            previous = sequence.Append(CreateData("This is my first Logging App"), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);
            previous = sequence.Append(CreateData("Using LogRecordSequence..."), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);
	    
            Console.WriteLine("Done...");
        }


        // Read the records added to the log. 
        public void ReadRecords()
        {
            Encoding enc = Encoding.Unicode;

            Console.WriteLine();

            Console.WriteLine("Reading Log Records...");
            try
            {
                foreach (LogRecord record in this.sequence.ReadLogRecords(this.sequence.BaseSequenceNumber, LogRecordEnumeratorType.Next))
                {
                    byte[] data = new byte[record.Data.Length];
                    record.Data.Read(data, 0, (int)record.Data.Length);
                    string mystr = enc.GetString(data);
                    Console.WriteLine("    {0}", mystr);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception {0} {1}", e.GetType(), e.Message);
            }

            Console.WriteLine();
        }

        public void FillLog()
        {
            bool append = true;

            while (append)
            {
                try
                {
                    sequence.Append(CreateData(16 * 1024), SequenceNumber.Invalid, SequenceNumber.Invalid, RecordAppendOptions.ForceFlush);
                }

                catch (SequenceFullException)
                {
                    Console.WriteLine("Log is Full...");
                    append = false;
                }
            }
        }

        // Dispose the record sequence and delete the log file. 
        public void Cleanup()
        {
            // Dispose the sequence
            sequence.Dispose();

            // Delete the log file.
            if (delete)
            {
                try
                {
                    // This deletes the base log file and all the extents associated with the log.
                    LogStore.Delete(this.logName);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception {0} {1}", e.GetType(), e.Message);
                }
            }
        }

        // Converts the given data to an Array of ArraySegment<byte> 
        public static IList<ArraySegment<byte>> CreateData(string str)
        {
            Encoding enc = Encoding.Unicode;

            byte[] array = enc.GetBytes(str);

            ArraySegment<byte>[] segments = new ArraySegment<byte>[1];
            segments[0] = new ArraySegment<byte>(array);

            return Array.AsReadOnly<ArraySegment<byte>>(segments);
        }

        public static IList<ArraySegment<byte>> CreateData(int size)
        {
            byte[] array = new byte[size];

            Random rnd = new Random();
            rnd.NextBytes(array);

            ArraySegment<byte>[] segments = new ArraySegment<byte>[1];
            segments[0] = new ArraySegment<byte>(array);

            return Array.AsReadOnly<ArraySegment<byte>>(segments);
        }

        public static SequenceNumber GetAdvanceBaseSeqNumber(SequenceNumber recTargetSeqNum)
        {
            SequenceNumber targetSequenceNumber = SequenceNumber.Invalid;

            Console.WriteLine("Getting actual target sequence number...");

            // 
            // Implement the logic for returning a valid sequence number closer to
            // recommended target sequence number. 
            //

            return targetSequenceNumber;
        }

        public static void HandleTailPinned(object arg, TailPinnedEventArgs tailPinnedEventArgs)
        {
            Console.WriteLine("TailPinned has fired");

            // Based on the implementation of a logging application, the log base can be moved
            // to free up more log space and if it is not possible to move the 
            // base, the application should report by throwing an exception.

            if(MyLog.AdvanceBase)
            {
                try
                {
                    // TailPnnedEventArgs has the recommended sequence number and its generated 
                    // based on PinnedTailThreshold policy. 
                    // This does not map to an actual sequence number in the record sequence
                    // but an approximation and potentially frees up the threshold % log space
                    // when the log base is advanced to a valid sequence number closer to the 
                    // recommended sequence number. 
                    // The user should use this sequence number to locate a closest valid sequence
                    // number to advance the base of the log.

                    SequenceNumber recommendedTargetSeqNum = tailPinnedEventArgs.TargetSequenceNumber; 

                    // Get the actual Target sequence number.
                    SequenceNumber actualTargetSeqNum = MyLog.GetAdvanceBaseSeqNumber(recommendedTargetSeqNum);

                    MySequence.AdvanceBaseSequenceNumber(actualTargetSeqNum);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception thrown {0} {1}", e.GetType(), e.Message);
                }
            }
            else
            {
                // Report back Error if under some conditions the log cannot
                // advance the base sequence number.

                Console.WriteLine("Reporting Error! Unable to move the base sequence number!");
                throw new IOException();
            }
        }
    }

    class LogSample
    {
        static void Main(string[] args)
        {
            // Create log record sequence.
            MyLog log = new MyLog();

            // Add additional extents.
            log.AddExtents();

            // Enumerate the current log extents.
            log.EnumerateExtents();

            // Set log policies and register for TailPinned event notifications. 
            log.SetLogPolicy();

            log.ShowLogPolicy();

            // Append a few records and read the appended records. 
            log.AppendRecords();
            log.ReadRecords();

            // Fill the Log to trigger log growth...and subsequent TailPinned notifications.
            log.FillLog();

            log.EnumerateExtents();

            log.Cleanup();
        }
    }
}



.NET Framework

Compatible con: 4.5, 4, 3.5, 3.0

.NET Framework Client Profile

Compatible con: 4

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.
¿Te ha resultado útil?
(Caracteres restantes: 1500)

Adiciones de comunidad

AGREGAR
© 2013 Microsoft. Reservados todos los derechos.