C# 重定向控制台。写入特定程序集
在我的C#应用程序中,我通过反射加载另一个程序集 另一个程序集使用console.Write函数写入控制台 我只想将输出重定向到这个特定程序集的log4net appender。我希望所有其他程序集继续输出到控制台 我怎样才能做到这一点C# 重定向控制台。写入特定程序集,c#,.net,logging,reflection,log4net,C#,.net,Logging,Reflection,Log4net,在我的C#应用程序中,我通过反射加载另一个程序集 另一个程序集使用console.Write函数写入控制台 我只想将输出重定向到这个特定程序集的log4net appender。我希望所有其他程序集继续输出到控制台 我怎样才能做到这一点 Console类具有静态方法SetOut,该方法将输出重定向到StreamWriter对象 编写自己的StreamWriter扩展类,以重定向控制台输出(如果程序集与您所需的相同)。举个例子 公共类编写器:StreamWriter { 专用只读程序集\u程序集
Console
类具有静态方法SetOut
,该方法将输出重定向到StreamWriter
对象StreamWriter
扩展类,以重定向控制台输出(如果程序集与您所需的相同)。举个例子
公共类编写器:StreamWriter
{
专用只读程序集\u程序集
private readonly StreamWriter _stdout;
public Writer(Assembly assembly)
: base(Console.OpenStandardOutput())
{
_assembly = assembly;
_stdout = new StreamWriter(Console.OpenStandardOutput());
}
public override void Write(string value)
{
var st = new StackTrace();
var curent = st.GetFrames();
foreach (var frame in curent)
{
if (frame.GetMethod().Module.Assembly == _assembly)
{
_stdout.Write("Redirected: " + value);
_stdout.Flush();
return;
}
}
base.Write(value);
this.Flush();
}
}在某些情况下,例如一个程序集调用方法从另一个程序集写入控制台。我不知道如何预测这种行为。+1回答很好,我在考虑出发,但没有想到基于assembly.thx进行过滤,但是当我使用它来记录log4net时,它会创建一个异常:
System.Threading.LockRecursionException:Recursive read lock acquisitions在此模式下不允许进行递归读取锁获取。
您不接受答案有什么原因吗?(看起来答案涵盖了你的要求,那么请接受答案,这样问题就不会出现在“未回答”下。)@flindeberg:我还没有接受它,因为它不适用于我使用log4net编写日志的具体情况。它产生了许多异常。我很快会把细节作为对答案的评论。