Я работаю над реализацией аналогичной функции для захвата вывода, отправленного на консоль, и сохранения его в журнале, в то же время передавая вывод в режиме реального времени на обычную консоль, чтобы она не ломала приложение (например, если оно консольное приложение!).
Если вы все еще пытаетесь сделать это в своем собственном коде, сохраняя вывод консоли (в отличие от использования системы ведения журнала для сохранения только той информации, которая вам действительно нужна), я думаю, что вы можете избежать сброса после каждой записи , если вы также переопределите Flush () и убедитесь, что он сбрасывает оригинальный stdoutWriter
, который вы сохранили, а также ваш fileWriter
. Это необходимо сделать в случае, если приложение пытается сбросить частичную строку в консоль для немедленного отображения (например, запроса ввода, индикатора выполнения и т. Д.), Чтобы переопределить обычную буферизацию строки.
Если при таком подходе возникают проблемы с буферизацией вывода консоли, вам может потребоваться убедиться, что WriteLine () сбрасывает stdoutWriter
(но, вероятно, не нужно сбрасывать fileWriter
, за исключением случаев, когда ваш Flush () переопределяет называется). Но я бы подумал, что оригинальный Console.Out
(на самом деле идущий в консоль) автоматически сбросит свой буфер на новую строку, поэтому вам не нужно его форсировать.
Возможно, вы также захотите переопределить Close (), чтобы (сбросить и) закрыть ваш fileWriter
(и, вероятно, stdoutWriter
также), но я не уверен, действительно ли это необходимо или если Close () в base TextWriter выдаст Flush () (который вы уже переопределите), и вы можете рассчитывать на выход из приложения, чтобы закрыть файл. Вы должны, вероятно, проверить, что он сбрасывается при выходе, чтобы быть уверенным. И имейте в виду, что неправильный выход (сбой), скорее всего, не сбрасывает буферизованный вывод. Если это проблема, то может потребоваться очистка fileWriter
на новой строке, но это еще одна хитрая червь, с которым нужно разобраться.