代码之家  ›  专栏  ›  技术社区  ›  John M Gant aman_novice

Windows应用程序日志的写入位置

  •  2
  • John M Gant aman_novice  · 技术社区  · 16 年前

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

    我试过让他们写到一个共享的网络位置,但有些用户使用这种方法时遇到了糟糕的I/O。我尝试过登录到用户的temp文件夹,但这使得检索日志变得更加困难。我没有尝试过活动日志,因为我可能要跳过一些圈才能完成这项工作,我不确定它是否值得。我从来没有尝试过数据库日志记录,但我一直认为它会相对缓慢。

    有没有人有登录公司环境中部署的Windows应用程序的经验?我可以把日志放在哪里,以便(1)快速,(2)可靠,(3)可访问,有什么建议吗?

    8 回复  |  直到 16 年前
        1
  •  2
  •   Joel Coehoorn    16 年前

    数据库日志记录的问题不是速度:而是可靠性。当事情出了问题,你就记录下来,如果事情出了问题,那么一个无法访问的数据库的可能性对你不利。

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

        2
  •  2
  •   Brian    16 年前

    我在MS SQL数据库中使用了log4net。如果可能的话,我通常会将它们放在不同的服务器上。这样,如果应用服务器或数据库有问题,我不会丢失日志记录。

    速度从来不是问题。

        3
  •  2
  •   Michael Meadows    16 年前

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

        4
  •  1
  •   Ray    16 年前

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

    C:\users\ray\appdata\local\mycompany名称

    如果您想要一个中心位置,我将使用数据库日志记录。但正如Joel所说,您将需要一个始终工作的本地位置(或尽可能靠近它)和一个中心位置来收集日志,以便在正常工作时使用。

        5
  •  1
  •   Gaidin    16 年前

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

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

    如果您确实想写入事件日志,那么它是相当直接的:

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

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

        6
  •  0
  •   Jeffrey Hantin    16 年前

    如果应用程序是典型的两层作业,则使用 AdoNetAppender 可能是合适的。尽管您可能希望将日志消息配置为至少在 WARN 严重性事件。

    您可能还需要考虑将日志记录到“所有用户”应用程序数据目录,尽管这可能会使检索日志变得同样困难。也许可以考虑在某个地方添加一个快捷方式?

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

        7
  •  0
  •   Mihai Limbășan    16 年前

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

    除了在这里或是在temp中以外的任何地方写作,迟早会给你在vista和更高版本上带来麻烦。

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

        8
  •  0
  •   Peter Tate    16 年前

    在我们的应用程序中,我们在commonAppData目录(c:\documents and settings\all users\application data\company\product)中记录4net并为所有用户使用一个公共日志文件。在这种情况下,安装程序必须手动设置目录和日志文件的文件权限,以便所有用户都可以访问它,默认权限仅适用于安装应用程序的用户。

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

    如果确实使用事件日志,请确保日志记录非常少。如果您记录大量事件,因为事件日志可以很快被填满,并且xp上的默认策略是,如果日志已满,并且默认大小相对较小(512 kb,并且仅覆盖7天以上的事件),则事件日志将开始删除事件。