Класса TextWriterTraceListener


Мне нужно продлить по умолчанию TextWriterTraceListener класса, чтобы включить метки времени с каждым сообщением на одной строке и файл ротации. Я не могу показаться, чтобы найти любой способ сделать это с помощью прослушивателя трассировки конфигурации.

Можете ли вы пожалуйста, проверьте его и дайте мне знать какие-либо недостатки для использования в многопоточных приложениях?

using System;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
using System.Text;
namespace ConsoleApplication1
{
    public class MyTextWriterTraceListener : TextWriterTraceListener
    {
        public MyTextWriterTraceListener(System.IO.Stream stream) : base(stream) { }
        public MyTextWriterTraceListener(System.IO.Stream stream, string name) : base(stream, name) { }
        public MyTextWriterTraceListener(string FileName, string name) : base(FileName, name) { RotateLogFiles(FileName); }
        public MyTextWriterTraceListener(string FileName) : base(FileName) { RotateLogFiles(FileName); }
        public MyTextWriterTraceListener(System.IO.TextWriter writer, string name) : base(writer, name) { }
        public MyTextWriterTraceListener(System.IO.TextWriter writer) : base(writer) { }
        public override void Write(string Msg)
        {
            base.Write(Msg);
            base.Flush();
        }
        public override void WriteLine(string Msg)
        {
            base.WriteLine(LinePrefix() + Msg);
            base.Flush();
        }

        private void RotateLogFiles(string FileName)
        {
            FileInfo TheFileInfo = new FileInfo(FileName);
            if (TheFileInfo.Exists == false)
                return;
            if (TheFileInfo.LastWriteTime.Date < DateTime.Today)
            {
                TheFileInfo.MoveTo(string.Format(@"{0}\{1}_{2}{}", TheFileInfo.DirectoryName, TheFileInfo.Name, TheFileInfo.LastWriteTime.ToString(), TheFileInfo.Extension));
            }
        }

        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
        private string LinePrefix()
        {
            DateTime Now = DateTime.Now;
            return string.Format("{0} : ", Now.ToString("dd-MMM-yyyy HH:mm:ss"));
        }
    }
}


1185
4
c#
задан 8 мая 2011 в 02:05 Источник Поделиться
Комментарии
2 ответа

Возможные проблемы

1 соблюдать стиль руководства. Это общепринятое Соглашение для верблюда случае имена локальных переменных.

ВАР файл = новый FileInfo на(...) Вместо ВАР Файл = Новый FileInfo на(...).

Формат вашего файла не менее (т. е. либо все методы разделяются пустой строкой или нет).

2 сохранить строки короткие и использовать дополнительные переменные для получения лучшей читаемости и упрощения отладки:

var newPath = Path.Combine(file.DirectoryName, file.Name, file.LastWriteTime.ToString(), file.Extension)
file.MoveTo(newPath);

вместо

TheFileInfo.MoveTo(string.Format(@"{0}\{1}_{2}{}", TheFileInfo.DirectoryName, TheFileInfo.Name, TheFileInfo.LastWriteTime.ToString(), TheFileInfo.Extension));

3 Используйте осмысленные имена.

RollingTextWriterTraceListener вместо MyTextWriterTraceListener

[MethodImpl(MethodImplOptions.NoInlining)] вместо [системы[...]NoInlining)]

Что делать, если вам нужен другой реализации - MyOtherTextWriterTraceListener?
То же самое относится к TheFileInfo, ConsoleApplication1.

4 удаления избыточной квалификации, чтобы удалить беспорядок.

public MyTextWriterTraceListener(Stream stream) : base(stream) { }

вместо

public MyTextWriterTraceListener(System.IO.Stream stream) : base(stream) { }

var Файл = Новый FileInfo на(...) Вместо FileInfo на Файл = Новый FileInfo на(...)

5 Вы уверены, что вам нужна [MethodImpl(MethodImplOptions.NoInlining)] атрибут?

Что мне нравится

1 Если (TheFileInfo.Существует == ложные) возвращение;

поскольку оператор return сокращает уровень вложенности (см. стрелку анти-паттерн) и == ложь , потому что его более очевидным, и чем !TheFileInfo.Существует. Одинокий ! может быстрая быть под контролем. Я бы порекомендовал ту же процедуру на следующий, если заявление, тоже:

if (TheFileInfo.LastWriteTime.Date >= DateTime.Today) return;

вместо

if (TheFileInfo.LastWriteTime.Date < DateTime.Today) { ... }

Общие рекомендации

1 как для k3b упомянули, я бы рекомендовал использовать такой как log4net, тоже. Он имеет большую гибкость вы когда-нибудь понадобится, его можно настроить через файл конфигурации, который означает, что вы можете изменить свой выход журнала без перекомпиляции.

5
ответ дан 9 мая 2011 в 09:05 Источник Поделиться

На мой взгляд, код ОК.

там могут быть некоторые незначительные проблемы


  • Поворот-журнал вызывается только в конструкторе MyTextWriterTraceListener. Так что если вы трассировку давно запущенных приложений (т. е. услуга), журнал не вращается вовсе.

  • В Ленивцевых с datetime вызывается только в строку. Если вы строите линию с несколькими пишут-заявления префикс может перейти в неположенном месте.

  • в formatig из RotateLogFiles удаляет fileextenstion строку.Формат(@"{0}\{1}_{2}{}" последний аргумент {} должны быть {3}. Я предпочитаю использовать путь.Сочетать методы, что также подтверждает обоснованность имена вместо строки.Формат.

Я лично предпочитаю использовать log4net для входа, который уже поддерживает свои особенности hommade (Датавремя-префикс, именем-вращения)

2
ответ дан 8 мая 2011 в 10:05 Источник Поделиться