2012-10-10 4 views
4

Я искал решение для регистрации в моем последнем проекте, когда я наткнулся на статью (http://www.daveoncsharp.com/2009/09/create-a-logger-using-the-trace-listener-in-csharp/), в которой говорилось об использовании System.Diagnostics и App.config для регистрации через метод Trace. Я смог успешно реализовать как класс, так и App.config, но мне бы очень хотелось иметь возможность динамически назначать значение/местоположение (внутри initializeData) файла журнала, и я не знаю, как это сделать , Если у вас есть предложения, не стесняйтесь публиковать сообщения!Как динамически установить файл журнала с помощью App.config и System.Diagnostics?

App.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.diagnostics> 
    <trace autoflush="true" indentsize="4"> 
     <listeners> 
     <add name="myListener" 
      type="System.Diagnostics.TextWriterTraceListener" 
      initializeData="fileSizeThreshold=512, fileSizeUnit=kilobytes, 
      fileAgeThreshold=1, fileAgeUnit=months, fileNameTemplate='{0}\MyApp-{1:MMM-yy}.log'"/> 
     <remove name="Default" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 
</configuration> 

Logger Класс:

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 


namespace MyCurrentProject 
{ 
    class Logger 
    { 
     public void Error(string module, string message) 
     { 
      WriteEntry(message, "ERROR:", module); 
     } 

     public void Error(Exception ex, string module) 
     { 
      WriteEntry(ex.Message, "ERROR:", module); 
     } 

     public void Warning(string module, string message) 
     { 
      WriteEntry(message, "WARNING:", module); 
     } 

     public void Info(string module, string message) 
     { 
      WriteEntry(message, "INFO:", module); 
     } 

     private void WriteEntry(string message, string type, string module) 
     { 
      Trace.WriteLine(
        string.Format("{0} {1} [{2}] {3}", 
            DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), 
            type, 
            module, 
            message)); 
     } 
    } 
} 

RE: Извините за не ясно ... просто быть ясно, мне нужно путь к файлу, что журнал выход файла сохраняется для динамического набора. Мне нужен путь для сохранения в местоположении в% AppData%. Проблема с конфигурацией заключалась в том, что как только я установил значение для 'initializeData', я не смог найти способ изменить или динамически установить/сбросить это значение. Честно говоря ... на данный момент я просто хочу, чтобы решение работало и позволяет мне управлять расположением файла журнала.

ответ

6

Вот пример использования System.Diagnostics, который имеет два преимущества по сравнению с библиотеками не-базового класса. Он всегда разрешен (в крупных организациях), всегда доступен, и в той мере, в какой разработчики знакомы с библиотекой базового класса, следующая группа разработчиков обслуживания будет об этом узнавать.

using System.Diagnostics; 

namespace DynamicTraceLog 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Use TraceSource, not Trace, they are easier to turn off 
      TraceSource trace = new TraceSource("app"); 
      //SourceSwitches allow you to turn the tracing on and off. 
      SourceSwitch level =new SourceSwitch("app"); 
      //I assume you want to be dynamic, so probalby some user input would be here: 
      if(args.Length>0 && args[0]=="Off") 
       level.Level= SourceLevels.Off; 
      else 
       level.Level = SourceLevels.Verbose; 
      trace.Switch = level; 
      //remove default listner to improve performance 
      trace.Listeners.Clear(); 
      //Listeners implement IDisposable 
      using (TextWriterTraceListener file = new TextWriterTraceListener("log.txt")) 
      using (ConsoleTraceListener console = new ConsoleTraceListener()) 
      { 
       //The file will likely be in /bin/Debug/log.txt 
       trace.Listeners.Add(file); 
       //So you can see the results in screen 
       trace.Listeners.Add(console); 
       //Now trace, the console trace appears immediately. 
       trace.TraceInformation("Hello world"); 
       //File buffers, it flushes on Dispose or when you say so. 
       file.Flush(); 
      } 
      System.Console.ReadKey(); 
     } 
    } 
} 

Re: как формат вывод Попробуйте любого из этих двух для трассировки слушателей, реализующие шаблонных трассировки форматирования/вывод с помощью Systems.Diagnostics классов: http://essentialdiagnostics.codeplex.com или http://ukadcdiagnostics.codeplex.com/ Systems.Diagnostics не обеспечивают для любого конкретного формирования или вывода стандартных токенов.

+0

Спасибо за отличный пост ... Я надеялся инициализировать это внутри моего App.config, чтобы он был универсально доступен для всех различных классов/объектов в моем проекте, и я хотел бы иметь возможность форматировать вывод как его сгенерированный. Как я могу получить это, используя ваш пример? – Simpleton

+0

Хорошо, тогда я не уверен, что понял в вашем вопросе, что вы подразумеваете под «динамическим назначением значения/местоположения файла журнала». App.config читается один раз, когда домен приложения загружается - для winforms только в начале приложения, для первого запроса или приложения asp.net 1st (или когда редактирование web.config вызывает переработку). Не очень динамично. Чтобы сделать его общедоступным, введите статический класс, который используется совместно в домене приложения. В ASP.NET выполните настройку работы в global.asax. Чтобы перехватить вывод и отформатировать его по своему вкусу, вам нужен пользовательский прослушиватель. См. Сообщение для предложений. – MatthewMartin

+0

