首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Log4Net如何同时使用ErrorFormat和错误

Log4Net如何同时使用ErrorFormat和错误
EN

Stack Overflow用户
提问于 2015-05-07 06:35:34
回答 5查看 11.4K关注 0票数 7

在log4net中有两个非常好的函数:

代码语言:javascript
复制
Log.Error("Message", myException);

代码语言:javascript
复制
Log.ErrorFormat("Message {0}", CustomerId);

在输出日志文件中生成日志记录非常好。异常是很好的,因为它很好地打印了堆栈跟踪和所有异常细节,而格式很好,因为它允许我指定导致失败的参数。有没有一种“两种世界都是最好的”方法,还是某种方法来实现它?

代码语言:javascript
复制
Log.ErrorFormatEx("Message {0}", CustomerId, myException)

编辑:我讨论了可能重复的问题,但它们的格式很差,不像这样问。我正在寻找一个扩展方法或现有的方法。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-11-03 15:16:21

现在用字符串内插来解决这个问题:

代码语言:javascript
复制
Log.Error($"Message {CustomerId}", myException);
票数 2
EN

Stack Overflow用户

发布于 2015-05-07 06:56:25

您可以创建一个扩展方法:

代码语言:javascript
复制
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方法一样使用它:

代码语言:javascript
复制
Log.ErrorFormatEx("Message {0}", exception, CustomerId);
票数 7
EN

Stack Overflow用户

发布于 2015-10-21 12:19:32

知道这一点已经得到了回答,但只对其他可能发现这个选项有用的用户来说是正确的。我创建了一个ILog接口和一个日志类来“集中”我的log4net方法和逻辑。此外,我还为"Error“方法创建了多个重载。

ILog.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
    }
}

示例用法

代码语言:javascript
复制
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;                
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30093593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档