1

Apache ログを読み込んで処理しようとしています。そのように私を参照するログ行を含む文字列分割関数を使用します。それらの行を削除したい。以下のコードは、私が持っていることを示しています。「127.0.0.1」のみが削除されますが、すべての「192.168.1.x」行が表示されます。

すべての分割文字列を削除するにはどうすればよいですか?

        public void GetTheLog()
    {
        string path = "c:\\program files\\Zend\\apache2\\logs\\access.log";
        string path2 = @"access.log";
        int pos;
        bool goodline = true;

        string skipIPs = "127.0.0.1;192.168.1.100;192.168.1.101;192.168.1.106;67.240.13.70";
        char[] splitchar = { ';' };
        string[] wordarray = skipIPs.Split(splitchar);
        FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        StreamReader reader = new StreamReader(fs);
        TextWriter tw = new StreamWriter(path2);

        while (!reader.EndOfStream)
        {
            string line = reader.ReadLine();

            // initialize goodline for each line of reader result
            goodline = true;
            for (j = 0; j < wordarray.Length; j++)
            {
                pos = -10;
                srch = wordarray[j];
                ln = line.Substring(0,srch.Length);
                pos = ln.IndexOf(srch);
                if (pos >= 0) goodline = false;
            }
            if (goodline == true)
            {
                tw.WriteLine(line);
                listBox2.Items.Add(line);
            }
        }

        // Clean up
        reader.Close();
        fs.Close();
        listBox1.Items.Add(path2);
        tw.Close();
    }
4

2 に答える 2

1
var logPath = @"c:\program files\Zend\apache2\logs\access.log";
var skipIPs = "127.0.0.1;192.168.1.100;192.168.1.101;192.168.1.106;67.240.13.70";
var filters = skipIPs.Split(';');
var goodlines = File.ReadLines(logPath)
                    .Where(line => !filters.Any(f => line.Contains(f)));

その後、次のことができます

File.WriteAllLines(@"access.log", goodlines);   

また、行をリストボックスにダンプしているようにも見えます

listBox2.Items.AddRange(goodlines.Select(line=> new ListItem(line)).ToArray());

また、あなたskipIPsは単なる静的文字列であるため、少しリファクタリングして行うことができます

var filters = new []{"127.0.0.1","192.168.1.100","192.168.1.101",...};
于 2012-12-24T02:51:20.877 に答える
0

arrrrrr din 欲しいものを手に入れよう...

現在のファイルからskipIPsに存在するすべてのIPを削除したい場合は、試してみましょう。

次に、単に使用できます....

    if(ln==srch)
    {
     goodline = false;
    }

それ以外の

    pos = ln.IndexOf(srch);
    if (pos >= 0) goodline = false;

あなたのforループの中に。

それがあなたを困惑させることを願っています... :)

于 2012-12-24T06:30:26.990 に答える