使用Log4Net和单独登录2个文件创建ReadOnly日志文件

时间:2011-02-25 13:43:26

标签: c# log4net readonly

第一个问题是:

我在c#中开发应用程序,创建2个日志文件(.txt文件):一个用于错误,另一个用于用户进行的修改。这两个文件是使用 log4net 创建的。我看到的问题是这些文件可以被编辑,因此被错误地改变了。

我想将这些文件设置为readonly,而log4net仍然可以写入它们。因为如果我只是更改文件中的属性,则不会写下一个日志。

有办法吗?

此外,应用程序的用户可以从应用程序中打开此日志文件。为此,我使用下一个代码:

System.IO.FileInfo finfo = new System.IO.FileInfo("path");
if (finfo.Exists)
{
 //finfo.Attributes = System.IO.FileAttributes.ReadOnly; 
 // I don't use the previous line at the moment, because it blocks the followings logs.
 System.Diagnostics.Process.Start("path");
}

这是创建和调用记录器的代码:

public static class CLogger
{
   private static readonly ILog logger = LogManager.GetLogger(typeof(CLogger));

   static CLogger()
   {
      XmlConfigurator.Configure(new System.IO.FileInfo("path to .config file"));
   }

   public static void WriteLog(ELogLevel logLevel, String log)
   {
      if (logLevel.Equals(ELogLevel.DEBUG))
      {
         logger.Debug(log);
      }
      else if (logLevel.Equals(ELogLevel.ERROR))
            .
            .
            .          
      else if (logLevel.Equals(ELogLevel.WARN))
      {
                logger.Warn(log);
      }
   }
}

致电记录器:

CLogger.WriteLog(ELogLevel.ERROR, ex.ToString());

我有一个第二个问题相关:

要创建这2个单独的日志文件,我使用.config文件中的下一行:

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="PATH...\ErrorLog.log" />
      <param name="AppendToFile" value="true" />
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR"/>
        <param name="LevelMax" value="ERROR"/>
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="" />
        <param name="Footer" value="" />
        <param name="ConversionPattern" value="%d [%t] %-5p %username %m%n" />
      </layout>
      <threshold value="ERROR" />
    </appender>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="PATH...\TraceLog.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="5MB" />
      <staticLogFileName value="true" />
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO"/>
        <param name="LevelMax" value="INFO"/>
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="" />
        <param name="Footer" value="" />
        <param name="ConversionPattern" value="%d [%t] %-5p %username %m%n" />
      </layout>
      <threshold value="INFO" />
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header]\r\n" />
        <param name="Footer" value="[Footer]\r\n" />
        <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
      </layout>
      <threshold value="ERROR" />
    </appender>
    <root>
      <level value="ERROR" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="ConsoleAppender" />
      <level value="INFO" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>
</configuration>

这有效,但我做得还好吗? 我怀疑是否应该使用' LogFileAppender '或' RollingFileAppender ',这就是我使用它们的原因。

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题1: 我认为这是接近它的错误方法。如果您担心他们可以偶然修改它,那么您有两种选择:

  • 制作日志文件的副本并显示该日志文件。
  • 在您控制的窗口中显示日志文件(即将文本区域设置为只读)。

问题2: “普通”FileAppender将始终写入同一文件,这可能不是您的应用程序偶尔停止的问题,并且您可以在增长过大时删除日志文件。对于长时间运行的应用程序,这不是一个选项:滚动RollingFileAppender将每隔一段时间创建一个新文件(由特定大小或特定时间定义)。这样就可以删除旧的日志文件,永远不会耗尽磁盘空间。

也许您想了解有关appenders here的更多信息。