【问题标题】:Where are the best locations to write an error log in Windows?在 Windows 中编写错误日志的最佳位置在哪里?
【发布时间】:2010-09-16 12:53:34
【问题描述】:

在 Windows 中,您会在哪里编写错误日志文件,例如 ErrorLog.txt?请记住,路径需要对基本用户开放才能获得文件写入权限。

我知道事件日志可能是写入错误的位置,但它是否适用于“用户”级别的权限?

编辑:我的目标是 Windows 2003,但我提出问题的方式是在哪里写错误日志的“一般指南”​​。
至于事件日志,我以前在一个 ASP.NET 应用程序中遇到过问题,我想在其中记录到 Windows 事件日志,但我遇到了让我心痛的安全问题。 (我不记得我遇到过的问题,但记得有过。)

【问题讨论】:

  • 您能否更具体地说明您打算记录的程序类型或错误类型。从长远来看,错误有多重要。 (例如网络服务器?)
  • 了解您正在开发的技术以及您所针对的操作系统版本会很有用。 :)

标签: permissions error-logging


【解决方案1】:

您是否考虑过记录事件查看器?如果你想写自己的日志,我建议用户本地应用设置目录。在下面创建一个产品目录。在不同版本的 Windows 上会有所不同。

在 Vista 上,您不能将这样的文件放在 c:\program 文件下。你会遇到很多问题。

在 .NET 中,您可以使用以下命令找到此文件夹:

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

事件日志的使用也相当简单:

http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

【讨论】:

  • 应用设置目录是个好位置。通过 Application 对象(.CommonAppDataPath、.LocalUserAppDataPath 等)上的静态属性轻松在 .net WinForms 中检索,无需额外修改。
  • 使用应用设置文件夹的问题在于,大部分时间日志文件都是在资源管理器的记事本中手动打开的,这意味着用户将不得不去挖掘它。
  • 作为一项规则,我提供了一种通过 UI 直接打开日志文件的机制。而且您的软件始终可以运行,所以他们什么时候需要查看日志,对吗? ;)
  • 您/应用需要管理员权限才能使用Event Log
【解决方案2】:

文本文件非常适合服务器应用程序(您确实说过 Windows 2003)。您应该为每个服务器应用程序有一个单独的日志文件,该位置实际上是与管理员达成一致的约定问题。例如。对于 ASP.NET 应用程序,我经常看到它们被放置在与应用程序不同的磁盘上,位于模仿虚拟目录结构的文件夹结构下。

对于客户端应用程序,文本文件的一个缺点是用户可能会启动您的应用程序的多个副本(除非您已采取特定步骤来防止这种情况发生)。因此,如果多个实例尝试写入同一个日志文件,就会出现争用问题。出于这个原因,我总是更喜欢客户端应用程序的 Windows 事件日志。一个警告是,您需要成为管理员才能创建事件日志 - 这可以通过例如通过安装包。

如果您确实使用文件,我建议使用文件夹 Environment.SpecialFolder.LocalApplicationData 而不是其他人建议的 SpecialFolder.ApplicationData。 LocalApplicationData 在本地磁盘上:当用户有漫游配置文件时,您不希望网络问题阻止您登录。对于 WinForms 应用程序,请使用 Application.LocalUserAppDataPath。

在任何一种情况下,我都会使用配置文件来决定在哪里记录,以便您可以轻松更改它。例如。如果您使用 Log4Net 或类似的框架,您可以轻松配置是否记录到文本文件、事件日志、两者或其他地方(例如数据库),而无需更改您的应用程序。

