Создание нового файла журнала каждый день

Как заголовок подразумевает, как я могу создать новый файл журнала каждый день в С#? Теперь программа может не запускаться круглосуточно, а запускаться только в рабочее время. Поэтому мне нужно сделать две вещи.

  • Как я могу создать новый файл журнала каждый день? Файл журнала будет иметь имя в формате MMDDYYYY.txt
  • Как я могу создать его сразу после полуночи, если он работает во все часы ночи?

Ответы

Ответ 1

В этом примере показано, как настроить RollingFileAppender для свертывания файлов журнала в дате. В этом примере каждую минуту будет свертываться файл журнала! Чтобы изменить период проката, измените значение DatePattern. Например, шаблон даты "yyyyMMdd" будет катиться каждый день.
См. System.Globalization.DateTimeFormatInfo для списка доступных шаблонов.

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\temp\rolling.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMdd-HHmm" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>

Ответ 2

Другие упоминали Log4Net, поэтому я продолжу и сутулиться Enterprise Library Блок регистрации, который также вполне способен сделать то, что вы хотите.

Не могли бы вы включить какой-то код, который показывает, как легко было бы делать этот рулон каждый день? Это проще, чем пример log4Net? - Даниэль Дайсон

Конечно. Как правило, для создания конфигурации можно использовать Инструмент настройки корпоративной библиотеки; этот инструмент немного привыкает, но как только вы поймете, как он работает, он довольно мощный. Тем не менее, вы также можете отредактировать app.config вручную.

Вот результат работы инструмента, о котором я упоминал, который сбрасывает почти все в скользящий плоский файл, который катится каждый день (или если он превышает 2 МБ). Форматирование является значением по умолчанию, предоставляемым инструментом.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
    </configSections>
    <loggingConfiguration name="" tracingEnabled="true" defaultCategory="Category">
        <listeners>
            <add name="Rolling Flat File Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                formatter="Text Formatter" rollInterval="Day" rollSizeKB="2000" />
        </listeners>
        <formatters>
            <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                template="Timestamp: {timestamp}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Title:{title}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}"
                name="Text Formatter" />
        </formatters>
        <categorySources>
            <add switchValue="All" name="Category">
                <listeners>
                    <add name="Rolling Flat File Trace Listener" />
                </listeners>
            </add>
        </categorySources>
        <specialSources>
            <allEvents switchValue="All" name="All Events">
                <listeners>
                    <add name="Rolling Flat File Trace Listener" />
                </listeners>
            </allEvents>
            <notProcessed switchValue="All" name="Unprocessed Category">
                <listeners>
                    <add name="Rolling Flat File Trace Listener" />
                </listeners>
            </notProcessed>
            <errors switchValue="All" name="Logging Errors &amp; Warnings">
                <listeners>
                    <add name="Rolling Flat File Trace Listener" />
                </listeners>
            </errors>
        </specialSources>
    </loggingConfiguration>
</configuration>

Ответ 3

Я бы рекомендовал что-то вроде этого:

string logFile = DateTime.Now.ToString("yyyyMMdd") + ".txt";
if (!System.IO.File.Exists(logFile))
{
    System.IO.File.Create(logFile);   
}
//append to logFile here...

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

Также заметил, что я изменил формат даты. Это позволит вам сортировать файлы по имени и упорядочивать их. Я всегда использую этот формат, когда я воюю с датами.

Ответ 4

Попробуйте NLog (nlog-project.org). С моей точки зрения, это очень гибко и легче работать, чем Log4Net.

Пример NLog.config:

<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets>
        <target name="file" xsi:type="File"
            layout="${longdate} ${logger} ${message}" 
            fileName="${basedir}/${shortdate}/${windows-identity:domain=false}.${level}.log" />
    </targets>

    <rules>
        <logger name="*" minlevel="Debug" writeTo="file" />
    </rules>
</nlog>

Дополнительные примеры (включая другие цели ведения журнала, кроме файла) см. в Примеры конфигурации NLog в Github

Ответ 5

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

Единственный случай, о котором вам нужно знать с этой настройкой, - это когда приложение запускается за полночь.

Ответ 6

используйте log4net. Это одна из наиболее часто используемых библиотек для ведения журнала.

Его можно легко настроить, как вам нравится, пожалуйста, обратитесь к образцам.

Ответ 7

Ниже представлен XML-код приложения, который я использую в настоящее время.

Основываясь на ваших требованиях 1) создание файла журнала один раз в день и,
2) иметь расширение txt,
вы должны использовать XML, похожий на то, что ниже. В XML ниже будет создан файл журнала, называемый system-20121106.txt.

Единственная проблема заключается в том, что поскольку значение файла - это logs/system- ваш файл, пока он пишет для текущего дня, будет system-. Чтобы обойти это, вам нужно установить значение вашего файла в logs/system.txt, но тогда вы получите файл system.txt.20121106.txt в качестве окончательного файла.

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="logs/system-" />
  <appendToFile value="true"/>
  <countDirection value="-1"/>
  <rollingStyle value="Date" />
  <datePattern value="yyyyMMdd'.txt'" />
  <maxSizeRollBackups value="0" />
  <maximumFileSize value="10000KB" />
  <staticLogFileName value="false" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d [%t] %-5p %c - %m%n" />
  </layout>
</appender>

Ответ 8

Когда вы что-то регистрируете, проверьте, существует ли файл с текущей датой, если нет - создайте его. Просто как это:)

if(fileExists(todaysDate + ".txt")){
  appendToLogFile(message);
}else{
  createFile(todaysDate + ".txt");
  appendToLogFile(message);
}

Ответ 9

Нет необходимости создавать его, пока он вам не понадобится, используйте:

 file = new StreamWriter(path, true, new UTF8Encoding(false));

(или, может быть, другая кодировка.) Это создаст файл, если он не существует или не добавляется к нему.

Затем это вопрос создания имени файла и просто использования этого.