English 中文(简体)
• 如何将单一文本内容输入网络的多种产出?
原标题:How To Split a Single TextWriter into Multiple Outputs in .NET?
  • 时间:2012-01-11 17:12:38
  •  标签:
  • c#
  • stream
  • io

我从我的C#代码中提过一个带有以下头盔的方法的APIC。

public void ExternalFactory.SetOut(TextWriter outputStream)  

I typically call this method like

ExternalFactory.SetOut(Console.Out) 

to just have the API write all of its information to the Console. However, I would also like to store this information in a more permanent place such as a text file in addition to being written to the Console.

我的第一位猜测是,我需要创建某种客户文本,把溪流分开,向康塞洛岛派出一个客户,一个寄给精理商。 这里的正确做法是什么?

问题回答

不是在汇编和首先使用之外进行测试的,而是可以拯救某个人。 放弃已经存在。

/// <summary>
/// Spreads data out to multiple text writers.
/// </summary>
class TextWriterMulti : System.IO.TextWriter
{
    private System.Collections.Generic.List<System.IO.TextWriter> writers = new System.Collections.Generic.List<System.IO.TextWriter>();
    private System.IFormatProvider formatProvider = null;
    private System.Text.Encoding encoding = null;

    #region TextWriter Properties
    public override System.IFormatProvider FormatProvider
    {
        get
        {
            System.IFormatProvider formatProvider = this.formatProvider;
            if (formatProvider == null)
            {
                formatProvider = base.FormatProvider;
            }
            return formatProvider;
        }
    }

    public override string NewLine
    {
        get { return base.NewLine; }

        set
        {
            foreach (System.IO.TextWriter writer in this.writers)
            {
                writer.NewLine = value;
            }

            base.NewLine = value;
        }
    }


    public override System.Text.Encoding Encoding
    {
        get
        {
            System.Text.Encoding encoding = this.encoding;

            if (encoding == null)
            {
                encoding = System.Text.Encoding.Default;
            }

            return encoding;
        }
    }

    #region TextWriter Property Setters

    TextWriterMulti SetFormatProvider(System.IFormatProvider value)
    {
        this.formatProvider = value;
        return this;
    }

    TextWriterMulti SetEncoding(System.Text.Encoding value)
    {
        this.encoding = value;
        return this;
    }
    #endregion // TextWriter Property Setters
    #endregion // TextWriter Properties


    #region Construction/Destruction
    public TextWriterMulti(System.Collections.Generic.IEnumerable<System.IO.TextWriter> writers)
    {
        this.Clear();
        this.AddWriters(writers);
    }
    #endregion // Construction/Destruction

    #region Public interface
    public TextWriterMulti Clear()
    {
        this.writers.Clear();
        return this;
    }

    public TextWriterMulti AddWriter(System.IO.TextWriter writer)
    {
        this.writers.Add(writer);
        return this;
    }

    public TextWriterMulti AddWriters(System.Collections.Generic.IEnumerable<System.IO.TextWriter> writers)
    {
        this.writers.AddRange(writers);
        return this;
    }
    #endregion // Public interface

    #region TextWriter methods

    public override void Close()
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Close();
        }
        base.Close();
    }

    protected override void Dispose(bool disposing)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            if (disposing)
            {
                writer.Dispose();
            }
        }
        base.Dispose(disposing);
    }

    public override void Flush()
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Flush();
        }

        base.Flush();
    }

    //foreach (System.IO.TextWriter writer in this.writers)
    //{
    //    writer;
    //}
    public override void Write(bool value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(char value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(char[] buffer)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(buffer);
        }
    }

    public override void Write(decimal value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(double value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(float value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(int value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(long value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(object value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(string value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(uint value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(ulong value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(value);
        }
    }

    public override void Write(string format, object arg0)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(format, arg0);
        }

    }

    public override void Write(string format, params object[] arg)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(format, arg);
        }
    }

    public override void Write(char[] buffer, int index, int count)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(buffer, index, count);
        }
    }

    public override void Write(string format, object arg0, object arg1)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(format, arg0, arg1);
        }
    }

    public override void Write(string format, object arg0, object arg1, object arg2)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.Write(format, arg0, arg1, arg2);
        }
    }

    public override void WriteLine()
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine();
        }
    }

    public override void WriteLine(bool value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(char value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(char[] buffer)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(buffer);
        }
    }

    public override void WriteLine(decimal value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(double value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(float value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
           writer.WriteLine(value);
        }
    }

    public override void WriteLine(int value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(long value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(object value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(string value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(uint value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(ulong value)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(value);
        }
    }

    public override void WriteLine(string format, object arg0)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(format, arg0);
        }
    }

    public override void WriteLine(string format, params object[] arg)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(format, arg);
        }
    }

    public override void WriteLine(char[] buffer, int index, int count)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(buffer, index, count);
        }
    }

    public override void WriteLine(string format, object arg0, object arg1)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(format, arg0, arg1);
        }
    }

    public override void WriteLine(string format, object arg0, object arg1, object arg2)
    {
        foreach (System.IO.TextWriter writer in this.writers)
        {
            writer.WriteLine(format, arg0, arg1, arg2);
        }
    }
    #endregion // TextWriter methods
}

我不是标准I/O设施,而是仅使用log4net。 I configurelog4net, 以便同时使用ConsoleAppender和文档投标人或滚动装置对 con和记录仪。

The nice thing is that you can set the log message template to trap all sorts of useful information (time-of-day, thread/process id, machine name, etc.) in addition to just the logged message.

你们也可以向服务器、活动标志或重新激发思考。

容易!

这里的样本文本参考书,通过日志4net传递:

using System;
using System.IO;
using System.Text;
using log4net ;

