在Windows应用程序中记录错误

时间:2014-08-01 07:26:50

标签: c# logging log4net

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

我面临的问题是 where 来记录这些错误。如果我正在登录到本地文件夹,则日志将在客户端的计算机上,我们无法方便地访问。

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

  1. 共享(网络)位置的日志错误
  2. DB中的日志错误
  3. 数据库中记录错误的问题是,如果连接到数据库时出现问题,那么日志记录显然会失败,因此我们决定登录共享位置。

    现在有人告诉我,登录共享位置不是一个好习惯。

    当您可以记录可能的每个地方无法访问或关闭时,您可以采取哪些措施来确保记录?

2 个答案:

答案 0 :(得分:1)

共享位置是什么?

通常,您始终面临无法获取日志的风险,因为客户端计算机可能会丢失网络连接。在这种情况下,记录到共享位置,数据库,Web服务,其他任何遥控器都无法帮助您。

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

如果不这样做,登录数据库通常就足够了。在实践中,如果您 cant 登录数据库,则由于以下原因之一:

  • 连接问题。 (机器丢失网络连接或数据库服务器已执行或已脱机)
  • 日志记录代码中的错误

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

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

在某些情况下,在恢复网络连接时将保存的本地日志文件上传到数据库是有意义的,但通常它是一种过度杀伤。

答案 1 :(得分:1)

您要完成的是我们称之为“尽力而为”的日志记录。这是一种与语言无关的实践,类似于:

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(或任何日志记录服务器)
  • 使用第三个只是额外的偏执狂,请观看有关rsyslog存在挑战的消息的redis(pub / sub可能是理想的)

..或者以任何对你有意义的方式去做。如果您的理想日志位置是数据库,那么只需登录到数据库,同时确保在数据库无法做到的情况下继续“尽力而为”到达。如果所有其他方法都失败了,写一个文件 - 你不会经常这样做(或者理想情况下,需要从中捞出一些东西) - 所以这个位置变得不那么重要了。

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