【讨论】:

    【解决方案3】:

    标准位置是:

    C:\Documents and Settings\All Users\Application Data\MyApp
    

    C:\Documents and Settings\%Username%\Application Data\MyApp
    

    (又名%UserProfile%\Application Data\MyApp)将符合您的用户级别权限要求。它还分隔不同用户创建的日志。

    使用 .NET 运行时,这些可以构建为:

    AppDir=
      System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
    

    AppDir=
      System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
    

    接着是:

    MyAppDir = IO.Path.Combine(AppDir,'MyApp')
    

    (希望也能映射 Vista 配置文件)。

    【讨论】:

    • 这不适合 Vista ——(最好使用 .NET Environment 类,或者用你使用的任何语言包装正确调用的东西)
    【解决方案4】:

    就个人而言,我建议使用 Windows 事件日志,这很棒。如果不能,则将文件写入 ApplicationData 目录或 ProgramData(Windows XP 上所有用户的应用程序数据)目录。

    【讨论】:

    • 您/应用程序需要管理员权限才能写入“Windows 事件日志”...
    【解决方案5】:

    Windows 事件日志绝对是记录错误的方法。您不限于“应用程序”日志,因为可以创建新的日志目标(例如“我的应用程序”)。这可能需要作为设置的一部分来完成,因为我不确定它是否需要管理权限。 http://support.microsoft.com/kb/307024 有一个 Microsoft 的 C# 示例。

    Windows 2008 还具有Event Log Forwarding,这对于服务器应用程序来说非常方便。

    【讨论】:

    • 在现有日志中创建一个新的“事件源”(一个字段中的文本)需要管理员权限,所以我不得不假设创建一个新的日志(一个全新的文件)也需要管理员权限。
    • 这是我之前遇到的“问题”,Web 应用程序需要管理员权限才能在 Windows 事件日志中创建日志。
    【解决方案6】:

    我同意 Lou 的观点,但我更喜欢像 Joe 所说的那样在配置文件中进行设置。你可以使用

    文件值="${APPDATA}/Test/log-file.txt"

    (“测试”可以是您想要的任何内容,或完全删除)在配置文件中,这会导致日志文件写入“/Documents and Settings/LoginUser/Application Windows XP 上的“数据/测试”和 Windows Vista 上的“/Users/LoginUser/AppData/Roaming/Test”。

    我只是添加了这个,因为我花了太多时间来弄清楚如何在 Windows Vista 上使它工作......

    这适用于 Windows 应用程序。要在 Web 应用程序中使用日志记录,我发现 Phil Haack 的博客条目是一个很好的资源: http://haacked.com/archive/2005/03/07/ConfiguringLog4NetForWebApplications.aspx

    【讨论】:

      【解决方案7】:

      %TEMP% 始终是我找到日志的好位置。

      【讨论】:

      • 如果日志长期而言相对不重要,我同意 Temp 是正确的。
      【解决方案8】:

      在这里违背常规 - 这取决于您需要做什么。有时您需要操纵结果,因此 log.txt 是要走的路。它简单、可变且易于搜索。

      以乔尔为例。 Fogbugz 将通过 http 向他们的服务器发送错误消息的日志/转储。您也可以这样做,而不必担心用户对其驱动器的访问权限。

      【讨论】:

        【解决方案9】:

        我个人不喜欢使用我现在所在的 Windows 事件日志,因为我们无权访问生产服务器,这意味着我们每次想要查看错误。不幸的是,这不是一个快速的过程,因此您的故障排除完全是通过等待其他人来完成的。我也不喜欢他们在其他应用程序中迷失方向。当然你可以排序,但这只是向下滚动的一个细微差别。您使用的最终将是个人偏好以及您工作环境的限制的组合。(日志文件、事件日志或数据库)

        【讨论】:

          【解决方案10】:

          把它放在应用程序的目录中。用户需要访问文件夹才能运行和执行应用程序,您可以在应用程序启动时检查写入权限。

          事件日志很难用于故障排除,但您仍应在此处发布重大错误。

          编辑 - 如果您使用 .NET,您应该查看 MS 应用程序块以进行日志记录。它们真的让生活变得轻松。

          天哪,业力杀手。下次发帖人发不完整的帖子,我什至不会提供建议。

          【讨论】:

          • 应用程序日志不应放在应用程序目录中。在安全的环境中,非管理员将没有写入权限。
          • 将日志文件放在安装应用程序的目录中是一个BAD BAD 的想法。我不能足够强烈地重申这一点。 Vista 上的用户可能能够运行应用程序,但他们将无法(也不应该)写入 %PROGRAMFILES% 中的应用程序目录
          • 对于 vista 下的程序来说不是一个选项,一般来说是个坏主意。 Vista 不允许程序在“程序文件”中创建文件,因此如果在此处安装应用程序,日志记录将严重失败。
          • 谁用vista??? =) 你们中没有人创建过 /log 文件夹并将滚动日志放在那里?
          • 就我个人而言,一旦一个错误的答案有一个否定的答案,我就不会堆积。一旦我意识到我的一个答案不正确并得到-1,我就会将其删除,因为 SO 堆积如山。它甚至不值得纠正——人们认为负面意味着它是错误的,并且仍然会继续反对它。
          猜你喜欢
          • 2010-11-22
          • 2019-11-09
          • 1970-01-01
          • 2015-08-31
          • 2019-03-25
          • 2011-07-02
          • 2010-10-02
          • 1970-01-01
          • 2021-08-31
          相关资源
          最近更新 更多