2009-04-07 71 views
2

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

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

有谁在部署在企业环境中的Windows应用程序日志记录的经历吗? (1)快速,(2)可靠,以及(3)可访问的任何建议,我可以把日志放在哪里?

回答

2

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

一般来说,你想写一个本地文本文件其他地方像网络共享或数据库。如果您遇到IO /速度问题,可以使用该文本文件作为缓冲区,并批量将日志写入竞争资源。然后你定期刷新本地的'备份'日志。

+0

你知道是否可以配置log4net来做到这一点? – 2009-04-07 21:02:17

+0

我知道你可以配置它记录到数据库或newtork共享_and_本地文件。我不知道你是否可以把它交给批处理/缓冲区日志。我怀疑它会像我描述的那样完成它,但你可以直接在你的应用程序中构建刷新/恢复逻辑。 – 2009-04-07 21:08:02

1

ApplicationData文件夹怎么样?在Vista中,这将是这样的:

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

如果你想有一个中心位置,我会与数据库日志去。但正如Joel所说的,你需要一个始终有效的本地位置(或者接近它的位置)和一个中心位置来收集日志,以便在事情正常运行时进行。

+0

他很担心集中收集他们。 – 2009-04-07 20:33:11

0

如果应用程序是一个典型的两层工作,记录到数据库AdoNetAppender可能是合适的。 AdoNetAppender将日志消息分成多达100个的块,尽管您可能希望将其配置为在至少WARN严重性事件上写入。

你也可以考虑登录到所有用户的应用程序数据目录,虽然这可能使它同样笨拙的检索日志。也许考虑在某处添加快捷方式?

最后,如果日志访问性问题,您的组织中一个共同的主题,你可能要考虑一个日志收集的应用程序,如Splunk

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" /> 

0

你可以尝试某处的CommonAppData文件夹下 - 即CommonAppData \ YourAppName \日志 - 只要你确保大小限制和/或定期清理。人们习惯于定期清理临时文件夹,但要注意在CommonAppData,AppData或LocalAppData周围开始挖掘。

写在其他地方,但在这里或温度将迟早让你在Vista和更高的麻烦。

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

2

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

速度从来都不是问题。

1

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

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

如果你想写入事件日志,这是相当直截了当:

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

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

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天的事件)。

相关问题