Класс ведения журнала .NET не пишет - PullRequest
2 голосов
/ 31 июля 2011

Я только что написал простой класс журналирования для использования в различных потоках, основываясь на примерах, которые я нашел на MSDN и нескольких других сайтах.Проблема в том, что он создает файл журнала файлов, но на самом деле никогда ничего не записывает в него (хотя он и правильно пишет в консоль).

public class Logger
{
    private static Logger instance;
    private Logger() { }
    private static StreamWriter writer;

    public static Logger GetInstance()
    {
        lock (typeof(Logger))
        {
            if (instance == null)
            {
                instance = new Logger();
            }

            return instance;
        }
    }

    public void OpenFile(String file)
    {
        // Open log file for writing and append to it
        writer = new StreamWriter(file, true);
    }

    public void LogMessage(String message)
    {
        string dt = DateTime.Now.ToString("yyyy-MM-dd H:mm:ss :: ");

        writer.WriteLine(dt + message);
        Console.WriteLine(dt + message);
    }

    public void LogError(String error)
    {
        string dt = DateTime.Now.ToString("yyyy-MM-dd H:mm:ss :: ");

        writer.WriteLine(dt + "ERROR: " + error);
        Console.WriteLine(dt + "ERROR: " + error);
    }
}

, и я делаю следующее в моей Программе.

static void Main(string[] args)
{
    Logger log = Logger.GetInstance();
    log.OpenFile("app.log");

    log.LogMessage("Starting App...");

Ответы [ 2 ]

2 голосов
/ 31 июля 2011
writer.WriteLine(dt + message);
writer.Flush();

или когда вы объявили writer установить Автозапуск в true:

writer = new StreamWriter(file, true);
writer.AutoFlush = true;

Редактировать: Также, поскольку ваш класс будет иметь доступ из нескольких-thread, поэтому вы должны использовать lock перед записью в поток, потому что экземпляр StreamWriter не является потокобезопасным, поэтому:

private readonly object _writerLocker = new object();

lock (_writerLocker)
{
    writer.WriteLine(dt + "ERROR: " + error);
}
1 голос
/ 31 июля 2011

Чтобы ответить на ваш вопрос в комментариях: почему вместо него рекомендуется использовать один из них (Log4Net, NLog)?

  • Потому что он уже отлажен.
  • Поскольку вы избегаете неприятных ошибок, таких как многопоточный доступ на запись, на который указывает Jalaal.
  • Поскольку в тот день, когда вам необходимо изменить протоколирование (или вы хотите избавиться от журналирования!), Вам даже не нужно перекомпилировать программу: это просто вопрос конфигурации в вашем app.config.
  • Поскольку, научившись использовать такую ​​среду ведения журналов, вы сможете очень легко повторно использовать ее в других проектах или контекстах, которые могут иметь более сложные требования.
  • Потому что, как только вы поймете, насколько мощными, но простыми в использовании они являются, вы можете захотеть добавить более мощные средства ведения журналов без необходимости их программировать.

Кстати, мой +1 идет к NLog .

...