我可以毫无问题地记录信息消息,但无法弄清楚如何记录详细消息。 任何帮助都会受到欢迎。
我的问题是:
可以在Format函数中检查loggingEvent.Level。可能的值包括Info,Debug,Error,Verbose等。还有更多,但这些是我将主要使用的。
实际的日志对象只有以下方法:
Log.Info
Log.Debug
Log.Warn
Log.Error
正如你所看到的 - 没有冗长!
那么如何记录详细消息,这与debug
不同提前致谢
答案 0 :(得分:30)
您可以使用扩展方法向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
答案 1 :(得分:3)
Apache log4net具有以下日志级别:
DEBUG<信息<警告<错误<致命
对于被认为比信息性消息(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 :(得分:3)
你无法弄明白,因为,AFAIK在log4net中没有“详细”级别。 log4j中有一个吗?
以下是等级
ALL DEBUG 信息 警告 错误 致命 OFF
信息性消息是您指定当前在应用程序中执行的操作的消息。 ,当你说-verbose时,这些消息会被OS命令或工具吐出。
调试消息主要供程序员使用,它们允许您编写诸如变量创建,生命周期,异常堆栈跟踪等信息。只有程序员/支持人员才会对此感兴趣。
[编辑] 想到这一点。您可以很好地将一个开关或配置元素添加到名为“verbose”的应用程序中,然后在设置为true时吐出信息性消息。或者将日志记录包装在一个帮助器方法中,该方法将登录log4net并将相同的消息发送到控制台。此外,您可以使用ConsoleAppender将消息记录到控制台。我从来没用过它。这是你在找什么?
希望这有帮助。
答案 3 :(得分:2)
我没有尝试过,但我认为它应该是非常简单的:内部log4net知道级别“冗长”;它只是ILog接口不暴露它。因此,将IsVerboseEnabled和Verbose()方法添加到此接口应该非常简单。当然你需要愿意更改log4net源代码......
答案 4 :(得分:2)
如果有人仍然需要答案(不使用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 :(得分:2)
我已经使用BasicConfigurator对log4net进行了测试,并将所有级别的日志消息生成输出从急停下降到DEBUG,但不用于TRACE或VERBOSE。
我需要执行以下代码才能开始记录。
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
((Hierarchy)logRepository).Root.Level = Level.All;