在log4net中有两个非常好的函数:
Log.Error("Message", myException);和
Log.ErrorFormat("Message {0}", CustomerId);在输出日志文件中生成日志记录非常好。异常是很好的,因为它很好地打印了堆栈跟踪和所有异常细节,而格式很好,因为它允许我指定导致失败的参数。有没有一种“两种世界都是最好的”方法,还是某种方法来实现它?
Log.ErrorFormatEx("Message {0}", CustomerId, myException)编辑:我讨论了可能重复的问题,但它们的格式很差,不像这样问。我正在寻找一个扩展方法或现有的方法。
发布于 2016-11-03 15:16:21
现在用字符串内插来解决这个问题:
Log.Error($"Message {CustomerId}", myException);发布于 2015-05-07 06:56:25
您可以创建一个扩展方法:
namespace log4net.Core
{
public class Log4NetExtensions
{
public static void ErrorFormatEx(this ILog logger, string format, Exception exception, params object[] args)
{
logger.Error(string.Format(format, args), exception);
}
}
}然后,您就可以像使用任何其他Log4Net方法一样使用它:
Log.ErrorFormatEx("Message {0}", exception, CustomerId);发布于 2015-10-21 12:19:32
知道这一点已经得到了回答,但只对其他可能发现这个选项有用的用户来说是正确的。我创建了一个ILog接口和一个日志类来“集中”我的log4net方法和逻辑。此外,我还为"Error“方法创建了多个重载。
ILog.cs
public interface ILog
{
void Error(Exception exception);
void Error(string customMessage, Exception exception);
void Error(string format, Exception exception, params object[] args);
void Warn(Exception exception);
void Info(string message);
}Log.cs
public class Log : ILog
{
public void Error(Exception exception)
{
log4net.ILog logger = log4net.LogManager.GetLogger(exception.TargetSite.DeclaringType);
logger.Error(exception.GetBaseException().Message, exception);
}
public void Error(string customMessage, Exception exception)
{
log4net.ILog logger = log4net.LogManager.GetLogger(exception.TargetSite.DeclaringType);
logger.Error(customMessage, exception);
}
public void Error(string format, Exception exception, params object[] args)
{
log4net.ILog logger = log4net.LogManager.GetLogger(exception.TargetSite.DeclaringType);
logger.Error(string.Format(format, args), exception);
}
public void Warn(Exception exception)
{
log4net.ILog logger = log4net.LogManager.GetLogger(exception.TargetSite.DeclaringType);
logger.Warn(exception.GetBaseException().Message, exception);
}
public void Info(string message)
{
log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
logger.Info(message);
}
}示例用法
public MyClass DeserializeJsonFile(string path)
{
try
{
using (StreamReader r = new StreamReader(path))
{
string json = r.ReadToEnd();
return JsonConvert.DeserializeObject<MyClass>(json);
}
}
catch (Exception ex)
{
this.log.Error("Error deserializing jsonfile. FilePath: {0}", ex, path);
return null;
}
}https://stackoverflow.com/questions/30093593
复制相似问题