151126 LoggableStream ( 입출력이 로깅되는 스트림 클래스 )

Edit

151126 LoggableStream ( 입출력이 로깅되는 스트림 클래스 )

황현동 노트북 c#
네트워크 스트림의 입출력을 전체 로그로 찍고 싶은데, 매 줄마다 Trace.Information("hello..."); 하면 모양빠지니깐 좀 모양 좋게 코딩해 볼수는 없을까 해서 만들었다.
스트림 입출력 시에 버퍼를 조금씩 인코딩 해서 로그 찍는 기능이 있다. 아이디어는 스택오버플로우 통해서 얻어서 해결한 것.
public class LoggableStream : Stream
{
    private Stream _stream;
    private Encoding _textEncoding;



    public LoggableStream(Stream stream, Encoding textEncoding)
    {
        _stream = stream;
        _textEncoding = textEncoding;
    }

    public override bool CanRead
    {
        get
        {
            return _stream.CanRead;
        }
    }

    public override bool CanSeek
    {
        get
        {
            return _stream.CanSeek;
        }
    }

    public override bool CanWrite
    {
        get
        {
            return _stream.CanWrite;
        }
    }

    public override long Length
    {
        get
        {
            return _stream.Length;
        }
    }

    public override long Position
    {
        get
        {
            return _stream.Position;
        }
        set
        {
            _stream.Position = Position;
        }
    }

    public override void Flush()
    {
        _stream.Flush();
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        var result = _stream.Read(buffer, offset, count);

        try
        {
            var log = this._textEncoding.GetString(buffer, offset, count);
            Trace.TraceInformation("READ : " + log);
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.ToString());
        }

        return result;
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        var result = _stream.Seek(offset, origin);
        return result;
    }

    public override void SetLength(long value)
    {
        _stream.SetLength(value);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        _stream.Write(buffer, offset, count);

        try
        {
            var log = this._textEncoding.GetString(buffer, offset, count);
            Trace.TraceInformation("WRIT : " + log);
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.ToString());
        }
    }
}
using (var netStream = _controlClient.GetStream())
using (var sr = new StreamReader(new LoggableStream(netStream, Encoding.UTF8)))
using (var sw = new StreamWriter(new LoggableStream(netStream, Encoding.UTF8)))
{
    var readLine = sr.ReadLine();
    sw.WriteLine("hello");
}
%23%20151126%20LoggableStream%20%28%20%uC785%uCD9C%uB825%uC774%20%uB85C%uAE45%uB418%uB294%20%uC2A4%uD2B8%uB9BC%20%uD074%uB798%uC2A4%20%29%0A%0A@%28%uD669%uD604%uB3D9%20%uB178%uD2B8%uBD81%29%5Bc%23%5D%0A%0A%uB124%uD2B8%uC6CC%uD06C%20%uC2A4%uD2B8%uB9BC%uC758%20%uC785%uCD9C%uB825%uC744%20%uC804%uCCB4%20%uB85C%uADF8%uB85C%20%uCC0D%uACE0%20%uC2F6%uC740%uB370%2C%20%uB9E4%20%uC904%uB9C8%uB2E4%20%60Trace.Information%28%22hello...%22%29%3B%60%20%uD558%uBA74%20%uBAA8%uC591%uBE60%uC9C0%uB2C8%uAE50%20%uC880%20%uBAA8%uC591%20%uC88B%uAC8C%20%uCF54%uB529%uD574%20%uBCFC%uC218%uB294%20%uC5C6%uC744%uAE4C%20%uD574%uC11C%20%uB9CC%uB4E4%uC5C8%uB2E4.%0A%0A%uC2A4%uD2B8%uB9BC%20%uC785%uCD9C%uB825%20%uC2DC%uC5D0%20%uBC84%uD37C%uB97C%20%uC870%uAE08%uC529%20%uC778%uCF54%uB529%20%uD574%uC11C%20%uB85C%uADF8%20%uCC0D%uB294%20%uAE30%uB2A5%uC774%20%uC788%uB2E4.%20%uC544%uC774%uB514%uC5B4%uB294%20%uC2A4%uD0DD%uC624%uBC84%uD50C%uB85C%uC6B0%20%uD1B5%uD574%uC11C%20%uC5BB%uC5B4%uC11C%20%uD574%uACB0%uD55C%20%uAC83.%0A%0Ahttp%3A//stackoverflow.com/questions/33935411/how-can-i-set-streamwriters-source-as-multiple-in-net/33938877%0A%0A%60%60%60%0Apublic%20class%20LoggableStream%20%3A%20Stream%0A%7B%0A%20%20%20%20private%20Stream%20_stream%3B%0A%20%20%20%20private%20Encoding%20_textEncoding%3B%0A%0A%0A%0A%20%20%20%20public%20LoggableStream%28Stream%20stream%2C%20Encoding%20textEncoding%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20_stream%20%3D%20stream%3B%0A%20%20%20%20%20%20%20%20_textEncoding%20%3D%20textEncoding%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20bool%20CanRead%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20get%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20_stream.CanRead%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20bool%20CanSeek%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20get%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20_stream.CanSeek%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20bool%20CanWrite%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20get%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20_stream.CanWrite%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20long%20Length%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20get%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20_stream.Length%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20long%20Position%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20get%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20_stream.Position%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20set%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20_stream.Position%20%3D%20Position%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20void%20Flush%28%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20_stream.Flush%28%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20int%20Read%28byte%5B%5D%20buffer%2C%20int%20offset%2C%20int%20count%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20var%20result%20%3D%20_stream.Read%28buffer%2C%20offset%2C%20count%29%3B%0A%0A%20%20%20%20%20%20%20%20try%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20log%20%3D%20this._textEncoding.GetString%28buffer%2C%20offset%2C%20count%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Trace.TraceInformation%28%22READ%20%3A%20%22%20+%20log%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20catch%20%28Exception%20ex%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Trace.TraceError%28ex.ToString%28%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20long%20Seek%28long%20offset%2C%20SeekOrigin%20origin%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20var%20result%20%3D%20_stream.Seek%28offset%2C%20origin%29%3B%0A%20%20%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20void%20SetLength%28long%20value%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20_stream.SetLength%28value%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20override%20void%20Write%28byte%5B%5D%20buffer%2C%20int%20offset%2C%20int%20count%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20_stream.Write%28buffer%2C%20offset%2C%20count%29%3B%0A%0A%20%20%20%20%20%20%20%20try%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20log%20%3D%20this._textEncoding.GetString%28buffer%2C%20offset%2C%20count%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Trace.TraceInformation%28%22WRIT%20%3A%20%22%20+%20log%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20catch%20%28Exception%20ex%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Trace.TraceError%28ex.ToString%28%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%0A%60%60%60%0Ausing%20%28var%20netStream%20%3D%20_controlClient.GetStream%28%29%29%0Ausing%20%28var%20sr%20%3D%20new%20StreamReader%28new%20LoggableStream%28netStream%2C%20Encoding.UTF8%29%29%29%0Ausing%20%28var%20sw%20%3D%20new%20StreamWriter%28new%20LoggableStream%28netStream%2C%20Encoding.UTF8%29%29%29%0A%7B%0A%20%20%20%20var%20readLine%20%3D%20sr.ReadLine%28%29%3B%0A%20%20%20%20sw.WriteLine%28%22hello%22%29%3B%0A%7D%0A%60%60%60

이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

댓글