From 296347aa8f60535ad6b9b20d9f5139a25623b0ee Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 10 Jul 2012 17:10:43 -0700 Subject: [PATCH] Adding log4net binaries --HG-- branch : NH3 --- lib/log4net/LICENSE | 201 + lib/log4net/log4net.dll | Bin 0 -> 288768 bytes lib/log4net/log4net.xml | 30205 +++++++++++++++++++++++++ src/Orchard/Orchard.Framework.csproj | 3 +- 4 files changed, 30407 insertions(+), 2 deletions(-) create mode 100644 lib/log4net/LICENSE create mode 100644 lib/log4net/log4net.dll create mode 100644 lib/log4net/log4net.xml diff --git a/lib/log4net/LICENSE b/lib/log4net/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/lib/log4net/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/lib/log4net/log4net.dll b/lib/log4net/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..1e66c82abda444cd72c064c62a38ed216254b3d5 GIT binary patch literal 288768 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%0Ab7xahvn`?~19&@)|h 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

IYgrYfF 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 Cp?ie@ literal 0 HcmV?d00001 diff --git a/lib/log4net/log4net.xml b/lib/log4net/log4net.xml new file mode 100644 index 000000000..de8317a32 --- /dev/null +++ b/lib/log4net/log4net.xml @@ -0,0 +1,30205 @@ + + + + log4net + + + +

+ Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see
http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Prepares the database command and initialize the parameters. + + + + + Connects to the database. + + + + + Cleanup the existing command. + + + If true, a message will be written using LogLog.Warn if an exception is encountered when calling Dispose. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + Flag to indicate if we are using a command object + + + + Set to true when the appender is to use a prepared + statement or stored procedure to insert into the database. + + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + The database command. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to use transactions when writing to the database. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Ansi code to reset terminal + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + Defaults to %logger + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + the current list of events that have been appended. + + + Use the method to clear the + current list of events. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Syslog port 514 + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + The 1st of January 1970 in UTC + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + Send the email message + + the body text to include in the mail + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + 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. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + The logger that this object is wrapping + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + The time the event was logged + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored in the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + 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. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + 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 + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + 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 + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + + + + + + Initializes a new instance of the class. + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + + + + + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + + + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Total number of bytes written. + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Prints the message and the stack trace of the exception on the standard + error output stream. + + + + + + Log an error + + The error message. + + + Print a the error message passed as parameter on the standard + error output stream. + + + + + + The date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occured. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + The thread local data slot to use to store a PropertiesDictionary. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + Default constructor + + + + Default constructor + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global context properties instance + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + Provides information about the environment the assembly has + been built for. + + + + Version of the assembly + + + Version of the framework targeted + + + Type of framework targeted + + + Does it target a client profile? + + + + Identifies the version and target for this assembly. + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 69d6e87c9..696daf594 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -86,8 +86,7 @@ False - ..\..\lib\fluentnhibernate\log4net.dll - True + ..\..\lib\log4net\log4net.dll