C# 使用windows服务进行Csvhelper写入
我正在使用csvhelper和windows服务,该服务不间断运行。我想创建一个新的csv日志文件,只放置一次头值,直到文件大小增长到1000 kb,然后创建另一个新文件,使文件大小增长过大。此时,csv文件在windows服务启动时创建一次,但每次写入时都会重复头文件值 我们是否在csv助手中有一些配置属性来标记文件大小? 请看一下代码,并建议是否可以在.NET4.0中高效地完成此操作。 Windows服务代码C# 使用windows服务进行Csvhelper写入,c#,.net,C#,.net,我正在使用csvhelper和windows服务,该服务不间断运行。我想创建一个新的csv日志文件,只放置一次头值,直到文件大小增长到1000 kb,然后创建另一个新文件,使文件大小增长过大。此时,csv文件在windows服务启动时创建一次,但每次写入时都会重复头文件值 我们是否在csv助手中有一些配置属性来标记文件大小? 请看一下代码,并建议是否可以在.NET4.0中高效地完成此操作。 Windows服务代码 public partial class Service1 : ServiceBa
public partial class Service1 : ServiceBase
{
private Thread executeThread;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
Thread.Sleep(30000);
executeThread = new Thread(new ThreadStart(Execute));
executeThread.Start();
}
catch (Exception e)
{
Library.LogData("Error : " + DateTime.UtcNow + " " + e.Message);
OnStop();
}
}
protected override void OnStop()
{
try
{
Library.LogData("Stopped: " + DateTime.UtcNow);
executeThread.Abort();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
public void Execute()
{
try
{
Library.LogData("Started");
while (true)
{
Library.LogData("Logging Execute" + DateTime.UtcNow);
Thread.Sleep(5000);
}
}
catch (Exception e)
{
Library.LogData("Error : " + DateTime.UtcNow + " " + e.Message);
OnStop();
}
Library.LogData("Out of Execute" + DateTime.UtcNow);
}
}
windows服务调用的日志记录代码
public static class Library
{
public static void LogData(string Message)
{
StreamWriter sw = null;
GetData getData = new GetData();
var dataClasslist = new List<DataClass>
{
new DataClass {}
};
try
{
dataClasslist = getData.ReadData();
using (sw = new StreamWriter("E:\\DataLogs\\LogFile.csv", true))
using (var csv = new CsvWriter(sw))
{
csv.Configuration.RegisterClassMap<DataClassMap>();
csv.WriteHeader<DataClass>();
csv.Configuration.TrimHeaders = true;
csv.Configuration.HasHeaderRecord = false;
csv.WriteRecords(dataClasslist);
sw.Flush();
sw.Close();
}
}
catch (Exception e)
{
var err = new StreamWriter("E:\\DataLogs\\Errors", true);
err.WriteLine(DateTime.Now.ToString() + ": " + e.Message.ToString());
err.Flush();
err.Close();
}
}
}
public partial class Service1 : ServiceBase
{
private Thread executeThread;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
Thread.Sleep(10000);
executeThread = new Thread(new ThreadStart(Execute));
executeThread.Start();
}
catch (Exception e)
{
var err = new StreamWriter("E:\\DataLogs\\Errors", true);
err.WriteLine(DateTime.Now.ToString() + " OnStart: " + e.Message.ToString());
err.Flush();
err.Close();
OnStop();
}
}
protected override void OnStop()
{
try
{
executeThread.Abort();
}
catch (Exception e)
{
var err = new StreamWriter("E:\\DataLogs\\Errors", true);
err.WriteLine(DateTime.Now.ToString() + "OnStop exception: " + e.Message.ToString());
err.Flush();
err.Close();
}
}
public void Execute()
{
try
{
StreamWriter sw = null;
string FileNameAndPath = null;
FileNameAndPath = "E:\\DataLogs\\LogFile" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv";
using (sw = new StreamWriter(FileNameAndPath, true))
{
sw.WriteLine("TimeStamp " + "," + "col1" + "," + "col2" + "," + "col3"
+ "," + "col4" + "," + "col5" + "," + "col6" + ","
+ "col8" + "," + "col9" + "," + "col7" + "," + "col10");
sw.Flush();
sw.Close();
}
while (true)
{
Library.LogData(FileNameAndPath);
Thread.Sleep(5000);
}
}
catch (Exception e)
{
var err = new StreamWriter("E:\\DataLogs\\Errors", true);
err.WriteLine(DateTime.Now.ToString() + " Execute: " + e.Message.ToString());
err.Flush();
err.Close();
OnStop();
}
}
public void TestInConsole(string[] args)
{
Console.WriteLine("Starting.....");
this.OnStart(args);
}
公共静态类库
{
公共静态无效日志数据(字符串消息)
{
StreamWriter sw=null;
GetData GetData=新建GetData();
var dataClasslist=新列表
{
新数据类{}
};
尝试
{
dataClasslist=getData.ReadData();
使用(sw=newstreamwriter(“E:\\DataLogs\\LogFile.csv”,true))
使用(var csv=新csv编写器(sw))
{
csv.Configuration.RegisterClassMap();
csv.WriteHeader();
csv.Configuration.TrimHeaders=true;
csv.Configuration.HasHeaderRecord=false;
csv.WriterRecords(数据类列表);
sw.Flush();
sw.Close();
}
}
捕获(例外e)
{
var err=new StreamWriter(“E:\\DataLogs\\Errors”,true);
err.WriteLine(DateTime.Now.ToString()+”:“+e.Message.ToString());
err.Flush();
err.Close();
}
}
}
主windows服务
public static class Library
{
public static void LogData(string Message)
{
StreamWriter sw = null;
GetData getData = new GetData();
var dataClasslist = new List<DataClass>
{
new DataClass {}
};
try
{
dataClasslist = getData.ReadData();
using (sw = new StreamWriter("E:\\DataLogs\\LogFile.csv", true))
using (var csv = new CsvWriter(sw))
{
csv.Configuration.RegisterClassMap<DataClassMap>();
csv.WriteHeader<DataClass>();
csv.Configuration.TrimHeaders = true;
csv.Configuration.HasHeaderRecord = false;
csv.WriteRecords(dataClasslist);
sw.Flush();
sw.Close();
}
}
catch (Exception e)
{
var err = new StreamWriter("E:\\DataLogs\\Errors", true);
err.WriteLine(DateTime.Now.ToString() + ": " + e.Message.ToString());
err.Flush();
err.Close();
}
}
}
public partial class Service1 : ServiceBase
{
private Thread executeThread;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
Thread.Sleep(10000);
executeThread = new Thread(new ThreadStart(Execute));
executeThread.Start();
}
catch (Exception e)
{
var err = new StreamWriter("E:\\DataLogs\\Errors", true);
err.WriteLine(DateTime.Now.ToString() + " OnStart: " + e.Message.ToString());
err.Flush();
err.Close();
OnStop();
}
}
protected override void OnStop()
{
try
{
executeThread.Abort();
}
catch (Exception e)
{
var err = new StreamWriter("E:\\DataLogs\\Errors", true);
err.WriteLine(DateTime.Now.ToString() + "OnStop exception: " + e.Message.ToString());
err.Flush();
err.Close();
}
}
public void Execute()
{
try
{
StreamWriter sw = null;
string FileNameAndPath = null;
FileNameAndPath = "E:\\DataLogs\\LogFile" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv";
using (sw = new StreamWriter(FileNameAndPath, true))
{
sw.WriteLine("TimeStamp " + "," + "col1" + "," + "col2" + "," + "col3"
+ "," + "col4" + "," + "col5" + "," + "col6" + ","
+ "col8" + "," + "col9" + "," + "col7" + "," + "col10");
sw.Flush();
sw.Close();
}
while (true)
{
Library.LogData(FileNameAndPath);
Thread.Sleep(5000);
}
}
catch (Exception e)
{
var err = new StreamWriter("E:\\DataLogs\\Errors", true);
err.WriteLine(DateTime.Now.ToString() + " Execute: " + e.Message.ToString());
err.Flush();
err.Close();
OnStop();
}
}
public void TestInConsole(string[] args)
{
Console.WriteLine("Starting.....");
this.OnStart(args);
}
所以,一旦文件达到100kb,就会调用OnExecute,并且新文件中只会写入一次头文件
public static class Library
{
public static void LogData(string FileNameAndPath)
{
StreamWriter sw = null;
GetData getData = new GetData();
var dataClasslist = new List<DataClass>
{
new DataClass {}
};
try
{
//System.Diagnostics.Debugger.Break();
dataClasslist = getData.ReadData();
//Create a file seperately
using (sw = new StreamWriter(FileNameAndPath, true))
using (var csv = new CsvWriter(sw))
{
csv.Configuration.RegisterClassMap<DataClassMap>();
//csv.WriteHeader<DataClass>();
csv.Configuration.TrimHeaders = true;
csv.Configuration.HasHeaderRecord = false;
csv.WriteRecords(dataClasslist);
sw.Flush();
sw.Close();
}
var FileSize = new FileInfo(FileNameAndPath);
//for each 1000 kb
if (FileSize.Length >= 1e+6)
{
//go back to the start to create a new file and column headers
Service1 serive1 = new Service1();
serive1.Execute();
}
}
catch (Exception e)
{
var err = new StreamWriter("E:\\DataLogs\\Errors", true);
err.WriteLine(DateTime.Now.ToString() + " LogData: " + e.Message.ToString());
err.Flush();
err.Close();
}
}
}
公共静态类库
{
公共静态void日志数据(字符串FileNameAndPath)
{
StreamWriter sw=null;
GetData GetData=新建GetData();
var dataClasslist=新列表
{
新数据类{}
};
尝试
{
//System.Diagnostics.Debugger.Break();
dataClasslist=getData.ReadData();
//单独创建一个文件
使用(sw=newstreamwriter(FileNameAndPath,true))
使用(var csv=新csv编写器(sw))
{
csv.Configuration.RegisterClassMap();
//csv.WriteHeader();
csv.Configuration.TrimHeaders=true;
csv.Configuration.HasHeaderRecord=false;
csv.WriterRecords(数据类列表);
sw.Flush();
sw.Close();
}
var FileSize=newfileinfo(FileNameAndPath);
//每1000 kb
如果(FileSize.Length>=1e+6)
{
//返回开始创建新的文件和列标题
Service1 serive1=新Service1();
serive1.Execute();
}
}
捕获(例外e)
{
var err=new StreamWriter(“E:\\DataLogs\\Errors”,true);
err.WriteLine(DateTime.Now.ToString()+“LogData:”+e.Message.ToString());
err.Flush();
err.Close();
}
}
}
我欢迎您的建议,请告诉我您是否可以找到更好的方法来解决此问题。您能否检查成为Windows服务的一部分是否对问题的发生很重要?听起来很奇怪,如果你需要滚动日志,你在简单的情况下看不到它(比如基本控制台应用),我认为最好切换到一些也支持登录到CSV的日志库(比如NLog)我想创建一个新的csv日志文件,只放置一次头值,直到文件大小增长到1000 kb,然后创建另一个新文件,即使我使用console app或wpf,它会有什么不同。问题是,我要创建一个日志文件,在创建文件时,头只放入一次。Col1header、Col1header、Col1header、Col1headerColheader1、Colheader2、Colheader3----------------------value1、value2、value3 value1、value2、value3文件大小达到1000kb时创建一个新文件。Colheader1,Colheader2,Colheader3--------------------值1,值2,值3值1,值2,值3