151126 LoggableStream ( 입출력이 로깅되는 스트림 클래스 )
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");
}| 이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요. | 
댓글
댓글 쓰기