Log4net,如何记录详细的消息?

Log4net,如何记录详细的消息?,log4net,Log4net,我可以毫无问题地记录信息消息,但不知道如何记录详细的消息。 欢迎任何帮助 我的问题是: loggingEvent.Level可以在Format函数中进行检查。可能的值包括Info、Debug、Error和Verbose。还有更多,但这些是我将主要使用的 实际日志对象仅具有以下方法: 日志信息 Log.Debug 日志警告 日志错误 正如你所看到的-没有冗长 因此,如何记录详细的消息,这与调试不同 提前感谢Apache log4net具有以下日志级别: 调试

我可以毫无问题地记录信息消息,但不知道如何记录详细的消息。 欢迎任何帮助

我的问题是:

loggingEvent.Level可以在Format函数中进行检查。可能的值包括Info、Debug、Error和Verbose。还有更多,但这些是我将主要使用的

实际日志对象仅具有以下方法:

日志信息
Log.Debug
日志警告
日志错误

正如你所看到的-没有冗长

因此,如何记录详细的消息,这与调试不同


提前感谢

Apache log4net具有以下日志级别:

调试<信息<警告<错误<致命

对于被认为比信息性消息更详细的消息(
INFO
),可以选择
DEBUG
级别。编写调试消息应尽可能简单:

myLog.Debug("This is a pretty verbose message");

如果编写了很多调试消息和/或消息产生的代价很高(例如涉及重字符串连接),请考虑在日志中添加一个条件:

if (myLog.IsDebugEnabled)
{
    myLog.Debug("This is a pretty verbose message");
}
如果您发现自己经常这样做,并希望使代码枯竭,请考虑使用,这将将上述语句转化为:

Log.Debug( () => "This is a pretty verbose message" );  

您无法理解,因为在log4net中没有“详细”级别。log4j中有吗

以下是级别

全部 调试 信息 警告 错误 致命的 关

信息性消息是指在应用程序中指定当前正在执行的操作的消息。当你说-verbose时,那些由操作系统命令或工具发出的消息就是这类消息

调试消息主要针对程序员,它们允许您编写信息,如变量创建、生命周期、异常堆栈跟踪等。只有程序员/支持人员才会感兴趣

[编辑] 就想到这个。您可以很好地向应用程序添加一个名为“verbose”的开关或配置元素,然后在设置为true时发出信息性消息。或者将日志记录包装在一个helper方法中,该方法将登录log4net并向控制台发送相同的消息。此外,您还可以使用ConsolePender将消息记录到console。不过我从来没用过。这就是你要找的吗


希望这能有所帮助。

我没有尝试过,但我认为它应该非常简单:log4net内部知道一个级别“verbose”;只有ILog接口没有公开它。因此,将isverbosenabled和Verbose()方法添加到此接口应该非常简单。当然,您需要愿意更改log4net源代码…

您可以使用扩展方法向log4net添加详细(或跟踪级别)。这就是我正在使用的:

公共静态类iLogExtensions
{
公共静态无效跟踪(此ILog日志、字符串消息、异常)
{
log.Logger.log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType,
log4net.Core.Level.Trace、消息、异常);
}
公共静态无效跟踪(此ILog日志、字符串消息)
{
log.Trace(消息,空);
}
公共静态void Verbose(此ILog日志、字符串消息、异常)
{
log.Logger.log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType,
log4net.Core.Level.Verbose、消息、异常);
}
公共静态void Verbose(此ILog日志,字符串消息)
{
详细日志(消息,空);
}
}
用法示例:

公共类ClientDAO
{
私有静态只读log4net.ILog log=log4net.LogManager.GetLogger(typeof(ClientDAO));
public void GetClientByCode()
{
Trace(“此处是您的详细消息”);
//....
}
}
资料来源:


万一有人仍然需要答案(不使用System.Reflection) 不需要设置DeclaringType,只需设置null(在Lo4Net中自动解析)

测试和验证

log4net中的代码使用

public virtual void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception)
{
    try
    {
        if (this.IsEnabledFor(level))
        {
            this.ForcedLog((callerStackBoundaryDeclaringType != null) ? callerStackBoundaryDeclaringType : Logger.declaringType, level, message, exception);
        }
    }
    catch (Exception exception2)
    {
        LogLog.Error(Logger.declaringType, "Exception while logging", exception2);
    }
}

我已经用BasicConfiguration测试了log4net,并编写了从紧急到调试的所有级别的日志消息生成输出,但是对于跟踪或详细信息,没有

我需要执行下面的代码,让他们开始记录日志

var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
((Hierarchy)logRepository).Root.Level = Level.All;

我更新了问题。。。请注意LoggingEvent有一个level属性。一个可能的值是verbose。抱歉,我在SDK中没有看到这个可能的值。你能具体说明你从哪里得到的吗?我想我明白你的意思。OOB(开箱即用)Log4net并没有详细的级别,而是指信息之上的任何内容,实际上这意味着调试。这就是为什么您只能在布局格式化期间检查它的原因,对吗?还请查看“我的答案”的编辑,其中指定了更多详细信息。另外,您能解释一下如何区分信息和详细信息吗?我有以下值:警报、全部、严重、调试、紧急、错误、致命、精细、精细、精细、信息、通知、关闭、严重、跟踪、详细、警告。我的产品版本是1.2请参见更新的问题。。。它更深入地解释了这个问题。哎哟,这大大改变了这个问题。恐怕我现在不知道该回答什么=\n请注意,
ILog.xxxxFormat()
方法执行
。IsxxxxEnabled
检查内部。简短的回答是-除非您对管道做一些工作,否则您不能。这在以后的版本中可能会发生变化。这个问题是在考虑产品的1.2版时提出的。
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
((Hierarchy)logRepository).Root.Level = Level.All;