Создание нового файла журнала каждый день
Как заголовок подразумевает, как я могу создать новый файл журнала каждый день в С#? Теперь программа может не запускаться круглосуточно, а запускаться только в рабочее время. Поэтому мне нужно сделать две вещи.
- Как я могу создать новый файл журнала каждый день? Файл журнала будет иметь имя в формате 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}
Message: {message}{newline}
Category: {category}{newline}
Priority: {priority}{newline}
EventId: {eventid}{newline}
Severity: {severity}{newline}
Title:{title}{newline}
Machine: {localMachine}{newline}
App Domain: {localAppDomain}{newline}
ProcessId: {localProcessId}{newline}
Process Name: {localProcessName}{newline}
Thread Name: {threadName}{newline}
Win32 ThreadId:{win32ThreadId}{newline}
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 & 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));
(или, может быть, другая кодировка.) Это создаст файл, если он не существует или не добавляется к нему.
Затем это вопрос создания имени файла и просто использования этого.