//******************************************************************************************************
// LogFile.cs - Gbtc
//
// Copyright © 2012, Grid Protection Alliance. All Rights Reserved.
//
// Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
// the NOTICE file distributed with this work for additional information regarding copyright ownership.
// The GPA licenses this file to you under the Eclipse Public License -v 1.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain a copy of the License at:
//
// http://www.opensource.org/licenses/eclipse-1.0.php
//
// Unless agreed to in writing, the subject software distributed under the License is distributed on an
// "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
// License for the specific language governing permissions and limitations.
//
// Code Modification History:
// ----------------------------------------------------------------------------------------------------
// 04/09/2007 - Pinal C. Patel
// Original version of source code generated.
// 11/30/2007 - Pinal C. Patel
// Modified the "design time" check in EndInit() method to use LicenseManager.UsageMode property
// instead of DesignMode property as the former is more accurate than the latter.
// 09/19/2008 - J. Ritchie Carroll
// Converted to C#.
// 10/21/2008 - Pinal C. Patel
// Edited code comments.
// 06/18/2009 - Pinal C. Patel
// Fixed the implementation of Enabled property.
// 07/02/2009 - Pinal C. Patel
// Modified state alterning properties to reopen the file when changed.
// 09/14/2009 - Stephen C. Wills
// Added new header and license agreement.
// 07/30/2012 - Vijay Sukhavasi
// Added user option to control time duration of rollover.
// 12/14/2012 - Starlynn Danyelle Gilliam
// Modified Header.
//
//******************************************************************************************************
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using GSF.Collections;
using GSF.Configuration;
namespace GSF.IO
{
#region [ Enumerations ]
/// <summary>
/// Specifies the operation to be performed on the <see cref="LogFile"/> when it is full.
/// </summary>
public enum LogFileFullOperation
{
/// <summary>
/// Truncates the existing entries in the <see cref="LogFile"/> to make space for new entries.
/// </summary>
Truncate,
/// <summary>
/// Rolls over to a new <see cref="LogFile"/>, and keeps the full <see cref="LogFile"/> for reference.
/// </summary>
Rollover
}
#endregion
/// <summary>
/// Represents a file that can be used for logging messages in real-time.
/// </summary>
/// <example>
/// This example shows how to use <see cref="LogFile"/> for logging messages:
/// <code>
/// using System;
/// using GSF.IO;
///
/// class Program
/// {
/// static void Main(string[] args)
/// {
/// LogFile log = new LogFile();
/// log.Initialize(); // Initialize the log file.
/// log.Open(); // Open the log file.
/// log.WriteTimestampedLine("Test entry"); // Write message to the log file.
/// log.Flush(); // Flush message to the log file.
/// log.Close(); // Close the log file.
///
/// Console.ReadLine();
/// }
/// }
/// </code>
/// </example>
[ToolboxBitmap(typeof(LogFile))]
public class LogFile : Component, ISupportLifecycle, ISupportInitialize, IProvideStatus, IPersistSettings
{
#region [ Members ]
// Constants
/// <summary>
/// Specifies the minimum size for a <see cref="LogFile"/>.
/// </summary>
public const int MinFileSize = 1;
/// <summary>
/// Specifies the maximum size for a <see cref="LogFile"/>.
/// </summary>
public const int MaxFileSize = 10;
/// <summary>
/// Specifies the default value for the <see cref="FileName"/> property.
/// </summary>
public const string DefaultFileName = "LogFile.txt";
/// <summary>
/// Specifies the default value for the <see cref="FileSize"/> property.
/// </summary>
public const int DefaultFileSize = 3;
/// <summary>
/// Specifies the default value for the <see cref="FileFullOperation"/> property.
/// </summary>
public const LogFileFullOperation DefaultFileFullOperation = LogFileFullOperation.Truncate;
/// <summary>
/// Specifies the default value for the <see cref="PersistSettings"/> property.
/// </summary>
public const bool DefaultPersistSettings = false;
/// <summary>
/// Specifies the default value for the <see cref="LogFilesDuration"/> property.
/// </summary>
public const double DefaultLogFilesDuration = 0.0;
/// <summary>
/// Specifies the default value for the <see cref="SettingsCategory"/> property.
/// </summary>
public const string DefaultSettingsCategory = "LogFile";
// Events
/// <summary>
/// Occurs when the <see cref="LogFile"/> is full.
/// </summary>
[Description("Occurs when the LogFile is full.")]
public event EventHandler FileFull;
/// <summary>
/// Occurs when an <see cref="Exception"/> is encountered while writing entries to the <see cref="LogFile"/>.
/// </summary>
/// <remarks>
/// <see cref="EventArgs{T}.Argument"/> is the <see cref="Exception"/> encountered during writing of log entries.
/// </remarks>
[Description("Occurs when an Exception is encountered while writing entries to the LogFile.")]
public event EventHandler<EventArgs<Exception>> LogException;
// Fields
private string m_fileName;
private int m_fileSize;
private LogFileFullOperation m_fileFullOperation;
private bool m_persistSettings;
private string m_settingsCategory;
private FileStream m_fileStream;
private readonly ManualResetEvent m_operationWaitHandle;
private readonly ProcessList<string> m_logEntryQueue;
private Encoding m_textEncoding;
private bool m_disposed;
private bool m_initialized;
private double m_logFilesDuration;
private readonly Dictionary<DateTime, string> m_savedFilesWithTime;
#endregion
#region [ Constructors ]
/// <summary>
/// Initializes a new instance of the <see cref="LogFile"/> class.
/// </summary>
public LogFile()
{
m_fileName = DefaultFileName;
m_fileSize = DefaultFileSize;
m_fileFullOperation = DefaultFileFullOperation;
m_logFilesDuration = DefaultLogFilesDuration;
m_persistSettings = DefaultPersistSettings;
m_settingsCategory = DefaultSettingsCategory;
m_textEncoding = Encoding.Default;
m_operationWaitHandle = new ManualResetEvent(true);
m_savedFilesWithTime = new Dictionary<DateTime, string>();
m_logEntryQueue = ProcessList<string>.CreateRealTimeQueue(WriteLogEntries);
this.FileFull += LogFile_FileFull;
m_logEntryQueue.ProcessException += ProcessExceptionHandler;
}
/// <summary>
/// Initializes a new instance of the <see cref="LogFile"/> class.
/// </summary>
/// <param name="container"><see cref="IContainer"/> object that contains the <see cref="LogFile"/>.</param>
public LogFile(IContainer container)
: this()
{
if ((object)container != null)
container.Add(this);
}
#endregion
#region [ Properties ]
/// <summary>
/// Gets or sets the name of the <see cref="LogFile"/>, including the file extension.
/// </summary>
/// <exception cref="ArgumentNullException">The value being assigned is null or empty string.</exception>
[Category("Settings"),
DefaultValue(DefaultFileName),
Description("Name of the LogFile, including the file extension.")]
public string FileName
{
get
{
return m_fileName;
}
set
{
if (string.IsNullOrEmpty(value))
throw new ArgumentNullException("value");
m_fileName = value;
ReOpen();
}
}
/// <summary>
/// Gets or sets the size of the <see cref="LogFile"/> in MB.
/// </summary>
///<exception cref="ArgumentOutOfRangeException">The value being assigned outside the <see cref="MinFileSize"/> and <see cref="MaxFileSize"/> range.</exception>
[Category("Settings"),
DefaultValue(DefaultFileSize),
Description("Size of the LogFile in MB.")]
public int FileSize
{
get
{
return m_fileSize;
}
set
{
if (value < MinFileSize || value > MaxFileSize)
throw new ArgumentOutOfRangeException("value", string.Format("Value must be between {0} and {1}", MinFileSize, MaxFileSize));
m_fileSize = value;
}
}
/// <summary>
/// Gets or sets the type of operation to be performed when the <see cref="LogFile"/> is full.
/// </summary>
[Category("Behavior"),
DefaultValue(DefaultFileFullOperation),
Description("Type of operation to be performed when the LogFile is full.")]
public LogFileFullOperation FileFullOperation
{
get
{
return m_fileFullOperation;
}
set
{
m_fileFullOperation = value;
}
}
/// <summary>
/// Gets or sets the time duration, in hours, to save the <see cref="LogFile"/> .
/// </summary>
[Category("Behavior"),
DefaultValue(DefaultLogFilesDuration),
Description("Time duration in hours to save the log files.")]
public double LogFilesDuration
{
get
{
return m_logFilesDuration;
}
set
{
m_logFilesDuration = value;
}
}
/// <summary>
/// Gets or sets a boolean value that indicates whether the settings of <see cref="LogFile"/> object are
/// to be saved to the config file.
/// </summary>
[Category("Persistance"),
DefaultValue(DefaultPersistSettings),
Description("Indicates whether the settings of LogFile object are to be saved to the config file.")]
public bool PersistSettings
{
get
{
return m_persistSettings;
}
set
{
m_persistSettings = value;
}
}
/// <summary>
/// Gets or sets the category under which the settings of <see cref="LogFile"/> object are to be saved
/// to the config file if the <see cref="PersistSettings"/> property is set to true.
/// </summary>
/// <exception cref="ArgumentNullException">The value being assigned is null or empty string.</exception>
[Category("Persistance"),
DefaultValue(DefaultSettingsCategory),
Description("Category under which the settings of LogFile object are to be saved to the config file if the PersistSettings property is set to true.")]
public string SettingsCategory
{
get
{
return m_settingsCategory;
}
set
{
if (string.IsNullOrEmpty(value))
throw new ArgumentNullException("value");
m_settingsCategory = value;
}
}
/// <summary>
/// Gets or sets the <see cref="Encoding"/> to be used to encode the messages being logged.
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public virtual Encoding TextEncoding
{
get
{
return m_textEncoding;
}
set
{
if ((object)value == null)
m_textEncoding = Encoding.Default;
else
m_textEncoding = value;
}
}
/// <summary>
/// Gets or sets a boolean value that indicates whether the <see cref="LogFile"/> object is currently enabled.
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public bool Enabled
{
get
{
return IsOpen;
}
set
{
if (value && !Enabled)
Open();
else if (!value && Enabled)
Close();
}
}
/// <summary>
/// Gets a boolean value that indicates whether the <see cref="LogFile"/> is open.
/// </summary>
[Browsable(false)]
public bool IsOpen
{
get
{
return ((object)m_fileStream != null);
}
}
/// <summary>
/// Gets the unique identifier of the <see cref="LogFile"/> object.
/// </summary>
[Browsable(false)]
public string Name
{
get
{
return m_settingsCategory;
}
}
/// <summary>
/// Gets the descriptive status of the <see cref="LogFile"/> object.
/// </summary>
[Browsable(false)]
public string Status
{
get
{
StringBuilder status = new StringBuilder();
status.Append(" Configuration section: ");
status.Append(m_settingsCategory);
status.AppendLine();
status.Append(" Maximum export size: ");
status.Append(m_fileSize.ToString());
status.Append(" MB");
status.AppendLine();
status.Append(" File full operation: ");
status.Append(m_fileFullOperation);
status.AppendLine();
if ((object)m_logEntryQueue != null)
status.Append(m_logEntryQueue.Status);
return status.ToString();
}
}
#endregion
#region [ Methods ]
/// <summary>
/// Initializes the <see cref="LogFile"/> object.
/// </summary>
/// <remarks>
/// <see cref="Initialize()"/> is to be called by user-code directly only if the <see cref="LogFile"/>
/// object is not consumed through the designer surface of the IDE.
/// </remarks>
public void Initialize()
{
if (!m_initialized)
{
LoadSettings(); // Load settings from the config file.
m_initialized = true; // Initialize only once.
}
}
/// <summary>
/// Performs necessary operations before the <see cref="LogFile"/> object properties are initialized.
/// </summary>
/// <remarks>
/// <see cref="BeginInit()"/> should never be called by user-code directly. This method exists solely for use
/// by the designer if the <see cref="LogFile"/> object is consumed through the designer surface of the IDE.
/// </remarks>
[EditorBrowsable(EditorBrowsableState.Never)]
public void BeginInit()
{
if (!DesignMode)
{
try
{
// Nothing needs to be done before component is initialized.
}
catch (Exception)
{
// Prevent the IDE from crashing when component is in design mode.
}
}
}
/// <summary>
/// Performs necessary operations after the <see cref="LogFile"/> object properties are initialized.
/// </summary>
/// <remarks>
/// <see cref="EndInit()"/> should never be called by user-code directly. This method exists solely for use
/// by the designer if the <see cref="LogFile"/> object is consumed through the designer surface of the IDE.
/// </remarks>
[EditorBrowsable(EditorBrowsableState.Never)]
public void EndInit()
{
if (!DesignMode)
{
try
{
Initialize();
}
catch (Exception)
{
// Prevent the IDE from crashing when component is in design mode.
}
}
}
/// <summary>
/// Saves settings for the <see cref="LogFile"/> object to the config file if the <see cref="PersistSettings"/>
/// property is set to true.
/// </summary>
Lines 1–500 of 918. Load more
//****************************************************************************************************** // LogFile.cs - Gbtc // // Copyright © 2012, Grid Protection Alliance. All Rights Reserved. // // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See // the NOTICE file distributed with this work for additional information regarding copyright ownership. // The GPA licenses this file to you under the Eclipse Public License -v 1.0 (the "License"); you may // not use this file except in compliance with the License. You may obtain a copy of the License at: // // http://www.opensource.org/licenses/eclipse-1.0.php // // Unless agreed to in writing, the subject software distributed under the License is distributed on an // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the // License for the specific language governing permissions and limitations. // // Code Modification History: // ---------------------------------------------------------------------------------------------------- // 04/09/2007 - Pinal C. Patel // Original version of source code generated. // 11/30/2007 - Pinal C. Patel // Modified the "design time" check in EndInit() method to use LicenseManager.UsageMode property // instead of DesignMode property as the former is more accurate than the latter. // 09/19/2008 - J. Ritchie Carroll // Converted to C#. // 10/21/2008 - Pinal C. Patel // Edited code comments. // 06/18/2009 - Pinal C. Patel // Fixed the implementation of Enabled property. // 07/02/2009 - Pinal C. Patel // Modified state alterning properties to reopen the file when changed. // 09/14/2009 - Stephen C. Wills // Added new header and license agreement. // 07/30/2012 - Vijay Sukhavasi // Added user option to control time duration of rollover. // 12/14/2012 - Starlynn Danyelle Gilliam // Modified Header. // //****************************************************************************************************** using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using GSF.Collections; using GSF.Configuration; namespace GSF.IO { #region [ Enumerations ] /// <summary> /// Specifies the operation to be performed on the <see cref="LogFile"/> when it is full. /// </summary> public enum LogFileFullOperation { /// <summary> /// Truncates the existing entries in the <see cref="LogFile"/> to make space for new entries. /// </summary> Truncate, /// <summary> /// Rolls over to a new <see cref="LogFile"/>, and keeps the full <see cref="LogFile"/> for reference. /// </summary> Rollover } #endregion /// <summary> /// Represents a file that can be used for logging messages in real-time. /// </summary> /// <example> /// This example shows how to use <see cref="LogFile"/> for logging messages: /// <code> /// using System; /// using GSF.IO; /// /// class Program /// { /// static void Main(string[] args) /// { /// LogFile log = new LogFile(); /// log.Initialize(); // Initialize the log file. /// log.Open(); // Open the log file. /// log.WriteTimestampedLine("Test entry"); // Write message to the log file. /// log.Flush(); // Flush message to the log file. /// log.Close(); // Close the log file. /// /// Console.ReadLine(); /// } /// } /// </code> /// </example> [ToolboxBitmap(typeof(LogFile))] public class LogFile : Component, ISupportLifecycle, ISupportInitialize, IProvideStatus, IPersistSettings { #region [ Members ] // Constants /// <summary> /// Specifies the minimum size for a <see cref="LogFile"/>. /// </summary> public const int MinFileSize = 1; /// <summary> /// Specifies the maximum size for a <see cref="LogFile"/>. /// </summary> public const int MaxFileSize = 10; /// <summary> /// Specifies the default value for the <see cref="FileName"/> property. /// </summary> public const string DefaultFileName = "LogFile.txt"; /// <summary> /// Specifies the default value for the <see cref="FileSize"/> property. /// </summary> public const int DefaultFileSize = 3; /// <summary> /// Specifies the default value for the <see cref="FileFullOperation"/> property. /// </summary> public const LogFileFullOperation DefaultFileFullOperation = LogFileFullOperation.Truncate; /// <summary> /// Specifies the default value for the <see cref="PersistSettings"/> property. /// </summary> public const bool DefaultPersistSettings = false; /// <summary> /// Specifies the default value for the <see cref="LogFilesDuration"/> property. /// </summary> public const double DefaultLogFilesDuration = 0.0; /// <summary> /// Specifies the default value for the <see cref="SettingsCategory"/> property. /// </summary> public const string DefaultSettingsCategory = "LogFile"; // Events /// <summary> /// Occurs when the <see cref="LogFile"/> is full. /// </summary> [Description("Occurs when the LogFile is full.")] public event EventHandler FileFull; /// <summary> /// Occurs when an <see cref="Exception"/> is encountered while writing entries to the <see cref="LogFile"/>. /// </summary> /// <remarks> /// <see cref="EventArgs{T}.Argument"/> is the <see cref="Exception"/> encountered during writing of log entries. /// </remarks> [Description("Occurs when an Exception is encountered while writing entries to the LogFile.")] public event EventHandler<EventArgs<Exception>> LogException; // Fields private string m_fileName; private int m_fileSize; private LogFileFullOperation m_fileFullOperation; private bool m_persistSettings; private string m_settingsCategory; private FileStream m_fileStream; private readonly ManualResetEvent m_operationWaitHandle; private readonly ProcessList<string> m_logEntryQueue; private Encoding m_textEncoding; private bool m_disposed; private bool m_initialized; private double m_logFilesDuration; private readonly Dictionary<DateTime, string> m_savedFilesWithTime; #endregion #region [ Constructors ] /// <summary> /// Initializes a new instance of the <see cref="LogFile"/> class. /// </summary> public LogFile() { m_fileName = DefaultFileName; m_fileSize = DefaultFileSize; m_fileFullOperation = DefaultFileFullOperation; m_logFilesDuration = DefaultLogFilesDuration; m_persistSettings = DefaultPersistSettings; m_settingsCategory = DefaultSettingsCategory; m_textEncoding = Encoding.Default; m_operationWaitHandle = new ManualResetEvent(true); m_savedFilesWithTime = new Dictionary<DateTime, string>(); m_logEntryQueue = ProcessList<string>.CreateRealTimeQueue(WriteLogEntries); this.FileFull += LogFile_FileFull; m_logEntryQueue.ProcessException += ProcessExceptionHandler; } /// <summary> /// Initializes a new instance of the <see cref="LogFile"/> class. /// </summary> /// <param name="container"><see cref="IContainer"/> object that contains the <see cref="LogFile"/>.</param> public LogFile(IContainer container) : this() { if ((object)container != null) container.Add(this); } #endregion #region [ Properties ] /// <summary> /// Gets or sets the name of the <see cref="LogFile"/>, including the file extension. /// </summary> /// <exception cref="ArgumentNullException">The value being assigned is null or empty string.</exception> [Category("Settings"), DefaultValue(DefaultFileName), Description("Name of the LogFile, including the file extension.")] public string FileName { get { return m_fileName; } set { if (string.IsNullOrEmpty(value)) throw new ArgumentNullException("value"); m_fileName = value; ReOpen(); } } /// <summary> /// Gets or sets the size of the <see cref="LogFile"/> in MB. /// </summary> ///<exception cref="ArgumentOutOfRangeException">The value being assigned outside the <see cref="MinFileSize"/> and <see cref="MaxFileSize"/> range.</exception> [Category("Settings"), DefaultValue(DefaultFileSize), Description("Size of the LogFile in MB.")] public int FileSize { get { return m_fileSize; } set { if (value < MinFileSize || value > MaxFileSize) throw new ArgumentOutOfRangeException("value", string.Format("Value must be between {0} and {1}", MinFileSize, MaxFileSize)); m_fileSize = value; } } /// <summary> /// Gets or sets the type of operation to be performed when the <see cref="LogFile"/> is full. /// </summary> [Category("Behavior"), DefaultValue(DefaultFileFullOperation), Description("Type of operation to be performed when the LogFile is full.")] public LogFileFullOperation FileFullOperation { get { return m_fileFullOperation; } set { m_fileFullOperation = value; } } /// <summary> /// Gets or sets the time duration, in hours, to save the <see cref="LogFile"/> . /// </summary> [Category("Behavior"), DefaultValue(DefaultLogFilesDuration), Description("Time duration in hours to save the log files.")] public double LogFilesDuration { get { return m_logFilesDuration; } set { m_logFilesDuration = value; } } /// <summary> /// Gets or sets a boolean value that indicates whether the settings of <see cref="LogFile"/> object are /// to be saved to the config file. /// </summary> [Category("Persistance"), DefaultValue(DefaultPersistSettings), Description("Indicates whether the settings of LogFile object are to be saved to the config file.")] public bool PersistSettings { get { return m_persistSettings; } set { m_persistSettings = value; } } /// <summary> /// Gets or sets the category under which the settings of <see cref="LogFile"/> object are to be saved /// to the config file if the <see cref="PersistSettings"/> property is set to true. /// </summary> /// <exception cref="ArgumentNullException">The value being assigned is null or empty string.</exception> [Category("Persistance"), DefaultValue(DefaultSettingsCategory), Description("Category under which the settings of LogFile object are to be saved to the config file if the PersistSettings property is set to true.")] public string SettingsCategory { get { return m_settingsCategory; } set { if (string.IsNullOrEmpty(value)) throw new ArgumentNullException("value"); m_settingsCategory = value; } } /// <summary> /// Gets or sets the <see cref="Encoding"/> to be used to encode the messages being logged. /// </summary> [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public virtual Encoding TextEncoding { get { return m_textEncoding; } set { if ((object)value == null) m_textEncoding = Encoding.Default; else m_textEncoding = value; } } /// <summary> /// Gets or sets a boolean value that indicates whether the <see cref="LogFile"/> object is currently enabled. /// </summary> [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool Enabled { get { return IsOpen; } set { if (value && !Enabled) Open(); else if (!value && Enabled) Close(); } } /// <summary> /// Gets a boolean value that indicates whether the <see cref="LogFile"/> is open. /// </summary> [Browsable(false)] public bool IsOpen { get { return ((object)m_fileStream != null); } } /// <summary> /// Gets the unique identifier of the <see cref="LogFile"/> object. /// </summary> [Browsable(false)] public string Name { get { return m_settingsCategory; } } /// <summary> /// Gets the descriptive status of the <see cref="LogFile"/> object. /// </summary> [Browsable(false)] public string Status { get { StringBuilder status = new StringBuilder(); status.Append(" Configuration section: "); status.Append(m_settingsCategory); status.AppendLine(); status.Append(" Maximum export size: "); status.Append(m_fileSize.ToString()); status.Append(" MB"); status.AppendLine(); status.Append(" File full operation: "); status.Append(m_fileFullOperation); status.AppendLine(); if ((object)m_logEntryQueue != null) status.Append(m_logEntryQueue.Status); return status.ToString(); } } #endregion #region [ Methods ] /// <summary> /// Initializes the <see cref="LogFile"/> object. /// </summary> /// <remarks> /// <see cref="Initialize()"/> is to be called by user-code directly only if the <see cref="LogFile"/> /// object is not consumed through the designer surface of the IDE. /// </remarks> public void Initialize() { if (!m_initialized) { LoadSettings(); // Load settings from the config file. m_initialized = true; // Initialize only once. } } /// <summary> /// Performs necessary operations before the <see cref="LogFile"/> object properties are initialized. /// </summary> /// <remarks> /// <see cref="BeginInit()"/> should never be called by user-code directly. This method exists solely for use /// by the designer if the <see cref="LogFile"/> object is consumed through the designer surface of the IDE. /// </remarks> [EditorBrowsable(EditorBrowsableState.Never)] public void BeginInit() { if (!DesignMode) { try { // Nothing needs to be done before component is initialized. } catch (Exception) { // Prevent the IDE from crashing when component is in design mode. } } } /// <summary> /// Performs necessary operations after the <see cref="LogFile"/> object properties are initialized. /// </summary> /// <remarks> /// <see cref="EndInit()"/> should never be called by user-code directly. This method exists solely for use /// by the designer if the <see cref="LogFile"/> object is consumed through the designer surface of the IDE. /// </remarks> [EditorBrowsable(EditorBrowsableState.Never)] public void EndInit() { if (!DesignMode) { try { Initialize(); } catch (Exception) { // Prevent the IDE from crashing when component is in design mode. } } } /// <summary> /// Saves settings for the <see cref="LogFile"/> object to the config file if the <see cref="PersistSettings"/> /// property is set to true. /// </summary>