C# log4net日志消息仅发送给少数附加器

C# log4net日志消息仅发送给少数附加器,c#,log4net,log4net-configuration,C#,Log4net,Log4net Configuration,我正在使用log4netapi来登录我的WinForms应用程序。我有多个appender:RollingFileAppender和TextBoxAppender(自定义appender) 我只想在日志文件(RollingFileAppender)中记录一些错误消息,而不想在文本框(TextBoxAppender)中记录,并将一些其他消息同时记录到这两个文件中。我怎样才能做到呢?请注意,消息的级别相同,即所有错误消息 谢谢 编辑1: 具体来说,我希望在UI和日志文件中显示简单的单行错误消息,但S

我正在使用log4netapi来登录我的WinForms应用程序。我有多个appender:RollingFileAppender和TextBoxAppender(自定义appender)

我只想在日志文件(RollingFileAppender)中记录一些错误消息,而不想在文本框(TextBoxAppender)中记录,并将一些其他消息同时记录到这两个文件中。我怎样才能做到呢?请注意,消息的级别相同,即所有错误消息

谢谢

编辑1:


具体来说,我希望在UI和日志文件中显示简单的单行错误消息,但StackTraces仅在日志文件中显示。

将不同消息输出到不同的附件的解决方案应该是
转发附件
(关于logging.apache的文档目前似乎已关闭,但无论如何这里有一个链接:)

在这里,您可以根据日志级别(大多数示例)进行筛选,但也可以根据日志消息进行筛选(请查看此处:,段落“StringMatchFilter”)

至少,这有助于您将这一条消息带到一个特定的附加器。
要确保如何省略stacktrace,请参见Jeroen Mosterts answer

将不同的消息输出到不同的附件的解决方案应该是
转发附件
(关于logging.apache的文档目前似乎已关闭,但无论如何,这里有一个链接:)

在这里,您可以根据日志级别(大多数示例)进行筛选,但也可以根据日志消息进行筛选(请查看此处:,段落“StringMatchFilter”)

至少,这有助于您将这一条消息带到一个特定的附加器。
要确保如何省略堆栈跟踪,请参见Jeroen Mosterts answer,据我所知,您实际上希望消息同时发送到两个附加器,但只有一个附加器记录堆栈跟踪。首先,将包含异常的消息记录为异常,不要使用
异常.ToString()

然后,您的记录器可以使用多个appender,其中一些通过告诉log4net我们将处理异常(实际上不处理异常)来忽略堆栈跟踪:


以及其他详细信息:


...

据我所知,您实际上希望消息同时发送到两个附加器,但其中只有一个记录堆栈跟踪。首先,将包含异常的消息记录为异常,不要使用
exception.ToString()

然后,您的记录器可以使用多个appender,其中一些通过告诉log4net我们将处理异常(实际上不处理异常)来忽略堆栈跟踪:


以及其他详细信息:


...

尽管您可以使用一个记录器(通过适当的过滤器应用)来完成这项工作,但这与log4net的特点背道而驰。您通常希望为每个配置使用单独的记录器,并在适当的情况下向这些记录器添加附加器(
FileLogger
UILogger
universaloger
,诸如此类)。请注意,记录器可以共享appender。即使我使用单独的记录器,我如何过滤相同级别的消息,例如一些日志级别错误的消息将显示在UILogger中,而一些日志级别错误的消息将不显示。基本上,您的建议是,我可能需要在每个地方同时调用lo根据需要进行GGER,如logger1.Error()和logger2.Error()等在我只想将日志消息发送到一个目的地的情况下,使用多个记录器实例可能很好,但大多数情况下都需要将消息发送到两个记录器。如果您都需要,您可以使用
universaloger
,您可以将其设置为具有两个附加器。但是,是的,这种方法要求您知道的每一条消息都有这样的附加器哪个附加器(个)你想拥有并使用合适的记录器。一条消息只需要发送到一个记录器,记录器可以有任意多个附加器。如果你不能提前选择记录器,你必须使用过滤器,但这更复杂。好的。是的,明白。如果我没有其他解决方案,这可能很好。但是有什么方法可以实现这一点吗使用一个记录器?虽然您可以使用一个记录器(通过适当的过滤器应用)来实现这一点,但这与log4net的特点背道而驰。您通常希望为每个配置使用单独的记录器,并在适当时向这些记录器添加附加器(
FileLogger
UILogger
universaloger
,诸如此类)。请注意,记录器可以共享appender。即使我使用单独的记录器,我如何过滤相同级别的消息,例如一些日志级别错误的消息将显示在UILogger中,而一些日志级别错误的消息将不显示。基本上,您的建议是,我可能需要在每个地方同时调用lo根据需要进行GGER,如logger1.Error()和logger2.Error()等在我只想将日志消息发送到一个目的地的情况下,使用多个记录器实例可能很好,但大多数情况下都需要将消息发送到两个记录器。如果您都需要,您可以使用
universaloger
,您可以将其设置为具有两个附加器。但是,是的,这种方法要求您知道的每一条消息都有这样的附加器哪个附加器(个)你想拥有并使用合适的记录器。一条消息只需要发送到一个记录器,记录器可以有任意多个附加器。如果你不能提前选择记录器,你必须使用过滤器,但这更复杂。好的。是的,明白。如果我没有其他解决方案,这可能很好。但是有什么方法可以实现这一点吗对于TextBoxAppender,我将ignoresException设置为true,并将代码更改为:logger.Error(“Stack Trace:,ex);。文本框仍然显示堆栈跟踪。我错过了什么?我的转换模式是:哇,我很困惑。
ignoresException
应该是
false
logger.Error($"Something went wrong frobbing the widget: {ex.Message}", ex);