【问题标题】:What happens if Log4Net doesn't have permission to access the file system如果 Log4Net 没有访问文件系统的权限会发生什么
【发布时间】:2011-01-11 02:31:32
【问题描述】:

我正在使用 Log4Net 为 Windows NT 服务实现日志记录解决方案。我可以翻转配置文件中的开关以开始将信息记录到文件系统。到目前为止,我已经能够通过使用滚动文件附加程序并让 log4net “监视”配置文件来完成此操作。

我注意到,Log4Net 将在服务启动后立即创建空日志文件,即使所有日志记录都已关闭并且我不打算记录。

除了这篇文章,我找不到关于这个主题的更多信息:

How to disable creation of empty log file on app start?

我担心有人可以使用非常低级别的权限集设置服务,甚至无权在文件系统上创建日志文件。即使我不打算记录,我也不希望每次点击记录语句时都会引发异常而导致性能损失。

在尝试记录之前,我已经在每个记录语句中检查是否启用了记录级别,但我仍然不确定在 log4net 的内部工作中是否仍然会抛出异常未创建 appender 中配置的文件。

if (logger.IsDebugEnabled)
{
    logger.DebugFormat(format, traceMessage);    
}

有人知道如果 log4net 最初无法创建日志文件会做什么吗?

这里有一些关于我的配置的信息。开启后日志记录工作正常,我只是担心权限问题。

我的日志记录类的属性以监视配置更改:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Logging.config", Watch = true)]

附加器:

  <appender name="Test" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value=".\\AppLogs\\_test.%appdomain.log" />
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="ALL" />
      <levelMax value="FATAL" />
      <acceptOnMatch value="false"/>
    </filter>
    <filter type="log4net.Filter.LoggerMatchFilter">
      <loggerToMatch value="Test" />
    </filter>
    <appendToFile value="true" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="6MB" />
    <rollingStyle value="Size" />
    <staticLogFileName value="true" />
    <filter type="log4net.Filter.DenyAllFilter" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level - %message%newline" />
    </layout>
  </appender>

【问题讨论】:

  • 我不确定这在 2011 年是否属实,但至少对于最新版本的 Log4Net,它会在实际尝试记录任何内容之前在内部检查给定的日志级别是否已启用。仅当生成发送到记录器的数据需要占用大量 CPU/资源时,IsDebugEnabled 之类的函数才有用。相关的,像 DebugFormat 这样的函数具有简洁的双重目的,而且除非启用了日志级别,否则它不必执行实际的 string.Format。

标签: log4net file-permissions rollingfileappender


【解决方案1】:

“我担心有人可以使用非常低级别的权限设置服务,甚至无权在文件系统上创建日志文件。” - 在服务启动时检测您的最小权限集所需的权限存在,如果不存在则抛出异常(或以其他方式处理)。

我不认为这本身就是一个日志记录问题;更多的是您的服务是否具有所需权限的问题。

【讨论】:

  • 这是个好建议。我在这篇文章中读到,我想确保我正在写入 Windows 7 和 Windows Server 2008 stackoverflow.com/questions/468989/… 的适当位置......是否有一个好的模式来通知用户为什么服务无法启动?很可能如果我无法写入 ProgramData 位置,我该如何向用户提供有关服务无法启动的原因的消息?
  • 米奇,我继续接受你的回答,因为已经过去了几天,没有其他帖子。感谢您的反馈。
猜你喜欢
  • 2011-07-23
  • 1970-01-01
  • 2015-08-19
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多