如何有效维护日志文件?

时间:2018-08-13 19:38:25

标签: c# logging

当前,我有一个.txt文件,该文件具有执行数据库中的“选择”所花费的时间,执行时间以及检索的行数。我想做的是删除早于x日期生成的日志。

附加到.txt的代码:

public void LogSQL(string rowsSQL, float timeSQL, string stringSQL)
{
    System.IO.StreamWriter sw = System.IO.File.AppendText(pathTxt() + "LogsSQL.txt");

    try
    {
        string x = System.String.Format("{0} - SQL STATEMENT: {1}{2} Number of Rows: {3}{4} Process Time: {5} seconds {6}--------------------------------------------------------------------------------------", System.DateTime.Now, stringSQL, Environment.NewLine, rowsSQL, Environment.NewLine, timeSQL, Environment.NewLine);
        sw.WriteLine(x);
    }
    finally
    {
        sw.Close();
    }
}

1 个答案:

答案 0 :(得分:0)

没有简单的出路。唯一可能的解决方案是使用临时名称复制日志文件,将其打开并解析每一行以查找日期戳。如果日期较早,则某个截止日期将丢弃该行,否则将其写入另一个临时文件中。完成后,复制新文件以覆盖当前文件(当然,如果有多个线程写入同一个文件,则场景会复杂得多)

但是,我建议您对实际代码进行简单的更改,使您可以将日志写入名称基于当前日期的不同文件中。

public void LogSQL(string rowsSQL, float timeSQL, string stringSQL)
{
    string logFile = Path.Combine(pathTxt(), $"LogsSQL-{DateTime.Today.ToString("yyyyMMdd"}).txt")
    using(System.IO.StreamWriter sw = System.IO.File.AppendText(logFile))
    {
        string x = System.String.Format(.......);
        sw.WriteLine(x);
    }
}

通过这种方式,您将当天的所有日志写入同一文件,并将第二天的日志写入另一个文件。此时,在特定日期之前删除日志只是删除匹配文件的问题

public void RemoveLogs(DateTime cutOff)
{
    foreach (string s in Directory.EnumerateFiles(@"e:\temp"))
    {
        int pos = s.LastIndexOf("-");
        if (pos != -1)
        {
            if (pos + 9 < s.Length)
            {
                string date = s.Substring(pos + 1, 8);
                if (DateTime.TryParseExact(date, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateFile))
                {
                    if(dateFile < cutOff)
                        File.Delete(s);
                }
            }
        }
    }
}