在哪里为Windows应用程序编写日志

时间:2009-04-07 20:29:27

标签: .net windows logging

我有一个通过ClickOnce部署到Web服务器的.NET Windows应用程序。在任何给定时间,大约有100个用户,都位于中心位置。我正在使用log4net在应用程序中登录,但是我无法到达放置日志的最佳位置。

我已经尝试让他们写入共享网络位置,但是有些用户使用这种方法遇到了糟糕的I / O.我已经尝试登录到用户的临时文件夹,但这使得检索日志变得更加困难。我没有尝试过事件日志,因为我可能不得不跳过一些箍来实现这一点,而且我不确定它是否值得。我从未尝试过数据库日志记录,但我一直认为它会相对较慢。

是否有人在登录公司环境中部署的Windows应用程序方面有经验?有关我可以将日志放在何处的建议,以便(1)快速,(2)可靠,(3)可访问?

8 个答案:

答案 0 :(得分:2)

数据库记录的问题不是速度:它是可靠性。当出现问题时你会记录,如果出现问题,那么无法访问的数据库的可能性对你不利。

通常,您希望在网络共享或数据库等其他位置写入本地文本文件。如果您遇到IO /速度问题,可以将文本文件用作缓冲区,并将日志批量写入争用资源。然后定期刷新本地“备份”日志。

答案 1 :(得分:2)

对于某些主要数据库,

log4net支持database appenders。如果您有合适的数据库,这可能是更好的选择。但请谨慎使用,因为如果管理不当,可能会降低应用程序的可靠性。

您可以将其与本地文件日志记录结合使用,方法是使用BufferingForwardingAppender批量处理网络日志记录,并仅在收到超过特定阈值的消息时发送。这样,您就可以有足够的上下文来跟踪错误,但仅限于发生错误时。

<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender">
<bufferSize value="1024" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
  <threshold value="ERROR"/>
</evaluator>
<appender-ref ref="DatabaseAppender" />

答案 2 :(得分:2)

我已经将log4net与ms sql数据库一起使用了。如果可能的话,我通常会将它们放在不同服务器上的专用数据库中。这样,如果应用程序服务器或数据库出现问题,我就不会丢失我的日志记录。

速度永远不是问题。

答案 3 :(得分:1)

ApplicationData文件夹怎么样?在Vista上会是这样的:

C:\用户\雷\应用程序数据\本地\ MyCompanyName

如果你想要一个中心位置,我会选择数据库记录。但正如乔尔所说,你会想要一个始终有效(或接近它)的本地位置,以及在事情正常工作时收集日志的中心位置。

答案 4 :(得分:1)

您可以使用本地日志记录的组合,并且可以在成功注销时将日志同步到中心数据库。

这取决于您要执行的日志记录类型以及应用程序的运行方式。如果执行日志记录的应用程序是客户端应用程序,那么如果您写入事件日志,它可能没有帮助。

如果您确实想要写入事件日志,那么它非常直接:

http://support.microsoft.com/kb/307024

还有一件事,如果您正在寻找一个您知道用户可以访问的位置,您可以使用独立存储,但是您尝试写入共享文件夹这一事实让我想要您想要的东西您的日志的一个中心位置,在这种情况下,数据库可能是您最好的选择,我的最佳建议可能最适合您。

答案 5 :(得分:0)

如果应用程序是典型的双层作业,则使用AdoNetAppender登录数据库可能是合适的。 AdoNetAppender以最多100个块的形式批量处理日志消息,但您可能希望将其配置为至少在WARN个严重性事件中进行写入。

您可能还需要考虑记录到All Users Application Data目录,尽管这可能会使检索日志同样难以处理。也许考虑在某处添加一个快捷方式?

最后,如果日志可访问性问题是组织中的常见主题,您可能需要考虑日志收集应用程序,例如Splunk

答案 6 :(得分:0)

您可以尝试在CommonAppData文件夹下的某个位置 - 即CommonAppData \ YourAppName \ Logs - 只要您确保大小限制和/或定期清理。人们习惯于定期清理临时文件夹,但是要小心开始使用CommonAppData,AppData或LocalAppData。

在其他任何地方写作,但在这里或在Temp中迟早会让你在Vista及更高版本上遇到麻烦。

如果日志不重要,即如果有人删除了日志,如果不可替代的数据不会丢失,我肯定会在Temp中找到一个子文件夹并有一个单独的任务调度程序作业上传它们。这是最不痛苦的地方。

答案 7 :(得分:0)

在我们的应用程序中,我们使用log4net并在CommonAppData目录(C:\ Documents and Settings \ All Users \ Application Data \ Company \ Product)中为所有用户使用通用日志文件。在这种情况下,我们的安装程序必须手动设置目录和日志文件的文件权限,以便所有用户都可以访问它,默认权限仅适用于安装应用程序的用户。

我们还使用顶级异常处理程序(使用类似于http://www.wintellect.com/cs/blogs/jclark/archive/2005/03/30/simple-main.aspx的实现)将未处理的异常(当我们可以)记录到事件日志中。我们使用事件日志,因为关于打开的文件流的状态的所有赌注都是关闭的。同样,我们的安装程序必须在应用程序事件日志中设置事件日志源。

如果您确实使用了事件日志,请确保您的日志记录非常少。如果您记录了很多事件,因为事件日志可以很快填满,XP上的默认策略是事件日志在日志已满时开始丢弃事件,并且默认大小相对较小(512 KB,并且只覆盖超过7天的事件。)