| #region Apache License |
| // |
| // Licensed to the Apache Software Foundation (ASF) under one or more |
| // contributor license agreements. See the NOTICE file distributed with |
| // this work for additional information regarding copyright ownership. |
| // The ASF licenses this file to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| #endregion |
| |
| using System; |
| using System.Collections; |
| |
| namespace log4net.Core |
| { |
| /// <summary> |
| /// Defines the default set of levels recognized by the system. |
| /// </summary> |
| /// <remarks> |
| /// <para> |
| /// Each <see cref="LoggingEvent"/> has an associated <see cref="Level"/>. |
| /// </para> |
| /// <para> |
| /// Levels have a numeric <see cref="Level.Value"/> that defines the relative |
| /// ordering between levels. Two Levels with the same <see cref="Level.Value"/> |
| /// are deemed to be equivalent. |
| /// </para> |
| /// <para> |
| /// The levels that are recognized by log4net are set for each <see cref="log4net.Repository.ILoggerRepository"/> |
| /// and each repository can have different levels defined. The levels are stored |
| /// in the <see cref="log4net.Repository.ILoggerRepository.LevelMap"/> on the repository. Levels are |
| /// looked up by name from the <see cref="log4net.Repository.ILoggerRepository.LevelMap"/>. |
| /// </para> |
| /// <para> |
| /// When logging at level INFO the actual level used is not <see cref="Level.Info"/> but |
| /// the value of <c>LoggerRepository.LevelMap["INFO"]</c>. The default value for this is |
| /// <see cref="Level.Info"/>, but this can be changed by reconfiguring the level map. |
| /// </para> |
| /// <para> |
| /// Each level has a <see cref="DisplayName"/> in addition to its <see cref="Name"/>. The |
| /// <see cref="DisplayName"/> is the string that is written into the output log. By default |
| /// the display name is the same as the level name, but this can be used to alias levels |
| /// or to localize the log output. |
| /// </para> |
| /// <para> |
| /// Some of the predefined levels recognized by the system are: |
| /// </para> |
| /// <list type="bullet"> |
| /// <item> |
| /// <description><see cref="Off"/>.</description> |
| /// </item> |
| /// <item> |
| /// <description><see cref="Fatal"/>.</description> |
| /// </item> |
| /// <item> |
| /// <description><see cref="Error"/>.</description> |
| /// </item> |
| /// <item> |
| /// <description><see cref="Warn"/>.</description> |
| /// </item> |
| /// <item> |
| /// <description><see cref="Info"/>.</description> |
| /// </item> |
| /// <item> |
| /// <description><see cref="Debug"/>.</description> |
| /// </item> |
| /// <item> |
| /// <description><see cref="All"/>.</description> |
| /// </item> |
| /// </list> |
| /// </remarks> |
| /// <author>Nicko Cadell</author> |
| /// <author>Gert Driesen</author> |
| #if !NETCF |
| [Serializable] |
| #endif |
| sealed public class Level : IComparable |
| { |
| #region Public Instance Constructors |
| |
| /// <summary> |
| /// Constructor |
| /// </summary> |
| /// <param name="level">Integer value for this level, higher values represent more severe levels.</param> |
| /// <param name="levelName">The string name of this level.</param> |
| /// <param name="displayName">The display name for this level. This may be localized or otherwise different from the name</param> |
| /// <remarks> |
| /// <para> |
| /// Initializes a new instance of the <see cref="Level" /> class with |
| /// the specified level name and value. |
| /// </para> |
| /// </remarks> |
| public Level(int level, string levelName, string displayName) |
| { |
| if (levelName == null) |
| { |
| throw new ArgumentNullException("levelName"); |
| } |
| if (displayName == null) |
| { |
| throw new ArgumentNullException("displayName"); |
| } |
| |
| m_levelValue = level; |
| #if NETSTANDARD1_3 |
| m_levelName = levelName; |
| #else |
| m_levelName = string.Intern(levelName); |
| #endif |
| m_levelDisplayName = displayName; |
| } |
| |
| /// <summary> |
| /// Constructor |
| /// </summary> |
| /// <param name="level">Integer value for this level, higher values represent more severe levels.</param> |
| /// <param name="levelName">The string name of this level.</param> |
| /// <remarks> |
| /// <para> |
| /// Initializes a new instance of the <see cref="Level" /> class with |
| /// the specified level name and value. |
| /// </para> |
| /// </remarks> |
| public Level(int level, string levelName) : this(level, levelName, levelName) |
| { |
| } |
| |
| #endregion Public Instance Constructors |
| |
| #region Public Instance Properties |
| |
| /// <summary> |
| /// Gets the name of this level. |
| /// </summary> |
| /// <value> |
| /// The name of this level. |
| /// </value> |
| /// <remarks> |
| /// <para> |
| /// Gets the name of this level. |
| /// </para> |
| /// </remarks> |
| public string Name |
| { |
| get { return m_levelName; } |
| } |
| |
| /// <summary> |
| /// Gets the value of this level. |
| /// </summary> |
| /// <value> |
| /// The value of this level. |
| /// </value> |
| /// <remarks> |
| /// <para> |
| /// Gets the value of this level. |
| /// </para> |
| /// </remarks> |
| public int Value |
| { |
| get { return m_levelValue; } |
| } |
| |
| /// <summary> |
| /// Gets the display name of this level. |
| /// </summary> |
| /// <value> |
| /// The display name of this level. |
| /// </value> |
| /// <remarks> |
| /// <para> |
| /// Gets the display name of this level. |
| /// </para> |
| /// </remarks> |
| public string DisplayName |
| { |
| get { return m_levelDisplayName; } |
| } |
| |
| #endregion Public Instance Properties |
| |
| #region Override implementation of Object |
| |
| /// <summary> |
| /// Returns the <see cref="string" /> representation of the current |
| /// <see cref="Level" />. |
| /// </summary> |
| /// <returns> |
| /// A <see cref="string" /> representation of the current <see cref="Level" />. |
| /// </returns> |
| /// <remarks> |
| /// <para> |
| /// Returns the level <see cref="Name"/>. |
| /// </para> |
| /// </remarks> |
| override public string ToString() |
| { |
| return m_levelName; |
| } |
| |
| /// <summary> |
| /// Compares levels. |
| /// </summary> |
| /// <param name="o">The object to compare against.</param> |
| /// <returns><c>true</c> if the objects are equal.</returns> |
| /// <remarks> |
| /// <para> |
| /// Compares the levels of <see cref="Level" /> instances, and |
| /// defers to base class if the target object is not a <see cref="Level" /> |
| /// instance. |
| /// </para> |
| /// </remarks> |
| override public bool Equals(object o) |
| { |
| Level otherLevel = o as Level; |
| if (otherLevel != null) |
| { |
| return m_levelValue == otherLevel.m_levelValue; |
| } |
| else |
| { |
| return base.Equals(o); |
| } |
| } |
| |
| /// <summary> |
| /// Returns a hash code |
| /// </summary> |
| /// <returns>A hash code for the current <see cref="Level" />.</returns> |
| /// <remarks> |
| /// <para> |
| /// Returns a hash code suitable for use in hashing algorithms and data |
| /// structures like a hash table. |
| /// </para> |
| /// <para> |
| /// Returns the hash code of the level <see cref="Value"/>. |
| /// </para> |
| /// </remarks> |
| override public int GetHashCode() |
| { |
| return m_levelValue; |
| } |
| |
| #endregion Override implementation of Object |
| |
| #region Implementation of IComparable |
| |
| /// <summary> |
| /// Compares this instance to a specified object and returns an |
| /// indication of their relative values. |
| /// </summary> |
| /// <param name="r">A <see cref="Level"/> instance or <see langword="null" /> to compare with this instance.</param> |
| /// <returns> |
| /// A 32-bit signed integer that indicates the relative order of the |
| /// values compared. The return value has these meanings: |
| /// <list type="table"> |
| /// <listheader> |
| /// <term>Value</term> |
| /// <description>Meaning</description> |
| /// </listheader> |
| /// <item> |
| /// <term>Less than zero</term> |
| /// <description>This instance is less than <paramref name="r" />.</description> |
| /// </item> |
| /// <item> |
| /// <term>Zero</term> |
| /// <description>This instance is equal to <paramref name="r" />.</description> |
| /// </item> |
| /// <item> |
| /// <term>Greater than zero</term> |
| /// <description> |
| /// <para>This instance is greater than <paramref name="r" />.</para> |
| /// <para>-or-</para> |
| /// <para><paramref name="r" /> is <see langword="null" />.</para> |
| /// </description> |
| /// </item> |
| /// </list> |
| /// </returns> |
| /// <remarks> |
| /// <para> |
| /// <paramref name="r" /> must be an instance of <see cref="Level" /> |
| /// or <see langword="null" />; otherwise, an exception is thrown. |
| /// </para> |
| /// </remarks> |
| /// <exception cref="ArgumentException"><paramref name="r" /> is not a <see cref="Level" />.</exception> |
| public int CompareTo(object r) |
| { |
| Level target = r as Level; |
| if (target != null) |
| { |
| return Compare(this, target); |
| } |
| throw new ArgumentException("Parameter: r, Value: [" + r + "] is not an instance of Level"); |
| } |
| |
| #endregion Implementation of IComparable |
| |
| #region Operators |
| |
| /// <summary> |
| /// Returns a value indicating whether a specified <see cref="Level" /> |
| /// is greater than another specified <see cref="Level" />. |
| /// </summary> |
| /// <param name="l">A <see cref="Level" /></param> |
| /// <param name="r">A <see cref="Level" /></param> |
| /// <returns> |
| /// <c>true</c> if <paramref name="l" /> is greater than |
| /// <paramref name="r" />; otherwise, <c>false</c>. |
| /// </returns> |
| /// <remarks> |
| /// <para> |
| /// Compares two levels. |
| /// </para> |
| /// </remarks> |
| public static bool operator > (Level l, Level r) |
| { |
| return l.m_levelValue > r.m_levelValue; |
| } |
| |
| /// <summary> |
| /// Returns a value indicating whether a specified <see cref="Level" /> |
| /// is less than another specified <see cref="Level" />. |
| /// </summary> |
| /// <param name="l">A <see cref="Level" /></param> |
| /// <param name="r">A <see cref="Level" /></param> |
| /// <returns> |
| /// <c>true</c> if <paramref name="l" /> is less than |
| /// <paramref name="r" />; otherwise, <c>false</c>. |
| /// </returns> |
| /// <remarks> |
| /// <para> |
| /// Compares two levels. |
| /// </para> |
| /// </remarks> |
| public static bool operator < (Level l, Level r) |
| { |
| return l.m_levelValue < r.m_levelValue; |
| } |
| |
| /// <summary> |
| /// Returns a value indicating whether a specified <see cref="Level" /> |
| /// is greater than or equal to another specified <see cref="Level" />. |
| /// </summary> |
| /// <param name="l">A <see cref="Level" /></param> |
| /// <param name="r">A <see cref="Level" /></param> |
| /// <returns> |
| /// <c>true</c> if <paramref name="l" /> is greater than or equal to |
| /// <paramref name="r" />; otherwise, <c>false</c>. |
| /// </returns> |
| /// <remarks> |
| /// <para> |
| /// Compares two levels. |
| /// </para> |
| /// </remarks> |
| public static bool operator >= (Level l, Level r) |
| { |
| return l.m_levelValue >= r.m_levelValue; |
| } |
| |
| /// <summary> |
| /// Returns a value indicating whether a specified <see cref="Level" /> |
| /// is less than or equal to another specified <see cref="Level" />. |
| /// </summary> |
| /// <param name="l">A <see cref="Level" /></param> |
| /// <param name="r">A <see cref="Level" /></param> |
| /// <returns> |
| /// <c>true</c> if <paramref name="l" /> is less than or equal to |
| /// <paramref name="r" />; otherwise, <c>false</c>. |
| /// </returns> |
| /// <remarks> |
| /// <para> |
| /// Compares two levels. |
| /// </para> |
| /// </remarks> |
| public static bool operator <= (Level l, Level r) |
| { |
| return l.m_levelValue <= r.m_levelValue; |
| } |
| |
| /// <summary> |
| /// Returns a value indicating whether two specified <see cref="Level" /> |
| /// objects have the same value. |
| /// </summary> |
| /// <param name="l">A <see cref="Level" /> or <see langword="null" />.</param> |
| /// <param name="r">A <see cref="Level" /> or <see langword="null" />.</param> |
| /// <returns> |
| /// <c>true</c> if the value of <paramref name="l" /> is the same as the |
| /// value of <paramref name="r" />; otherwise, <c>false</c>. |
| /// </returns> |
| /// <remarks> |
| /// <para> |
| /// Compares two levels. |
| /// </para> |
| /// </remarks> |
| public static bool operator == (Level l, Level r) |
| { |
| if (((object)l) != null && ((object)r) != null) |
| { |
| return l.m_levelValue == r.m_levelValue; |
| } |
| else |
| { |
| return ((object) l) == ((object) r); |
| } |
| } |
| |
| /// <summary> |
| /// Returns a value indicating whether two specified <see cref="Level" /> |
| /// objects have different values. |
| /// </summary> |
| /// <param name="l">A <see cref="Level" /> or <see langword="null" />.</param> |
| /// <param name="r">A <see cref="Level" /> or <see langword="null" />.</param> |
| /// <returns> |
| /// <c>true</c> if the value of <paramref name="l" /> is different from |
| /// the value of <paramref name="r" />; otherwise, <c>false</c>. |
| /// </returns> |
| /// <remarks> |
| /// <para> |
| /// Compares two levels. |
| /// </para> |
| /// </remarks> |
| public static bool operator != (Level l, Level r) |
| { |
| return !(l==r); |
| } |
| |
| #endregion Operators |
| |
| #region Public Static Methods |
| |
| /// <summary> |
| /// Compares two specified <see cref="Level"/> instances. |
| /// </summary> |
| /// <param name="l">The first <see cref="Level"/> to compare.</param> |
| /// <param name="r">The second <see cref="Level"/> to compare.</param> |
| /// <returns> |
| /// A 32-bit signed integer that indicates the relative order of the |
| /// two values compared. The return value has these meanings: |
| /// <list type="table"> |
| /// <listheader> |
| /// <term>Value</term> |
| /// <description>Meaning</description> |
| /// </listheader> |
| /// <item> |
| /// <term>Less than zero</term> |
| /// <description><paramref name="l" /> is less than <paramref name="r" />.</description> |
| /// </item> |
| /// <item> |
| /// <term>Zero</term> |
| /// <description><paramref name="l" /> is equal to <paramref name="r" />.</description> |
| /// </item> |
| /// <item> |
| /// <term>Greater than zero</term> |
| /// <description><paramref name="l" /> is greater than <paramref name="r" />.</description> |
| /// </item> |
| /// </list> |
| /// </returns> |
| /// <remarks> |
| /// <para> |
| /// Compares two levels. |
| /// </para> |
| /// </remarks> |
| public static int Compare(Level l, Level r) |
| { |
| // Reference equals |
| if ((object)l == (object)r) |
| { |
| return 0; |
| } |
| |
| if (l == null && r == null) |
| { |
| return 0; |
| } |
| if (l == null) |
| { |
| return -1; |
| } |
| if (r == null) |
| { |
| return 1; |
| } |
| |
| return l.m_levelValue.CompareTo(r.m_levelValue); |
| } |
| |
| #endregion Public Static Methods |
| |
| #region Public Static Fields |
| |
| /// <summary> |
| /// The <see cref="Off" /> level designates a higher level than all the rest. |
| /// </summary> |
| public readonly static Level Off = new Level(int.MaxValue, "OFF"); |
| |
| /// <summary> |
| /// The <see cref="Log4Net_Debug" /> is only used to debug internals of log4net. |
| /// </summary> |
| public readonly static Level Log4Net_Debug = new Level(120000, "log4net:DEBUG"); |
| |
| /// <summary> |
| /// The <see cref="Emergency" /> level designates very severe error events. |
| /// System unusable, emergencies. |
| /// </summary> |
| public readonly static Level Emergency = new Level(120000, "EMERGENCY"); |
| |
| /// <summary> |
| /// The <see cref="Fatal" /> level designates very severe error events |
| /// that will presumably lead the application to abort. |
| /// </summary> |
| public readonly static Level Fatal = new Level(110000, "FATAL"); |
| |
| /// <summary> |
| /// The <see cref="Alert" /> level designates very severe error events. |
| /// Take immediate action, alerts. |
| /// </summary> |
| public readonly static Level Alert = new Level(100000, "ALERT"); |
| |
| /// <summary> |
| /// The <see cref="Critical" /> level designates very severe error events. |
| /// Critical condition, critical. |
| /// </summary> |
| public readonly static Level Critical = new Level(90000, "CRITICAL"); |
| |
| /// <summary> |
| /// The <see cref="Severe" /> level designates very severe error events. |
| /// </summary> |
| public readonly static Level Severe = new Level(80000, "SEVERE"); |
| |
| /// <summary> |
| /// The <see cref="Error" /> level designates error events that might |
| /// still allow the application to continue running. |
| /// </summary> |
| public readonly static Level Error = new Level(70000, "ERROR"); |
| |
| /// <summary> |
| /// The <see cref="Warn" /> level designates potentially harmful |
| /// situations. |
| /// </summary> |
| public readonly static Level Warn = new Level(60000, "WARN"); |
| |
| /// <summary> |
| /// The <see cref="Notice" /> level designates informational messages |
| /// that highlight the progress of the application at the highest level. |
| /// </summary> |
| public readonly static Level Notice = new Level(50000, "NOTICE"); |
| |
| /// <summary> |
| /// The <see cref="Info" /> level designates informational messages that |
| /// highlight the progress of the application at coarse-grained level. |
| /// </summary> |
| public readonly static Level Info = new Level(40000, "INFO"); |
| |
| /// <summary> |
| /// The <see cref="Debug" /> level designates fine-grained informational |
| /// events that are most useful to debug an application. |
| /// </summary> |
| public readonly static Level Debug = new Level(30000, "DEBUG"); |
| |
| /// <summary> |
| /// The <see cref="Fine" /> level designates fine-grained informational |
| /// events that are most useful to debug an application. |
| /// </summary> |
| public readonly static Level Fine = new Level(30000, "FINE"); |
| |
| /// <summary> |
| /// The <see cref="Trace" /> level designates fine-grained informational |
| /// events that are most useful to debug an application. |
| /// </summary> |
| public readonly static Level Trace = new Level(20000, "TRACE"); |
| |
| /// <summary> |
| /// The <see cref="Finer" /> level designates fine-grained informational |
| /// events that are most useful to debug an application. |
| /// </summary> |
| public readonly static Level Finer = new Level(20000, "FINER"); |
| |
| /// <summary> |
| /// The <see cref="Verbose" /> level designates fine-grained informational |
| /// events that are most useful to debug an application. |
| /// </summary> |
| public readonly static Level Verbose = new Level(10000, "VERBOSE"); |
| |
| /// <summary> |
| /// The <see cref="Finest" /> level designates fine-grained informational |
| /// events that are most useful to debug an application. |
| /// </summary> |
| public readonly static Level Finest = new Level(10000, "FINEST"); |
| |
| /// <summary> |
| /// The <see cref="All" /> level designates the lowest level possible. |
| /// </summary> |
| public readonly static Level All = new Level(int.MinValue, "ALL"); |
| |
| #endregion Public Static Fields |
| |
| #region Private Instance Fields |
| |
| private readonly int m_levelValue; |
| private readonly string m_levelName; |
| private readonly string m_levelDisplayName; |
| |
| #endregion Private Instance Fields |
| } |
| } |