交替的日志文件

时间:2014-04-27 14:33:53

标签: c# streamwriter logfiles

我正在尝试在c#中编写一个Logfile Writer类。我想做以下操作:我在第一个日志文件中写入我的日志,如果它超过一定的大小,它将写入第二个日志文件。如果第二个日志文件已满,则删除第一个日志文件并再次写入该文件,依此类推。

到目前为止我已经得到了这个:

public class LogfileBuilder
{
    StreamWriter sW;
    const string file1 = "EventLogging1.txt";
    const string file2 = "EventLogging2.txt";
    FileInfo fInfo;
    public void writeLine(string write)
    {
        string usingFile;
        fInfo = new FileInfo(file1);
        long s1 = fInfo.Length;
        if (s1 > 300)
        {
            fInfo = new FileInfo(file2);
            long s2 = fInfo.Length;
            if (s2 > 300)
            {
                File.Create(file1).Close();
                usingFile = file1;
            }
            else
            {
                usingFile = file2;
            }
        }
        else usingFile = file1;


        using (sW = File.AppendText(usingFile))
        {
            sW.WriteLine(write);
        }
    }
}

有人可以帮我完成吗?

2 个答案:

答案 0 :(得分:0)

我认为会是这样的:

public class LogfileBuilder
{       
    private const string DEFAULT_PATH_1 = "EventLogging1.txt";
    private const string DEFAULT_PATH_2 = "EventLogging2.txt";

    private readonly string _filePath1;
    private readonly string _filePath2;
    private readonly long _delimiterSize;

    public LogfileBuilder(long delimiterSize = 300)
    {
        _filePath1 = DEFAULT_PATH_1;
        _filePath2 = DEFAULT_PATH_2;
        _delimiterSize = delimiterSize;
    }

    public LogfileBuilder(string filePath1, string filePath2, long delimiterSize = 300)
    {
        _filePath1 = filePath1;
        _filePath2 = filePath2;
        _delimiterSize = delimiterSize;
    }

    public void Log(string content)
    {           
        //No file1
        if(File.Exists(_filePath1) == false)
        {
            //No file1, file2
            if(File.Exists(_filePath2) == false)
            {
                //Creates/overrides file1
                File.WriteAllText(_filePath1, content);
            }
            //file2, no file1
            else
            {
                var fileInfo = new FileInfo(_filePath2);
                //file2 > delimiter
                if(fileInfo.Length > _delimiterSize)
                {
                    File.Delete(_filePath2);
                    //Creates/overrides file1
                    File.WriteAllText(_filePath1, content);
                }
                //file2 < delimiter
                else
                {
                    File.AppendAllText(_filePath2, content);
                }
            }               
        }
        //file1
        else
        {
            var fileInfo = new FileInfo(_filePath1);
            //file1 > delimiter
            if(fileInfo.Length > _delimiterSize)
            {
                File.Delete(_filePath1);
                //Creates/override filepath2
                File.WriteAllText(_filePath2, content);
            }
            //file1 < delimiter
            else
            {
                File.AppendAllText(_filePath1, content);    
            }
        }
    }
}

答案 1 :(得分:0)

我花了一些时间,但(最后)经过一些更改后,您的代码现在正在按需运行。

public class LogfileBuilder
{
    StreamWriter sW;
    const string file1 = "EventLogging1.txt";
    const string file2 = "EventLogging2.txt";
    FileInfo fInfo;

    // moved this variable out of function to track which file was used during last writing
    string usingFile = null;                  
    public void writeLine(string write)
    {
        fInfo = new FileInfo(file1);
        long s1 = fInfo.Length;
        if (s1 > 300)
        {
            // added below check to delete and re-create the file#1 (of zero bytes)
            if (usingFile == file1)
                File.Create(file2).Close();

            fInfo = new FileInfo(file2);
            long s2 = fInfo.Length;
            if (s2 > 300)
            {
                File.Create(file1).Close();
                usingFile = file1;
            }
            else
            {
                usingFile = file2;
            }
        }
        else 
            usingFile = file1;

        using (sW = File.AppendText(usingFile))
        {
            sW.WriteLine(write);
        }
    }
}
顺便说一下,你应该看看log4net(也是由martin_costello建议的),它有很多功能和很多灵活性。 请参阅:Apache log4net features list