namespace ConsoleApplication22
{
    public class Log4NetTextWriter : TextWriter, IDisposable
    {
        private static ILog log = log4net.LogManager.GetLogger( typeof(Log4NetTextWriter) ) ;

        #region properties

        private StringBuilder buffer { get ; set ; }

        public override Encoding Encoding
        {
            get
            {
                // since this TextWrite is writing to log4net, we have no idea what the final encoding might be.
                // It all depends on the log4net configuration: tthe appender or appenders that wind up handling the logged message
                // determine the final encoding.
                //
                // Might make more sense to return Encoding.UTF8 though, just to return something.
                throw new NotImplementedException() ;
            }
        }

        #endregion properties ;

        public override void Flush()
        {
            if ( this.buffer != null && this.buffer.Length > 0 )
            {
                this.WriteLine() ;
            }
            return ;
        }

        public override void Close()
        {
            base.Close();
        }

        protected override void Dispose( bool disposing )
        {
            this.Flush() ;
            base.Dispose( disposing );
        }

        #region public constructors

        public Log4NetTextWriter() : this( null )
        {
            return ;
        }

        public Log4NetTextWriter( IFormatProvider formatProvider ) : base( formatProvider )
        {
            this.buffer = new StringBuilder() ;
        }

        #endregion public constructors

        #region public Write() overloads
        public override void Write( bool value )
        {
            this.buffer.Append( value ) ;
            return ;
        }
        public override void Write( char value )
        {
            this.buffer.Append( value ) ;
            return ;
        }
        public override void Write( char[] buffer )
        {
            this.buffer.Append( buffer ) ;
            return ;
        }
        public override void Write( char[] buffer , int index , int count )
        {
            this.buffer.Append( buffer , index , count ) ;
            return ;
        }
        public override void Write( decimal value )
        {
            this.buffer.Append( value ) ;
            return ;
        }
        public override void Write( double value )
        {
            this.buffer.Append( value ) ;
            return ;
        }
        public override void Write( float value )
        {
            this.buffer.Append( value ) ;
            return ;
        }
        public override void Write( int value )
        {
            this.buffer.Append( value ) ;
            return ;
        }
        public override void Write( long value )
        {
            this.buffer.Append( value ) ;
            return ;
        }
        public override void Write(object value)
        {
            this.buffer.Append( value ) ;
            return ;
        }
        public override void Write( string format , object arg0 )
        {
            this.buffer.AppendFormat( this.FormatProvider , format , arg0 ) ;
            return ;
        }
        public override void Write( string format , object arg0 , object arg1 )
        {
            this.buffer.AppendFormat( this.FormatProvider , format , arg0 , arg1 ) ;
            return ;
        }
        public override void Write( string format , object arg0 , object arg1 , object arg2 )
        {
            this.buffer.AppendFormat( this.FormatProvider , format , arg0 , arg1 , arg2 );
            return ;
        }
        public override void Write( string format , params object[] arg )
        {
            this.buffer.AppendFormat( this.FormatProvider , format , arg ) ;
            return ;
        }
        public override void Write( string value )
        {
             this.buffer.Append( value );
            return ;
        }
        public override void Write( uint value )
        {
            this.buffer.Append( value );
            return ;
        }
        public override void Write( ulong value )
        {
            this.buffer.Append( value );
            return ;
        }
        public override void WriteLine()
        {
            string logMessage = this.buffer.ToString() ;

            this.buffer.Length = 0 ;
            log.Info( logMessage ) ;

            return ;
        }

        #endregion public Write() overloads

        #region public WriteLine() overloads

        public override void WriteLine( bool value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( char value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( char[] buffer )
        {
            this.Write( buffer ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( char[] buffer , int index , int count )
        {
            this.Write( buffer , index , count ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( decimal value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( double value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( float value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( int value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( long value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( object value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( string format , object arg0 )
        {
            this.Write( format , arg0 ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( string format , object arg0 , object arg1 )
        {
            this.Write( format , arg0 , arg1 ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( string format , object arg0 , object arg1 , object arg2 )
        {
            this.Write( format , arg0 , arg1 , arg2 ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( string format , params object[] arg )
        {
            this.Write( format , arg ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( string value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( uint value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }
        public override void WriteLine( ulong value )
        {
            this.Write( value ) ;
            this.WriteLine() ;
            return ;
        }

        #endregion public WriteLine() overloads

    }
}

这里有1个样本日志。 这张标语既包括奥洛尔,也用于记录,根据大小进行自动滚动(也可以根据日期/时间或每秒进行滚动)。

<log4net>

  <!-- Log to the console -->
  <appender name="Console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <!-- Pattern to output the caller s file name and line number -->
      <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline" />
    </layout>
  </appender>

  <!-- Log to a log file. This particular setup should log to a static file name  log.txt  -->
  <!-- When it hits 100KB in size, it rolls, keeping up to 10 archived files. The archived -->
  <!-- files are named  log.text.1 ,  log.txt.2 , ... ,  log.txt.10  -->
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="log.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="100KB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="Console" />
    <appender-ref ref="RollingFile" />
  </root>

</log4net>

To configure log4net, the easiest way is by putting an XmlConfigurator attribute in AssemblyInfo.cs, thus:

// Configure log4net using the .log4net file
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension="log4net",Watch=true)]
// This will cause log4net to look for a configuration file
// called TestApp.exe.log4net in the application base
// directory (i.e. the directory containing TestApp.exe)
// The config file will be watched for changes.

虽然你的方案正在运行,但你可以通过编辑和保存集邮档案来扭转伐木或变造。 记录4net对编织文档的改动进行观察,并对飞行进行重新配置。

Your first guess is correct. You can generalize it and write a distributing textwriter which accepts a list of textwriters as construction-time parameter and distributes all input that it receives to every single one of the textwriters.





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签