📄 loggingevent.cs
字号:
/// <para>
/// Use the <see cref="GetLoggingEventData(FixFlags)"/> method to obtain an
/// instance of the <see cref="LoggingEventData"/> class.
/// </para>
/// <para>
/// This constructor sets this objects <see cref="Fix"/> flags to <see cref="FixFlags.All"/>,
/// this assumes that all the data relating to this event is passed in via the <paramref name="data"/>
/// parameter and no other data should be captured from the environment.
/// </para>
/// </remarks>
public LoggingEvent(Type callerStackBoundaryDeclaringType, log4net.Repository.ILoggerRepository repository, LoggingEventData data) : this(callerStackBoundaryDeclaringType, repository, data, FixFlags.All)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="LoggingEvent" /> class
/// using specific data.
/// </summary>
/// <param name="data">Data used to initialize the logging event.</param>
/// <remarks>
/// <para>
/// This constructor is provided to allow a <see cref="LoggingEvent" />
/// to be created independently of the log4net framework. This can
/// be useful if you require a custom serialization scheme.
/// </para>
/// <para>
/// Use the <see cref="GetLoggingEventData(FixFlags)"/> method to obtain an
/// instance of the <see cref="LoggingEventData"/> class.
/// </para>
/// <para>
/// This constructor sets this objects <see cref="Fix"/> flags to <see cref="FixFlags.All"/>,
/// this assumes that all the data relating to this event is passed in via the <paramref name="data"/>
/// parameter and no other data should be captured from the environment.
/// </para>
/// </remarks>
public LoggingEvent(LoggingEventData data) : this(null, null, data)
{
}
#endregion Public Instance Constructors
#region Protected Instance Constructors
#if !NETCF
/// <summary>
/// Serialization constructor
/// </summary>
/// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data.</param>
/// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
/// <remarks>
/// <para>
/// Initializes a new instance of the <see cref="LoggingEvent" /> class
/// with serialized data.
/// </para>
/// </remarks>
protected LoggingEvent(SerializationInfo info, StreamingContext context)
{
m_data.LoggerName = info.GetString("LoggerName");
// Note we are deserializing the whole level object. That is the
// name and the value. This value is correct for the source
// hierarchy but may not be for the target hierarchy that this
// event may be re-logged into. If it is to be re-logged it may
// be necessary to re-lookup the level based only on the name.
m_data.Level = (Level)info.GetValue("Level", typeof(Level));
m_data.Message = info.GetString("Message");
m_data.ThreadName = info.GetString("ThreadName");
m_data.TimeStamp = info.GetDateTime("TimeStamp");
m_data.LocationInfo = (LocationInfo) info.GetValue("LocationInfo", typeof(LocationInfo));
m_data.UserName = info.GetString("UserName");
m_data.ExceptionString = info.GetString("ExceptionString");
m_data.Properties = (PropertiesDictionary) info.GetValue("Properties", typeof(PropertiesDictionary));
m_data.Domain = info.GetString("Domain");
m_data.Identity = info.GetString("Identity");
// We have restored all the values of this instance, i.e. all the values are fixed
// Set the fix flags otherwise the data values may be overwritten from the current environment.
m_fixFlags = FixFlags.All;
}
#endif
#endregion Protected Instance Constructors
#region Public Instance Properties
/// <summary>
/// Gets the time when the current process started.
/// </summary>
/// <value>
/// This is the time when this process started.
/// </value>
/// <remarks>
/// <para>
/// The TimeStamp is stored in the local time zone for this computer.
/// </para>
/// <para>
/// Tries to get the start time for the current process.
/// Failing that it returns the time of the first call to
/// this property.
/// </para>
/// <para>
/// Note that AppDomains may be loaded and unloaded within the
/// same process without the process terminating and therefore
/// without the process start time being reset.
/// </para>
/// </remarks>
public static DateTime StartTime
{
get { return SystemInfo.ProcessStartTime; }
}
/// <summary>
/// Gets the <see cref="Level" /> of the logging event.
/// </summary>
/// <value>
/// The <see cref="Level" /> of the logging event.
/// </value>
/// <remarks>
/// <para>
/// Gets the <see cref="Level" /> of the logging event.
/// </para>
/// </remarks>
public Level Level
{
get { return m_data.Level; }
}
/// <summary>
/// Gets the time of the logging event.
/// </summary>
/// <value>
/// The time of the logging event.
/// </value>
/// <remarks>
/// <para>
/// The TimeStamp is stored in the local time zone for this computer.
/// </para>
/// </remarks>
public DateTime TimeStamp
{
get { return m_data.TimeStamp; }
}
/// <summary>
/// Gets the name of the logger that logged the event.
/// </summary>
/// <value>
/// The name of the logger that logged the event.
/// </value>
/// <remarks>
/// <para>
/// Gets the name of the logger that logged the event.
/// </para>
/// </remarks>
public string LoggerName
{
get { return m_data.LoggerName; }
}
/// <summary>
/// Gets the location information for this logging event.
/// </summary>
/// <value>
/// The location information for this logging event.
/// </value>
/// <remarks>
/// <para>
/// The collected information is cached for future use.
/// </para>
/// <para>
/// See the <see cref="LocationInfo"/> class for more information on
/// supported frameworks and the different behavior in Debug and
/// Release builds.
/// </para>
/// </remarks>
public LocationInfo LocationInformation
{
get
{
if (m_data.LocationInfo == null && this.m_cacheUpdatable)
{
m_data.LocationInfo = new LocationInfo(m_callerStackBoundaryDeclaringType);
}
return m_data.LocationInfo;
}
}
/// <summary>
/// Gets the message object used to initialize this event.
/// </summary>
/// <value>
/// The message object used to initialize this event.
/// </value>
/// <remarks>
/// <para>
/// Gets the message object used to initialize this event.
/// Note that this event may not have a valid message object.
/// If the event is serialized the message object will not
/// be transferred. To get the text of the message the
/// <see cref="RenderedMessage"/> property must be used
/// not this property.
/// </para>
/// <para>
/// If there is no defined message object for this event then
/// null will be returned.
/// </para>
/// </remarks>
public object MessageObject
{
get { return m_message; }
}
/// <summary>
/// Gets the exception object used to initialize this event.
/// </summary>
/// <value>
/// The exception object used to initialize this event.
/// </value>
/// <remarks>
/// <para>
/// Gets the exception object used to initialize this event.
/// Note that this event may not have a valid exception object.
/// If the event is serialized the exception object will not
/// be transferred. To get the text of the exception the
/// <see cref="GetExceptionString"/> method must be used
/// not this property.
/// </para>
/// <para>
/// If there is no defined exception object for this event then
/// null will be returned.
/// </para>
/// </remarks>
public Exception ExceptionObject
{
get { return m_thrownException; }
}
/// <summary>
/// The <see cref="ILoggerRepository"/> that this event was created in.
/// </summary>
/// <remarks>
/// <para>
/// The <see cref="ILoggerRepository"/> that this event was created in.
/// </para>
/// </remarks>
public ILoggerRepository Repository
{
get { return m_repository; }
}
/// <summary>
/// Ensure that the repository is set.
/// </summary>
/// <param name="repository">the value for the repository</param>
internal void EnsureRepository(ILoggerRepository repository)
{
if (repository != null)
{
m_repository = repository;
}
}
/// <summary>
/// Gets the message, rendered through the <see cref="ILoggerRepository.RendererMap" />.
/// </summary>
/// <value>
/// The message rendered through the <see cref="ILoggerRepository.RendererMap" />.
/// </value>
/// <remarks>
/// <para>
/// The collected information is cached for future use.
/// </para>
/// </remarks>
public string RenderedMessage
{
get
{
if (m_data.Message == null && this.m_cacheUpdatable)
{
if (m_message == null)
{
m_data.Message = "";
}
else if (m_message is string)
{
m_data.Message = (m_message as string);
}
else if (m_repository != null)
{
m_data.Message = m_repository.RendererMap.FindAndRender(m_message);
}
else
{
// Very last resort
m_data.Message = m_message.ToString();
}
}
return m_data.Message;
}
}
/// <summary>
/// Write the rendered message to a TextWriter
/// </summary>
/// <param name="writer">the writer to write the message to</param>
/// <remarks>
/// <para>
/// Unlike the <see cref="RenderedMessage"/> property this method
/// does store the message data in the internal cache. Therefore
/// if called only once this method should be faster than the
/// <see cref="RenderedMessage"/> property, however if the message is
/// to be accessed multiple times then the property will be more efficient.
/// </para>
/// </remarks>
public void WriteRenderedMessage(TextWriter writer)
{
if (m_data.Message != null)
{
writer.Write(m_data.Message);
}
else
{
if (m_message != null)
{
if (m_message is string)
{
writer.Write(m_message as string);
}
else if (m_repository != null)
{
m_repository.RendererMap.FindAndRender(m_message, writer);
}
else
{
// Very last resort
writer.Write(m_message.ToString());
}
}
}
}
/// <summary>
/// Gets the name of the current thread.
/// </summary>
/// <value>
/// The name of the current thread, or the thread ID when
/// the name is not available.
/// </value>
/// <remarks>
/// <para>
/// The collected information is cached for future use.
/// </para>
/// </remarks>
public string ThreadName
{
get
{
if (m_data.ThreadName == null && this.m_cacheUpdatable)
{
#if NETCF
// Get thread ID only
m_data.ThreadName = SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
#else
m_data.ThreadName = System.Threading.Thread.CurrentThread.Name;
if (m_data.ThreadName == null || m_data.ThreadName.Length == 0)
{
// The thread name is not available. Therefore we
// go the the AppDomain to get the ID of the
// current thread. (Why don't Threads know their own ID?)
try
{
m_data.ThreadName = SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
}
catch(System.Security.SecurityException)
{
// This security exception will occur if the caller does not have
// some undefined set of SecurityPermission flags.
LogLog.Debug("LoggingEvent: Security exception while trying to get current thread ID. Error Ignored. Empty thread name.");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -