【问题标题】:Log4net, how to log a verbose message?Log4net,如何记录详细消息?
【发布时间】:2010-02-17 10:16:02
【问题描述】:

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

我的问题是:

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

实际的日志对象只有以下方法:

日志信息
日志调试
日志警告
日志错误

如您所见 - 不冗长!

那么我怎样才能记录一个详细的消息,这与调试不同

提前致谢

【问题讨论】:

  • 简短的回答是 - 你不能,除非你对管道做一些工作。这可能会在以后的版本中改变。这个问题是在考虑产品的 1.2 版时提出的。

标签: log4net


【解决方案1】:

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

public static class ILogExtentions
{
    public static void Trace(this ILog log, string message, Exception exception)
    {
        log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, 
            log4net.Core.Level.Trace, message, exception);
    }

    public static void Trace(this ILog log, string message)
    {
        log.Trace(message, null);
    }

    public static void Verbose(this ILog log, string message, Exception exception)
    {
        log.Logger.Log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, 
            log4net.Core.Level.Verbose, message, exception);
    }

    public static void Verbose(this ILog log, string message)
    {
        log.Verbose(message, null);
    }

}

使用示例:

public class ClientDAO
{
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(ClientDAO));

    public void GetClientByCode()
    {
        log.Trace("your verbose message here");
        //....
    }
}

来源:

http://www.matthewlowrance.com/post/2010/07/14/Logging-to-Trace-Verbose-etc-with-log4net.aspx

【讨论】:

    【解决方案2】:

    您无法弄清楚,因为 AFAIK 在 log4net 中没有“详细”级别。 log4j 中有一个吗?

    以下是关卡

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

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 我更新了问题...注意 LoggingEvent 有一个 level 属性。一个可能的值是详细的。
    • 抱歉,我在 SDK 中看不到这个可能的价值。 logging.apache.org/log4net/release/sdk/log4net.Core.Level.html你能指定你从哪里得到它吗?
    • 我想我明白你在说什么。 OOB(开箱即用)Log4net 没有详细级别,而是指 Info 之上的任何内容,这实际上意味着调试。这就是为什么您只能在布局格式化期间检查它的原因?
    • 另请参阅我的答案的编辑,其中指定了更多细节。另外,您能否解释一下您如何区分 Info 和 Verbose?
    • 真诚地,我有以下值:警报、全部、严重、调试、紧急、错误、致命、精细、精细、最佳、信息、通知、关闭、严重、跟踪、详细、警告。我的产品版本是 1.2
    【解决方案3】:

    Apache log4net 具有以下日志级别:

    调试

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

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

    如果您编写了非常多的调试消息和/或消息的生成成本很高(例如涉及繁重的字符串连接),请考虑在日志记录周围添加条件:

    if (myLog.IsDebugEnabled)
    {
        myLog.Debug("This is a pretty verbose message");
    }
    

    如果你发现自己经常这样做并且想要干掉你的代码,考虑使用extension methods for deferred message formatting,它将把上面的语句变成这样:

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

    【讨论】:

    • 请查看更新后的问题...它更深入地解释了问题。
    • 哎呀,这大大改变了问题。恐怕我现在不知道该回答什么=\
    • 请注意ILog.xxxxFormat() 方法在内部执行.IsxxxxEnabled 检查
    【解决方案4】:

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

    public bool IsVerboseEnable { get { return _log.Logger.IsEnabledFor(Level.Verbose); } }
    
    public string Verbose(string text)
    {
        _log.Logger.Log(null, Level.Verbose, text, null);
        return text;
    }
    

    经过测试和验证

    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);
        }
    }
    

    【讨论】:

      【解决方案5】:

      我没有尝试过,但我认为它应该很简单:在内部,log4net 知道“详细”级别;只有 ILog 接口不公开它。因此,向该接口添加 IsVerboseEnabled 和 Verbose() 方法应该非常简单。当然你需要愿意更改log4net源代码...

      【讨论】:

        【解决方案6】:

        我已经使用 BasicConfigurator 测试了 log4net,并且写入日志消息会生成从 EMERGENCY 到 DEBUG 的所有级别的输出,但 不是 用于 TRACE 或 VERBOSE。

        我需要执行下面的代码才能让他们开始记录。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多