首页 文章

Log4net,如何记录详细消息?

提问于
浏览
15

我可以毫无问题地记录信息消息,但无法弄清楚如何记录详细消息 . 任何帮助都会受到欢迎 .

我的问题是:

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

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

Log.Info
Log.Debug
Log.Warn
Log.Error

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

那么如何记录详细消息,这与调试不同

提前致谢

6 回答

  • 2

    您可以使用扩展方法向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

  • 3

    你无法弄明白,因为,AFAIK在log4net中没有“冗长”级别 . log4j中有一个吗?

    以下是级别

    所有调试信息警告错误致命关闭

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

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

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

    希望这可以帮助 .

  • 1

    Apache log4net具有以下日志级别:

    DEBUG <INFO <WARN <ERROR <致命

    对于被认为比信息性消息更详细的消息( 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" );
    
  • 2

    我没有尝试过,但我认为它应该是非常简单的:内部log4net知道级别“冗长”;它只是ILog接口不暴露它 . 因此,将IsVerboseEnabled和Verbose()方法添加到此接口应该非常简单 . 当然你需要愿意更改log4net源代码......

  • 29

    我已经使用BasicConfigurator测试了log4net,并将所有级别的日志消息生成输出从EMERGENCY下降到DEBUG,但是 not 用于TRACE或VERBOSE .

    我需要执行下面的代码才能开始记录 .

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

    如果有人仍然需要答案(不使用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);
        }
    }
    

相关问题