在哪里写日志的Windows应用程序

我有一个通过ClickOnce部署到Web服务器的.NET Windows应用程序。 在任何时候都有大约100个用户,都位于中心位置。 我正在使用log4netlogin应用程序,但我很难到达放置日志的最佳位置。

我试过让他们写入共享的networking位置,但是一些用户使用这种方法遇到了糟糕的I / O。 我已经尝试login到用户的临时文件夹,但这使得难以检索日志。 我没有尝试过事件日志,因为我可能不得不跳过一些环节才能得到这个工作,而且我不确定这是否值得。 我从来没有尝试数据库日志logging,但我一直认为它会相对缓慢。

有没有人有login在公司环境中部署的Windows应用程序的经验? (1)快速,(2)可靠,(3)可以访问的任何build议,我可以把日志放在哪里?

Solutions Collecting From Web of "在哪里写日志的Windows应用程序"

数据库日志记录的问题不是速度:这是可靠性。 当事情出错时,你记录下来,如果事情已经出错,一个无法访问的数据库的可能性不会对你有利。

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

我用ms sql数据库使用log4net。 如果可能的话,我通常会把它们放在一个不同的服务器上。 这样,如果应用程序服务器或数据库有问题,我不会失去我的日志记录。

速度从来都不是问题。

log4net支持一些主要数据库的数据库appender 。 如果你有合适的数据库,这可能是一个更好的选择。 但请小心,因为如果管理不当,可能会降低应用程序的可靠性。

您可以将它与本地文件记录结合使用,通过使用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" /> 

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

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

如果你想要一个中央位置,我会去数据库日志记录。 但是正如Joel所说的那样,你会想要一个总是有效的本地位置(或者接近它的位置)和一个集中的位置来收集日志,以便正常运行。

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

这取决于你想要做什么样的日志记录以及你的应用程序是如何运行的。 如果执行日志记录的应用程序是客户端应用程序,那么如果您写入事件日志,则可能没有帮助。

如果你确实想要写入事件日志,这是相当直接的:

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

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

如果应用程序是典型的双层作业,则使用AdoNetAppender登录到数据库可能是适当的。 AdoNetAppender以最多100个块为单位批量处理日志消息,尽管您可能希望将其配置为至少通过WARN严重性事件写入。

您也可能要考虑记录到所有用户应用程序数据目录,尽管这可能使得检索日志同样困难。 也许考虑在某处添加快捷方式?

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

您可以尝试在CommonAppData文件夹下的某个地方(如CommonAppData \ YourAppName \ Logs),前提是您要确保大小限制和/或定期清理。 人们习惯于定期清理临时文件夹,但是不要在CommonAppData,AppData或LocalAppData周围开始挖掘。

写在任何地方,但在这里或在温度迟早会让你在Vista和更高的麻烦。

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

在我们的应用程序中,我们使用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天的事件)。