【问题标题】:Good ways to limit text log file限制文本日志文件的好方法
【发布时间】:2013-11-22 21:18:27
【问题描述】:

我有一个 winForm 应用程序,其中有一个用于记录目的的文本文件。我想将其大小限制为 10 MB,以便如果超过此限制并写入新数据,则删除文本文件中最旧的数据以为新数据腾出空间。有什么有用的建议吗?

【问题讨论】:

标签: c# text-files


【解决方案1】:

使用一些提供滚动日志文件功能的日志框架(我建议NLoglog4net,两者都可以从 NuGet 获得)。

例如使用 log4net,您可以使用以下配置将日志文件大小限制为 10Mb

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="log.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level %logger - %message%newline" />
    </layout>
</appender>

NLog 配置看起来像

<target xsi:type="File"
      name="RollingFileAppender"
      layout="${verbose}"        
      archiveAboveSize="10000000"
      maxArchiveFiles="10"
      archiveFileName="${basedir}/archives/log.{#####}.txt"
      archiveNumbering="Sequence"        
      fileName="log.txt" />

【讨论】:

  • 感谢您的回复。是否有任何有用的资源指导如何将此框架与您当前的 winForm 应用程序集成。
  • @user2968369 只需添加对日志框架的引用(通过 NuGet),然后为框架添加配置(在 app.config 或单独的配置文件中),在应用程序中检索记录器并写入日志See NLog Tuturial
【解决方案2】:

我会使用 log4net 之类的日志库。 RollingFileAppender 正是您想要的。

【讨论】:

    【解决方案3】:

    在写之前检查文件大小。这里有一个教程

    http://www.dotnetperls.com/fileinfo-length

    如果您想要更多的东西,请尝试 NLog 或 log4net 这正如其他人建议的那样,这真的很有帮助

    【讨论】:

      【解决方案4】:

      如果您不想使用日志框架(尽管您可能确实应该使用),那么您可以执行以下操作:

      • 每次写入时(或其他定期)查看文件的长度
      • 当它超过限制时,执行修剪操作 - 这将涉及从文件的开头开始,然后遍历文件读取行,直到您读取足够的数据来修剪。找到该位置后,您有几种方法可以从文件开头删除空间,尽管它们都不是很吸引人,除非您乐于将整个文件加载到内存中,这对于当今 10MB 的文件来说并非不合理.

      要实现的关键是从文件中删除比恢复到限制下所需的最小值更多的内容 - 例如让文件增长到 11MB,然后将其修剪回 10MB。然后,您只会在每 1MB 的日志记录后运行一个修剪周期。如果您对此很幼稚,那么您会发现自己对每条记录的行都进行了修剪,这将是荒谬的。

      但实际上,已经存在的用于 .NET 的优秀日志框架是一种更好的方式来做到这一点 - 例如,它们将诸如异步日志记录和键入滚动一个月的每日日志。

      【讨论】:

      • 嗯,很有趣。我们如何在文件开头执行修剪操作。就像我如何从文件开头读取 1 MB 数据一样。删除它以再次使我的文件大小恢复到 10 MB?
      • 将涉及某种形式的复制 - 将数据复制到同一文件中的较早点,或复制到另一个文件,然后可能调用 File.Replace。您也许可以考虑使用 File.ReadLines,然后调用“Skip()”来删除一定数量的行。不幸的是,从文件中删除空间既慢又乏味,这就是大多数数据库从压缩文件中拆分删除内容的原因。
      • 嗯,是的,我注意到没有什么像 File.DeleteLine
      猜你喜欢
      • 2014-08-01
      • 2012-07-22
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多