我正在尝试在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);
}
}
}
有人可以帮我完成吗?
答案 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