Создайте файл журнала и обновите статус динамически в C # .NET - PullRequest
3 голосов
/ 17 декабря 2010

Я хочу создать файл журнала в формате (Log + datetime.Now) .txt в моем консольном приложении.

Для первого статуса, в который я хочу войти, я хочу создать этот файл журнала. Мне нужно сохранить добавление этого файла со всеми последними сообщениями о состоянии (около 50–60 сообщений) в течение промежутка времени от 10 до 20 минут.

В то же время в этот период, если пользователь открывает этот файл, он должен иметь возможность открыть его свободно.

Любой пример кода будет оценен.

Спасибо

Ответы [ 6 ]

2 голосов
/ 17 декабря 2010

Вместо того, чтобы создавать свои собственные классы журналирования, используйте существующую инфраструктуру журналирования. Log4Net , например, может использовать метод минимальной блокировки, позволяющий другим процессам читать файл:

<appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="log-file.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message %date%newline" />
    </layout>
</appender>

Если вы хотите изменить используемое ведение журнала позже, вам следует попробоватьиспользуйте абстракцию журнала ( NetCommonLogging ).

0 голосов
/ 07 января 2011
public static Boolean CreateLogFile(String message)
        {
            try
      {
                //string location = @"C://IRPC//myfile1.txt";
                string location = System.Environment.CurrentDirectory + "\\log " + LogTime + ".txt";
                if (!File.Exists(location))
                {
                    FileStream fs;
                    using (fs = new FileStream(location, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
                    {
                    }
                    fs.Close();
                }

                Console.WriteLine(message);
                //Release the File that is created
                StreamWriter sw = new StreamWriter(location, true);
                sw.Write(message + Environment.NewLine);
                sw.Close();
                sw = null;
                return true;
      }
      catch(Exception ex)
            {
                EventLog.WriteEntry("MIDocShare", "Error in CreateLogFile" + ex.Message.ToString(), EventLogEntryType.Error, 6000);
       return false;
      }
     }
0 голосов
/ 18 декабря 2010

Чтобы повернуть файл

Отслеживайте, когда был открыт текущий файл, если он больше заданного TimeSpam («10-20 минут»), затем закройте его, создайте имя файла файлаи откройте его.

Чтобы другие могли прочитать файл

Это все касается управления параметрами общего доступа к файлам, тогда как другие методы будут использовать правильные значения по умолчанию, если мне нужно что-то конкретное, я бы предпочелбыть явнымFileShare.Read имеет правильную семантику:

Позволяет открывать файл для последующего открытия.

Решение

class FileLogger {
  private TimeSpan timeout;

  private DateTime openedFile;
  private Stream output;
  private StreamWriter writer;

  public Dispose() {
    if (writer != null) {
      writer.Dispose();
      writer = null;
    };
    if (output != null) {
      output.Dispose();
      output = null;
    }
  }

  public void Log(string message) {
    if (output == null
        || ((DateTime.UtcNow - openedFile) > timeout) {
      Dispose();

      string filename = MakeFileName();
      output = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.Read);
      writer = new StreamWriter(output);
      openedFile = DateTime.UtcNow;
    }

    writer.WriteLine(writer);
  }
}

Но с помощью MakeFileName и конструктором для установки timeout.

0 голосов
/ 18 декабря 2010

Вы можете использовать StreamWriter класс для написания и даже добавления и текста в файле.

Я несколько дней назад написал пост на Logging, , проверьте пост здесь .

Фрагмент кода из моего поста

        // Open the file using stream write.
        // If file does not exist, StreamWriter will create it.
        // Use the overloaded constructor of StreamWriter and 
        // pass second parameter as true for appending text to file.
        using (StreamWriter writer = new StreamWriter(@"D://myfile.txt", true))
        {
            // write the text to writer
            writer.WriteLine("Your text here" + " - " + DateTime.Now);

            // clear all the buffer and 
            // write the buffered data to text file.
            writer.Flush();
        }

Примечание. Я немного изменил код поста блога, чтобы соответствовать требованиям ОП.

0 голосов
/ 17 декабря 2010

Попробуйте использовать StreamWriter. Что-то вроде:

using (StreamWriter writer = new StreamWriter("log.txt"))
{
            writer.WriteLine("Text here");
}
0 голосов
/ 17 декабря 2010

Создание FileStream с помощью FileMode.Append .
Блокнот может открывать текстовый файл, когда кто-то другой пишет в него (хотя он актуален только к моменту открытия).

...