在Windows应用程序中登录错误

本文关键字:登录 错误 应用程序 Windows | 更新日期: 2023-09-27 18:16:07

我有一个Windows应用程序,我想使用Log4Net记录错误。

我面临的问题是记录这些错误。如果我记录到一个本地文件夹,那么日志将在客户端的机器上,这对我们来说是不方便的。

所以,我们想到了两个选择:

  1. 共享(网络)位置的日志错误
  2. DB
  3. 日志错误

在数据库中记录错误的问题是,如果连接到DB时出现问题,那么日志记录显然会失败,所以我们决定在共享位置进行日志记录。

现在,有人告诉我,登录到共享位置不是一个好的做法。

当可以记录的每个地方可能无法访问或关闭时,您可以做些什么来确保日志记录?

在Windows应用程序中登录错误

什么共享位置?

一般来说,您总是处于无法获得日志的风险中,因为客户端机器可能会失去网络连接。在这种情况下,登录到共享位置,数据库,web服务,任何其他远程都不会帮助您。

可能摩擦最小的专业解决方案是使用像https://raygun.io/这样的服务,这不是唯一的一个,还有其他类似的服务。

如果做不到这一点,记录到数据库通常是足够的。在实践中,如果你不能登录数据库,那是因为以下原因之一:

  • 连接问题。(机器失去网络连接或DB服务器失去网络连接或离线)
  • 日志代码中的bug

同样,在实践中,如果进行了充分的测试,后一种情况发生的可能性非常小,因为日志代码并不那么复杂。前者的可能性更大,因此您需要单独处理此场景。通常,如果数据库日志记录失败,在本地记录(本地文件/事件日志)是一个好主意。很难从客户机器中检索这些数据,但在极少数情况下,您需要排除连接问题,这是一个节省生命的方法。

在"windows共享"中记录到"共享位置"是不常见的,在我看来没有提供比记录到数据库的优势。数据库和共享位置都可能关闭。客户端计算机可能没有连接。在所有这些场景中,这两个选项的行为是相同的。

在某些情况下,当网络连接恢复时,将保存的本地日志文件上传到数据库是有意义的,但这通常是多余的。

您试图完成的是我们称之为"尽力而为"的日志记录。这是一种与语言无关的做法,类似于:

try:
   if [database]
      log [database]
      done // exit the logging method, database worked.
   endif
   if [rsyslog] // If we got here, [database] didn't work.
      log [rsyslog]
      done // exit the logging method, rsyslog worked.
   endif
   if [redis] // If we got here, both [database] *and* [rsyslog] didn't work.
      log [redis]
      done // exit the logging method, redis worked.
   endif
finally: // nothing worked
   panic // write anywhere it can, just open a file in the app directory if it must.

这取决于您想要使用的日志库来实现,尽管有些可能已经内置了。然而,只有当事情变得糟糕时,它才会开始看起来支离破碎:

  • 大多数东西最终会进入数据库
  • 数据库异常将转到rsyslog(或任何日志服务器)
  • 使用第三个只是额外的偏执,观察redis关于rsyslog存在性挑战的消息(pub/sub可能是理想的)

. .或者你觉得怎么做就怎么做。如果您的理想的日志位置是数据库,那么只需日志到数据库,同时确保在无法访问数据库时继续"尽最大努力"。如果所有这些都失败了,那么就写入一个文件—您不会经常这样做(或者理想情况下,不需要从中取出比特)—这样位置就不再是一个问题了。

最终的结果是,您所要担心的就是调用日志方法,因为您知道它将尽最大努力以几种已定义的方式之一记录数据。如果它甚至无法打开文件,那么你可能还有很多其他有趣的日志要查看:)