Извините за то, что вы не поняли ... просто для того, чтобы быть ясным, мне нужен путь к файлу, который выдает файл журнала для динамического набора. Мне нужен путь для сохранения в местоположении в% AppData%. Проблема с конфигурацией заключалась в том, что как только я установил значение для 'initializeData', я не смог найти способ изменить или динамически установить/сбросить это значение. Честно говоря ... на данный момент я просто хочу, чтобы решение работало и позволяет мне управлять расположением файла журнала. – Simpleton

1

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

using Com.Foo; 

// Import log4net classes. 
using log4net; 
using log4net.Config; 

public class MyApp 
{ 
    // Define a static logger variable so that it references the 
    // Logger instance named "MyApp". 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyApp)); 

    static void Main(string[] args) 
    { 
     // Set up a simple configuration that logs on the console. 
     BasicConfigurator.Configure(); 

     log.Info("Entering application."); 
     Bar bar = new Bar(); 
     bar.DoIt(); 
     log.Info("Exiting application."); 
    } 
} 

Но предположим, что мы хотели сделать это с конфигурационным файлом так же, как вы подразумеваете, что хотели бы использовать. Ну, это довольно прямолинейно! Ниже конфигурация мы место в App.config, чтобы сделать то же самое:

<log4net> 
    <!-- A1 is set to be a ConsoleAppender --> 
    <appender name="A1" type="log4net.Appender.ConsoleAppender"> 

     <!-- A1 uses PatternLayout --> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" /> 
     </layout> 
    </appender> 

    <!-- Set root logger level to DEBUG and its only appender to A1 --> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="A1" /> 
    </root> 
</log4net> 

Затем, что конфигурация может быть использована, как это:

using Com.Foo; 

// Import log4net classes. 
using log4net; 
using log4net.Config; 

public class MyApp 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyApp)); 

    static void Main(string[] args) 
    { 
     // BasicConfigurator replaced with XmlConfigurator. 
     XmlConfigurator.Configure(new System.IO.FileInfo(args[0])); 

     log.Info("Entering application."); 
     Bar bar = new Bar(); 
     bar.DoIt(); 
     log.Info("Exiting application."); 
    } 
} 

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


Это ускоренный курс Log4Net, но причина, я действительно рекомендую это потому, что в этих двух примерах выше вы видите, что они вошли в консоль, но у вас есть множество возможных лесорубов, просто посмотрите на этот список:

log4net.Appender.AdoNetAppender: записывает события регистрации в базу данных с использованием либо подготовленных операторов, либо хранимых процедур.

log4net.Appender.AnsiColorTerminalAppender: Записывает цветные события регистрации событий в окно терминала ANSI.

log4net.Appender.AspNetTraceAppender: записывает события регистрации в контекст трассировки ASP. Затем их можно отобразить в конце страницы ASP или на странице трассировки ASP.

log4net.Appender.ColoredConsoleAppender: Записывает цветные события регистрации событий в консоль Windows приложения.

log4net.Appender.ConsoleAppender: записывает события регистрации в консоль приложения. События могут идти либо в стандартный поток или стандартный поток ошибок.

log4net.Appender.DebugAppender: записывает события регистрации в систему .NET.

log4net.Appender.EventLogAppender: записывает события регистрации в журнал событий Windows.

log4net.Appender.FileAppender: записывает события регистрации в файл в файловой системе.

log4net.Appender.LocalSyslogAppender: записывает события регистрации в локальную службу syslog (только для UNIX).

log4net.Appender.MemoryAppender: Сохраняет события регистрации в буфере памяти.

log4net.Appender.NetSendAppender: записывает события регистрации в службу Windows Messenger. Эти сообщения отображаются в диалоговом окне пользовательского терминала.

log4net.Appender.OutputDebugStringAppender: записывает события регистрации в отладчик. Если приложение не имеет отладчика, системный отладчик отображает строку. Если приложение не имеет отладчика, а системный отладчик неактивен, сообщение игнорируется.

log4net.Appender.RemoteSyslogAppender: записывает события регистрации в удаленную службу syslog с использованием сети UDP.

log4net.Appender.RemotingAppender: записывает события регистрации в удаленный приемник с использованием удаленного доступа .NET.

log4net.Appender.RollingFileAppender: записывает события регистрации в файл в файловой системе. RollingFileAppender может быть настроен на запись в несколько файлов на основе ограничений по дате или размеру файла.

log4net.Appender.SmtpAppender: отправляет события регистрации на адрес электронной почты.

log4net.Appender.SmtpPickupDirAppender: Отправляет записи событий на адрес электронной почты, но пишет электронные письма в настраиваемый каталог, а не отправлять их непосредственно через SMTP.

log4net.Appender.TelnetAppender: Клиенты подключаются через Telnet для получения событий регистрации.

log4net.Appender.TraceAppender: записывает события регистрации в систему трассировки .NET.

log4net.Appender.UdpAppender: Отправляет записи событий, как UDP датаграмм без установления соединения с удаленным хостом или группе многоадресной рассылки с использованием UdpClient.


Итак, как вы можете видеть, это чрезвычайно способно OOB. Я надеюсь, что этот пост был полезен.

+0

Это потрясающая вики для Log4Net! Отличная работа –

+0

@JasonJong, спасибо! Я рад, что могу внести свой вклад. –

+0

Хорошо, я укушу .. как вы устанавливаете этот пакет, чтобы я мог добавить ссылку на мой проект/решение? Если это имеет значение, я использую VS 2012. – Simpleton

Смежные вопросы