Isso pode dar mais algum trabalho, mas eu faria o contrário.
Instancie um TraceListener
para o console e outro para o arquivo de log; depois disso, use Trace.Write
instruções em seu código em vez de Console.Write
. Depois disso, fica mais fácil remover o log, ou a saída do console, ou anexar outro mecanismo de log.
static void Main(string[] args)
{
Trace.Listeners.Clear();
TextWriterTraceListener twtl = new TextWriterTraceListener(Path.Combine(Path.GetTempPath(), AppDomain.CurrentDomain.FriendlyName));
twtl.Name = "TextLogger";
twtl.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime;
ConsoleTraceListener ctl = new ConsoleTraceListener(false);
ctl.TraceOutputOptions = TraceOptions.DateTime;
Trace.Listeners.Add(twtl);
Trace.Listeners.Add(ctl);
Trace.AutoFlush = true;
Trace.WriteLine("The first line to be in the logfile and on the console.");
}
Pelo que me lembro, você pode definir os ouvintes na configuração do aplicativo, tornando possível ativar ou desativar o registro sem tocar na construção.
Esta é uma classe simples com subclasses de TextWriter para permitir o redirecionamento da entrada para um arquivo e para o console.
Use assim
Aqui está a aula:
fonte
Console.WriteLine()
, que era exatamente o que eu queria.Console.SetOut(doubleWriter);
. Que é modificar um global para o Console, demorei um pouco, já que estou tão acostumado a trabalhar em aplicativos onde praticamente nada é global. Coisa boa!Verifique log4net . Com log4net, você pode configurar o console e anexadores de arquivo que podem enviar mensagens de log para ambos os lugares com uma única instrução de log.
fonte
Você não pode simplesmente redirecionar a saída para um arquivo, usando o
>
comando?Se precisar espelhar, você pode tentar encontrar uma versão win32
tee
que divida a saída em um arquivo.Consulte /superuser/74127/tee-for-windows para executar tee do PowerShell
fonte
Você pode criar uma subclasse da classe TextWriter e, em seguida, atribuir sua instância ao Console.Out usando o Console.SetOut método - que em particular faz a mesma coisa que passar a mesma string para ambos os métodos no método de log.
Outra maneira pode declarar sua própria classe Console e usar a instrução using para distinguir entre as classes:
Para acessar o console padrão, você precisará:
fonte
EDIT: Este método fornece a possibilidade de redirecionar as informações do console provenientes de pacotes de terceiros. substituir o método WriteLine é bom para a minha situação, mas você pode precisar substituir outros métodos Write depende do pacote de terceiros.
Primeiro, precisamos criar uma nova classe inerente de StreamWriter, digamos CombinedWriter;
Então inicie um novo instante de CombinedWriter com Console.Out;
Finalmente, podemos redirecionar a saída do console para o instante da nova classe por Console.SetOut;
O código a seguir é a nova classe funciona para mim.
fonte
public override void Write(char value);
,public override void Write(char[] buffer);
,public override void Write(string value);
epublic override void Write(char[] buffer, int index, int count);
. Caso contrário, ele não será impresso no console se você usar oWriteLine(format, ...)
método.Log4net pode fazer isso por você. Você só escreveria algo assim:
Uma configuração determinará se a impressão irá para o console, arquivo ou ambos.
fonte
Acho que o que você já está usando é a melhor abordagem. Um método simples para espelhar essencialmente sua saída.
Primeiro, declare um TextWriter global no início:
Em seguida, crie um método para escrever:
Agora, em vez de usar
Console.WriteLine("...");
, useLog("...");
. Simples assim. É ainda mais curto!Pode haver algum problema se você mudar a posição do cursor (
Console.SetCursorPosition(x, y);
), mas de outra forma funciona bem, eu também uso!EDITAR
Claro, você pode fazer um método
Console.Write();
da mesma maneira se não estiver usando apenas WriteLinesfonte
Conforme sugerido por Arul, o uso
Console.SetOut
pode ser usado para redirecionar a saída para um arquivo de texto:fonte
A decisão de usar uma classe, herdada do StreamWriter, sugestões do usuário Keep Thinking, funciona. Mas eu tive que adicionar no construtor base.AutoFlush = true:
e uma chamada explícita para o destruidor:
Caso contrário, o arquivo é fechado antes que ele registrou todos os dados.
Estou usando como:
fonte
Obrigado, Continue Pensando pela excelente solução! Eu adicionei algumas substituições adicionais para evitar o registro de certos eventos de gravação do console que (para meus propósitos) são esperados apenas para exibição no console.
fonte
Se você duplicar a saída do console de um código que não controla, por exemplo, uma biblioteca de terceiros, todos os membros do TextWriter devem ser substituídos. O código usa ideias deste tópico.
Uso:
Classe ConsoleMirroring
fonte
Na verdade, você pode criar um espelhamento transparente de Console.Out to Trace implementando sua própria classe herdada de TextWriter e substituindo o método WriteLine.
No WriteLine, você pode gravá-lo no Trace, que pode então ser configurado para gravar no arquivo.
Achei esta resposta muito útil: https://stackoverflow.com/a/10918320/379132
Na verdade funcionou para mim!
fonte
Minha resposta é baseada na resposta mais votada não aceita , e também na resposta menos votada que eu acho que é a solução mais elegante até agora. É um pouco mais genérico em termos do tipo de fluxo que você pode usar (você pode usar um,
MemoryStream
por exemplo), mas omiti todas as funcionalidades estendidas incluídas na última resposta para abreviar.Uso:
fonte