zoukankan      html  css  js  c++  java
  • IIS6.0日志文件分析代码_3线程读取文件到数据库

     IIS6.0日志文件分析代码_3线程读取文件到数据库(已经测试),只是欠缺将日志文件批量入库.定义一个数组.存储文件列表.按顺序读取文件到数据库中就好了.复习了线程操作.数组控制.文件访问,数据库操作等等关键技术.

     //针对批量日志文件处理思路:
       //方法一:单线程单文件处理
       //1.选择日志文件所在目录,将所有的日志文件列表名称,处理结果状态,当前处理状态存入数据表中
       //2.开启单线程日志列表文件数据表中读取文件名,将所有的日志字段名称定义到数组中,按读取行文本文件中日志相关记录行数分段将读取的将对应的全部字段内容写入到数据表中并更新
       //3.循环读取该文件日志数据直到完成,将处理结果写入到数据库中   
       //方法二单线程多文件处理
       //1.选择日志文件目录,遍历目录下所有的日志文件(除开今天的),将所有文件路径写入到数组中
       //2.开启线程循环根据传入参数(单独的日志文件路径)将日志记录写到数据库表中
       //3.线程读取日志文件结束,返回结果变量,继续从数组中获取下一条日志文件数据,循环直到完成全部日志文件的数据读取
       //方法三单线程多文件处理
       //1.打开对话框选择要读取的日志文件,根据所在目录名称的区分不同IIS站点.
       //2.开启单线程依次读取日志文件内容到数据库中
       //3.线程读取完成.停留一段时间后继续读取.直到将所有的日志文件内容写入数据库完成.
       //方法四
       //1.选择日志文件列表,将所有日志文件备份处理成固定格式的文本文件,将文本文件作为数据源,按数据库定义的字段名成读入到数据表中,测试处理日志文件大小3.380M.日志行20434,文件
       //备注:开启线程作用,可以显示当前日志处理的进度,可以防止程序运行时候出现“假死”或者“卡死”现象。
       //预先处理日志文件数据成有效格式的文本文件作用可以减少数组跟数据判断的时间内存支出现象。
      
    //添加数据库文件IO引用
    using System.IO;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    //使用线程操作的引用
    using System.Threading;

    //按钮事件
    private void button6_Click(object sender, System.EventArgs e)
      {
      
      //开始线程下载文件:稳定性能比较好,不出现卡死的情况,线程监督要继续突出显示
       this.button6.Enabled=false;
       IISLogFileClass myClass=new IISLogFileClass();
       Thread myThread= new Thread(new ThreadStart(myClass.ReadFromLogFile));    
       myClass.LogFilePath=@"C:/WINDOWS/system32/LogFiles/W3SVC1/ex070412.log";  
       myThread.Start();
       if(myThread.Join(50000))//主线程等待子线程的停止时间单位:毫秒
        {
         this.textBox2.Text=myClass.LogFilePath;
        this.textBox3.Text=myClass.LineContent.ToString();
        this.textBox4.Text=myClass.LineFile.ToString();
        this.textBox5.Text=myClass.FileLength.ToString();
        }
       this.button6.Enabled=true;
      }

    //定义日志文件处理类.

     public class IISLogFileClass
     { 
      
      public string LogFilePath;//下载文件保存地址
       
      public long FileLength;//定义线程返回传参数
      public int LineSoftware=0;//定义线程返回传参数
      public int LineVersion=0;//定义线程返回传参数
      public int LineDate=0;//定义线程返回传参数
      public int LineFields=0;//定义线程返回传参数
      public int LineContent=0;//定义线程返回传参数
      public int LineFile=0;//定义线程返回传参数

      public void ReadFromLogFile()
       {   
       //针对大日志文件处理思路:
       //1.将所有的日志字段名称定义到数组中,将对应的全部字段内容写入到文本文件中
       //2.将文本文件作为数据源,把所有字段的内容一条一条的作为记录写入到数据库中对应字段里   
       //定义要添加的字段数量
       int totalFieldsLength=0;
       //定义字段下标数组,数据库中的内容必须跟下面的数组中一致
       ArrayList IntLogFieldsArray=new ArrayList();
       try 
       {
        //打开数据库连接
        string strCon = "Initial Catalog='HMMISDATA';Server='192.168.1.250';User ID='XQF';Password='123456';Persist Security Info=True";
        SqlConnection myConn = new SqlConnection ( strCon ) ;      
        myConn.Open();
        DataSet tempDataSet=new DataSet();
        SqlDataAdapter tempAdapter = new SqlDataAdapter("SELECT * FROM IISLogFiledsList WHERE 1=0", myConn);
        SqlCommandBuilder tempBuilder=new SqlCommandBuilder(tempAdapter);   
        tempAdapter.Fill(tempDataSet);
        
        FileStream   fs   =   new   FileStream(LogFilePath,   FileMode.OpenOrCreate,   FileAccess.Read); //打开日志文件
        FileLength=fs.Length;
        StreamReader myStreamReader=new StreamReader(fs);//使用StreamReader类来读取文件
        myStreamReader.BaseStream.Seek(0,SeekOrigin.Begin);//循环从数据流中读取每一行,直到文件的最后一行        
        string strLine=myStreamReader.ReadLine();        
       
        ArrayList MySoftwareArray=new ArrayList();
        ArrayList MyVersionArray=new ArrayList();
        ArrayList MyDateArray=new ArrayList();
        ArrayList MyFieldsArray=new ArrayList();        
                 
        while(strLine!=null)
        {
        
         LineFile+=1;
         if(strLine.Substring(0,10)=="#Software:")
         {
          LineSoftware+=1;
          MySoftwareArray.Add(strLine.Substring(10,strLine.Length-10));
         }
         else
         {
          if(strLine.Substring(0,9)=="#Version:")
          {
           LineVersion+=1;
           MyVersionArray.Add(strLine.Substring(9,strLine.Length-9));
          }
          else
          {
           if(strLine.Substring(0,6)=="#Date:")
           {
            LineDate+=1;
            MyDateArray.Add(strLine.Substring(6,strLine.Length-6));
           }
           else
           {
            if(strLine.Substring(0,8)=="#Fields:")
            {
             LineFields+=1;
             MyFieldsArray.Add(strLine.Substring(9,strLine.Length-9));
             if(LineFields==1)
             {
              //定义要添加的记录字段名称
              string strt=MyFieldsArray[0].ToString();    
              string[] tArray=strt.Split(' '); 
              totalFieldsLength=tArray.Length;
              for(int k=0;k<totalFieldsLength;k++)
              {
               switch(tArray[k].ToString())
               {        
                case "date":IntLogFieldsArray.Add(1);break;     
                case "time":IntLogFieldsArray.Add(2);break;
                case "c-ip":IntLogFieldsArray.Add(3);break;
                case "cs-username":IntLogFieldsArray.Add(4);break;
                case "s-sitename":IntLogFieldsArray.Add(5);break;

                case "s-computername":IntLogFieldsArray.Add(6);break;
                case "s-ip":IntLogFieldsArray.Add(7);break;
                case "s-port":IntLogFieldsArray.Add(8);break;        
                case "cs-method":IntLogFieldsArray.Add(9);break;
                case "cs-uri-stem":IntLogFieldsArray.Add(10);break;
                case "cs-uri-query":IntLogFieldsArray.Add(11);break;
                case "sc-status":IntLogFieldsArray.Add(12);break;
                case "sc-substatus":IntLogFieldsArray.Add(13);break;
                case "sc-win32-status":IntLogFieldsArray.Add(14);break;
                  
                case "sc-bytes":IntLogFieldsArray.Add(15);break;
                case "cs-bytes":IntLogFieldsArray.Add(16);break;
                case "cs-version":IntLogFieldsArray.Add(17);break;
                case "cs-timetaken":IntLogFieldsArray.Add(18);break;
                case "cs-host":IntLogFieldsArray.Add(19);break;
                case "cs(User-Agent)":IntLogFieldsArray.Add(20);break;
                case "cs-cookie":IntLogFieldsArray.Add(21);break;
                case "cs-referer":IntLogFieldsArray.Add(22);break; 
               }       
              }
             }
            }
            else
            {
             LineContent+=1;
             string[] currentContentArray=strLine.Split(' ');
             //循环将所有日志记录写入数据库中                 
             DataRow tempDataRow = tempDataSet.Tables[0].NewRow();//定义新记录行      
             for(int n=0;n<totalFieldsLength-1;n++)
             {
              tempDataRow[Int32.Parse(IntLogFieldsArray[n].ToString())]=currentContentArray[n];
              //Console.WriteLine(IntLogFieldsArray[n].ToString()+":"+LogArrayList[m,n]);
             }
             tempDataSet.Tables[0].Rows.Add(tempDataRow);//添加新记录行
            }
           }
          }
         }
         strLine=myStreamReader.ReadLine();     
        }
        myStreamReader.Close();//关闭此StreamReader对象               
        fs.Close();      
        tempAdapter.Update(tempDataSet);
        myConn.Close ( ) ;//关闭连接   
        // 清除掉所有数组内容
        MySoftwareArray=null;
        MyVersionArray=null;
        MyDateArray=null;
        MyFieldsArray=null;       
       }
       catch(Exception ex)
       {
        MessageBox.Show(ex.Message,"错误");
       }
      } 
      //定义类代码结束

  • 相关阅读:
    Effective C# Item6:明辨值类型和引用类型的使用场合
    Effective C# Item15:利用using和try/finally语句来清理资源
    Effective C# Item12:变量初始化器优于赋值语句
    Effective C# Item19:定义并实现接口优于继承类型
    Effective C# Item14:利用构造器链
    Effective C# Item18:实现标准Dispose模式
    Effective C# Item17:尽量减少装箱和拆箱
    Effective C# Item7:将值类型尽可能实现为具有常量性和原子性的类型
    Effective C# Item10:理解GetHashCode()方法的缺陷
    Effective C# Item20:明辨接口实现和虚方法重写
  • 原文地址:https://www.cnblogs.com/xqf222/p/3306888.html
Copyright © 2011-2022 走看看