先贴出代码示例:
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Process.Start();
}
protected override void OnStop()
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
{
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Service:Stop.");
}
} public static class Process
{
public static void Start()
{
ThreadStart start = new ThreadStart(ThreadAction);
Thread th = new Thread(start);
th.IsBackground = true;
th.Start();
}
public static void ThreadAction()
{
while (true)
{
try
{
//do something }
catch (Exception ex)
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
{
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Service:Start.错误" + ex.ToString());
}
}
}
}
}
}问题是:当我在try中执行代码的时候,如果出现错误:比如“远程服务器返回错误: (500) 内部服务器错误。”或者“操作超时”,,他就会不停的记录日志,每秒钟都记录很多很多!!!导致日志文件没几天就变得很大!!!!!!求前辈们指教!!!这个问题怎么解决?????
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Process.Start();
}
protected override void OnStop()
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
{
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Service:Stop.");
}
} public static class Process
{
public static void Start()
{
ThreadStart start = new ThreadStart(ThreadAction);
Thread th = new Thread(start);
th.IsBackground = true;
th.Start();
}
public static void ThreadAction()
{
while (true)
{
try
{
//do something }
catch (Exception ex)
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
{
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Service:Start.错误" + ex.ToString());
}
}
}
}
}
}问题是:当我在try中执行代码的时候,如果出现错误:比如“远程服务器返回错误: (500) 内部服务器错误。”或者“操作超时”,,他就会不停的记录日志,每秒钟都记录很多很多!!!导致日志文件没几天就变得很大!!!!!!求前辈们指教!!!这个问题怎么解决?????
主要是设计上你就没考虑,某个时候别人站点都已经宕机或者你的网络出问题了,你还在死循环继续请求后面的页面?
出错了之后也没个错误恢复机制什么的,不管不顾继续搞
出错了为什么不停下来呢?或者设计一些容错的逻辑,跳过错误数据不去处理不好么?
好吧,刚才没看到这个从你贴的代码看,整个流程是这样的:
1、启动Windows服务
2、服务在启动时开了一个线程
3、这个线程里面无限循环去抓数据,如果抓取失败,则记录失败日志所以呢,失败了你sleep线程是没用的,你需要解决的问题是想办法不要超时!不要超时!!不要超时!!!
数据量比较大,可以分批抓!!!每次抓10000条数据会超时的话,就分10次,每次只抓1000条,还超时的话就分100次,每次抓100条。总之,可以在1分钟内抓回来数据应该就不会超时了吧。
好吧,刚才没看到这个从你贴的代码看,整个流程是这样的:
1、启动Windows服务
2、服务在启动时开了一个线程
3、这个线程里面无限循环去抓数据,如果抓取失败,则记录失败日志所以呢,失败了你sleep线程是没用的,你需要解决的问题是想办法不要超时!不要超时!!不要超时!!!
数据量比较大,可以分批抓!!!每次抓10000条数据会超时的话,就分10次,每次只抓1000条,还超时的话就分100次,每次抓100条。总之,可以在1分钟内抓回来数据应该就不会超时了吧。
谢谢您的耐心回答。这个抓取数据不止是一张表和很多的数据,是多张表,并且在抓取数据的时候还做了许多的业务处理。鄙人水平浅薄,实在想不出好的办法来,我在catch中加了对于超时情况的代码处理,不让它记录超时的log,这样就不会再一秒钟记录那么多错误信息了。没能根本的处理问题,暂时用了windows计划任务处理了。
我有几个思路不知道合适不,
1,不管你什么错误,比如“远程服务器返回错误: (500) 内部服务器错误”,这个字符串你肯定能得到,你把他存在缓存里,自己设定一个机制,比如N分钟之类如果出现了M次,那么就不在记录日志了,只在日志里记录最近一次发生的时间和次数,这样你日志就干净了,而且你也能从日志里得知许多信息。
2,如果你的服务器很重要,那么你不能出现过了一两天去看日志才发现其实已经挂了的情况,那么你可以弄个邮件处理的东西,.net自带的mail就可以,当N分钟之类出现M次的情况后马上给你发邮件,让你立刻知道赶快处理。
3,如果你觉得以上很麻烦不想弄,那么你可以这样做,不要以yyyy-MM-dd HH:mm:ss 的方式命名文件,这样每一秒都是一个文件会很多,你以yyyy-MM-dd命名比如2016-9-28-00,一天之内的日志全部记在里面,并且你要设定大小,当这个文件大小超过某个设定值比如5m,的时候另外新建txt , 比如2016-9-28-01 因为文件大了你打开也麻烦,这样你的日志也就少了。不过我建议你还是采取第一种方式。
我有几个思路不知道合适不,
1,不管你什么错误,比如“远程服务器返回错误: (500) 内部服务器错误”,这个字符串你肯定能得到,你把他存在缓存里,自己设定一个机制,比如N分钟之类如果出现了M次,那么就不在记录日志了,只在日志里记录最近一次发生的时间和次数,这样你日志就干净了,而且你也能从日志里得知许多信息。
2,如果你的服务器很重要,那么你不能出现过了一两天去看日志才发现其实已经挂了的情况,那么你可以弄个邮件处理的东西,.net自带的mail就可以,当N分钟之类出现M次的情况后马上给你发邮件,让你立刻知道赶快处理。
3,如果你觉得以上很麻烦不想弄,那么你可以这样做,不要以yyyy-MM-dd HH:mm:ss 的方式命名文件,这样每一秒都是一个文件会很多,你以yyyy-MM-dd命名比如2016-9-28-00,一天之内的日志全部记在里面,并且你要设定大小,当这个文件大小超过某个设定值比如5m,的时候另外新建txt , 比如2016-9-28-01 因为文件大了你打开也麻烦,这样你的日志也就少了。不过我建议你还是采取第一种方式。
谢谢你的回答。