问题 NLog日志记录

Raysefo

知名会员
已加入
2019年2月22日
留言内容
194
编程经验
10+
@跳伞@谢平 再次感谢你的帮助。如您所建议,我决定登录文件而不是数据库。我使用了Nlog,请您看看我的代码?够好吗?

我已经有UnhandledExceptionHandler,所以我添加了NLog记录器,如下所示。我删除了所有try / catch,以便从单个点管理日志记录。

C#:
using System;
namespace Game.Handlers
{
    public class UnhandledExceptionLogger : ExceptionLogger
    {
        private static Logger logger = LogManager.GetCurrentClassLogger();

        public override void Log(ExceptionLoggerContext context)
        {
            var ex = context.Exception;

            string strLogText = FormatException(ex);

            var requestedURi = (string)context.Request.RequestUri.AbsoluteUri;
            var requestMethod = context.Request.Method.ToString();
            var timeUtc = DateTime.Now;

            SqlErrorLogging sqlErrorLogging = new SqlErrorLogging();
            ApiError apiError = new ApiError()
            {
                Message = strLogText,
                RequestUri = requestedURi,
                RequestMethod = requestMethod,
                TimeUtc = DateTime.Now
            };
            //sqlErrorLogging.InsertErrorLog(apiError);
            //NLOG
            logger.Error(strLogText + Environment.NewLine + DateTime.Now);
        }


        private string FormatException(Exception ex, int depth = 0)
        {
            var indent = "";
            if (depth > 0)
                indent.PadRight(depth * 4);

            var sb = new StringBuilder();
            IndentLine($"Source --- {ex.Source}");
            IndentLine($"StackTrace --- {ex.StackTrace}");
            IndentLine($"TargetSite --- {ex.TargetSite}");

            if (ex.InnerException != null)
            {
                IndentLine("--- Inner Exception ---");
                sb.Append(FormatException(ex.InnerException, depth + 1));
                IndentLine("--- End Inner Exception ---");
            }
            if (ex.Message != null)
            {
                IndentLine($"Message --- {ex.Message}");
            }
            return sb.ToString();

            void IndentLine(string s)
            {
                sb.Append(indent);
                sb.AppendLine(s);
            }
        }

    }
}

这是示例NLog配置:
C#:
<nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
      <target name="logfile" xsi:type="File" fileName="${basedir}/MyLogs/${date:format=yyyy-MM-dd}-api.log" />
      <target name="eventlog" xsi:type="EventLog" layout="${message}" log="Application" source=" GamePIN Api Services" />
      <target name="database" type="Database" connectionString="Data Source=(localdb)\MSSQLLocalDB;Database=Game; Initial Catalog=GameAPI;MultipleActiveResultSets=True;">
        <commandText> insert into ExceptionLog ([TimeStamp],[Level],Logger, [Message], UserId, Exception, StackTrace) values (@TimeStamp, @Level, @Logger, @Message, case when len(@UserID) = 0 then null else @UserId end, @Exception, @StackTrace); </commandText>
        <parameter name="@TimeStamp" layout="${date}" />
        <parameter name="@Level" layout="${level}" />
        <parameter name="@Logger" layout="${logger}" />
        <parameter name="@Message" layout="${message}" />
        <parameter name="@UserId" layout="${mdc:user_id}" />
        <parameter name="@Exception" layout="${exception}" />
        <parameter name="@StackTrace" layout="${stacktrace}" />
        <dbProvider>System.Data.SqlClient</dbProvider>
      </target>
    </targets>
    <rules>
      <!-- I am adding my 3 logging rules here -->
      <logger name="*" minlevel="Error" writeTo="database" />
      <logger name="*" minlevel="Error" writeTo="logfile" />
      <logger name="*" minlevel="Error" writeTo="eventlog" />
    </rules>
  </nlog>
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
也许我很想念它,但是由于NLog支持各种魔术模板来布局日志输出的外观,为什么还需要所有额外的代码来进行所有格式化?

同样,NLog和大多数日志记录库一样值得支持,它不仅支持日志记录错误,还支持更多功能。某些位置适当的日志记录调用,用于记录信息性和调试级别的数据,将来只需更改一下web.config文件就可以为您提供帮助。是的,保持当前的日志记录级别为"Error"当您投入生产时,但是在负载测试过程中降低到"Information" or "Debug"级别,以便您知道发生故障时发生的情况,而不必在发生故障时以较低的设置重新运行负载测试。

检查NLog的启动成本。如果价格相对昂贵,则可能不希望在最后一刻实例化它。取而代之的是,这时候您要么想要一个单例,要么只是一个实例,该实例被注入需要或应该记录的所有类中。
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
194
编程经验
10+
也许我很想念它,但是由于NLog支持各种魔术模板来布局日志输出的外观,为什么还需要所有额外的代码来进行所有格式化?

我已经有了用于登录数据库表的那些额外代码。因此,如果不需要按照您的建议,我将其删除。我想知道您对将此Nlog放入UnhandledExceptionHandler的意见。可以吗你有什么建议?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
我要说的是,您也可以为文本文件使用类似的标签/占位符。例如,您可以将此代码粘贴在当前时间戳记中,
C#:
logger.Error(strLogText + Environment.NewLine + DateTime.Now);
但是NLog已经有一个标签/占位符"${date} and ${time}"
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
194
编程经验
10+
将Nlog放入CustomExceptionFilter时,可以在文件中看到以下错误。这是什么意思,以及如何解决?

C#:
2019-08-19 22:26:43.5956||ERROR|Game.Handlers.CustomExceptionFilter|System.Threading.Tasks.TaskCanceledException:任务被取消。
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at BusinessService.Utility.Utilities.<CallRazer>d__3.MoveNext() in C:\Users\197199\Documents\Visual Studio 2017\Projects\Game\BusinessService\Utility\Utilities.cs:line 138
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at BusinessService.GameServicesTest.<CallProducts>d__11.MoveNext() in C:\Users\197199\Documents\Visual Studio 2017\Projects\Game\BusinessService\GameServicesTest.cs:line 478
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at BusinessService.GameServicesTest.<GameProducts>d__10.MoveNext() in C:\Users\197199\Documents\Visual Studio 2017\Projects\Game\BusinessService\GameServicesTest.cs:line 449
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Game.Controllers.LoadTestController.<PostProducts>d__5.MoveNext() in C:\Users\197199\Documents\Visual Studio 2017\Projects\Game\Game\Controllers\LoadTestController.cs:line 205
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__1`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__6.MoveNext()
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
我认为具有讽刺意味的是,当所有网站都为我旋转并加载时,您链接到有关超时处理的帖子。 :) 是的,我遵循的是网址,而不是 超连结 自从它坏了。

我不确定为什么httpclient会导致Iformat异常,还是我错过了某个地方?很奇怪的事情发生了 添加HttpClient标头会生成带有某些值的FormatException

您将必须开始调试代码。我们无能为力...
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
194
编程经验
10+
我在下面遇到异常。格式异常有什么意义?我不明白

System.Threading.Tasks.TaskCanceledException:任务被取消。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
我在下面遇到异常。格式异常有什么意义?我不明白
我读到的关于您的数据写入问题的最后一个错误是关于Iformat异常的,我对您之间的困惑感到困惑 两个独立的问题,您的开头主题和Nlog之间没有任何联系。

A)为什么不出错 写入数据库?和B)您的新问题 日志 -不要追踪主题,因为您会发现新的问题。每个问题都应发布在新主题中并分别处理。
要求国防部从我引用Nlog的地方拆分您的主题,或者从您的新问题开始一个新主题。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
谢谢约翰·H
 
最佳 底部