先贴出代码示例:
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.   

    做个计划任务定时删除log
      

  2.   

    学会用log4net 这个组件吧 少年。  这个组件可以覆盖前面的错误日志。 你这种记录方法,硬盘都给你沾满了。
      

  3.   

    谁让你没事写什么whlie(true)
    主要是设计上你就没考虑,某个时候别人站点都已经宕机或者你的网络出问题了,你还在死循环继续请求后面的页面?
    出错了之后也没个错误恢复机制什么的,不管不顾继续搞
      

  4.   

    对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?
      

  5.   

    对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?你如果懒得考虑“设计”,懒得规划蓝图,那就不要自己“设计”程序。找个单位,让单位管理自己,领导让你写什么就写几条语句。
      

  6.   

    对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?你如果懒得考虑“设计”,懒得规划蓝图,那就不要自己“设计”程序。找个单位,让单位管理自己,领导让你写什么就写几条语句。你厉害……你站在海拔很高的山顶对山脚下的人喊怎么上来,山脚下的人听得到么!
      

  7.   

    换个号。对于这段代码有些地方不是很明白,我自己在写好之后安装服务后测试,在catch中写入错误日志,然后在catch中让线程sleep,测试时是sleep十秒,我看是可行的,日志就是在每十秒记了一条错误信息,可是在正式环境下,catch中线程sleep就不好用了,从日志中看,有时候可以,有时候不行。在try中所做的是从另一个服务器中抓取数据,由于数据量较多,有时候会出现超时的情况,winsows服务每五分钟执行一次,超时的时候代码会进到catch,所以我没让线程在catch中sleep, 代码会继续循环进入try,直到成功抓到数据,线程sleep……五分钟后再次执行。如果我去掉循环,可能执行一次,出现错误就等待下次了,而数据没取到下次再次失败,还是没取到……这个情况怎么设计才好?
      

  8.   

    用log4net这个东西,很简单,很好用。。
      

  9.   

    楼主这个写法真是粗暴!既然这么粗暴,那么就让硬盘默默地挨操吧,log4net也拯救不了它的。
    出错了为什么不停下来呢?或者设计一些容错的逻辑,跳过错误数据不去处理不好么?
      

  10.   


    好吧,刚才没看到这个从你贴的代码看,整个流程是这样的:
    1、启动Windows服务
    2、服务在启动时开了一个线程
    3、这个线程里面无限循环去抓数据,如果抓取失败,则记录失败日志所以呢,失败了你sleep线程是没用的,你需要解决的问题是想办法不要超时!不要超时!!不要超时!!!
    数据量比较大,可以分批抓!!!每次抓10000条数据会超时的话,就分10次,每次只抓1000条,还超时的话就分100次,每次抓100条。总之,可以在1分钟内抓回来数据应该就不会超时了吧。
      

  11.   


    好吧,刚才没看到这个从你贴的代码看,整个流程是这样的:
    1、启动Windows服务
    2、服务在启动时开了一个线程
    3、这个线程里面无限循环去抓数据,如果抓取失败,则记录失败日志所以呢,失败了你sleep线程是没用的,你需要解决的问题是想办法不要超时!不要超时!!不要超时!!!
    数据量比较大,可以分批抓!!!每次抓10000条数据会超时的话,就分10次,每次只抓1000条,还超时的话就分100次,每次抓100条。总之,可以在1分钟内抓回来数据应该就不会超时了吧。
    谢谢您的耐心回答。这个抓取数据不止是一张表和很多的数据,是多张表,并且在抓取数据的时候还做了许多的业务处理。鄙人水平浅薄,实在想不出好的办法来,我在catch中加了对于超时情况的代码处理,不让它记录超时的log,这样就不会再一秒钟记录那么多错误信息了。没能根本的处理问题,暂时用了windows计划任务处理了。
      

  12.   

    对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?你如果懒得考虑“设计”,懒得规划蓝图,那就不要自己“设计”程序。找个单位,让单位管理自己,领导让你写什么就写几条语句。你厉害……你站在海拔很高的山顶对山脚下的人喊怎么上来,山脚下的人听得到么!别理那个人,他每个回复都是这样,从来不告诉提问者应该怎么做,或者教他为什么那么做,从来都是一幅训导人的口气。
    我有几个思路不知道合适不,
    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 因为文件大了你打开也麻烦,这样你的日志也就少了。不过我建议你还是采取第一种方式。
      

  13.   

    对这个东西本来就不会写,这段代码是在网上找的,我在catch中让线程sleep,为什么有时候可用,有时候不可用呢?你如果懒得考虑“设计”,懒得规划蓝图,那就不要自己“设计”程序。找个单位,让单位管理自己,领导让你写什么就写几条语句。你厉害……你站在海拔很高的山顶对山脚下的人喊怎么上来,山脚下的人听得到么!别理那个人,他每个回复都是这样,从来不告诉提问者应该怎么做,或者教他为什么那么做,从来都是一幅训导人的口气。
    我有几个思路不知道合适不,
    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 因为文件大了你打开也麻烦,这样你的日志也就少了。不过我建议你还是采取第一种方式。
    谢谢你的回答。
      

  14.   

    希望大神们不要以ZB的姿态的去回答问题,你不需要ZB我也知道你牛逼。就不能放低姿态耐心的回答一下么