Вход с NLog в изолированное хранилище - PullRequest
3 голосов
/ 26 октября 2010

Я использую библиотеку NLog (http://nlog -project.org /) в своих C # Win Forms для ведения журналов.У кого-нибудь есть опыт, если возможно записать файл журнала в «IsolatedStorage» с этим NLogger?

Thx 4 ответов

1 Ответ

4 голосов
/ 27 октября 2010

Я не использовал NLog в Silverlight, но новая версия 2.0 только что была выпущена в бета-версии, и ее можно использовать в Silverlight (на сайте есть несколько примеров).Я не видел изолированную цель хранения, но держу пари, что написать ее будет несложно.

Эта ссылка показывает (в ответе Кристиана) один из способов «войти» в изолированное хранилище.,Я не могу комментировать, является ли это хорошей идеей.С этой информацией вы, вероятно, могли бы написать NLog Target, который мог бы быть сконфигурирован в NLog, чтобы регистраторы NLog могли выполнять запись в изолированное хранилище.

Вот еще один пример (в ответе Криса С.) регистрации в изолированном хранилище.

Наконец, NLog 2.0 поставляется с LogReceiveService и LogReceiverServiceTarget, которые, как мне кажется, можно использовать из клиента Silverlight.Я не сделал этого, поэтому я не могу комментировать, работают ли они или как они работают.

Следуя примеру Кристиана, вы могли бы сделать что-то подобное (я не пробовал этого):

[Target("IsolatedStorage")]
public sealed class IsolatedStorageTarget : TargetWithLayout    
{        
  public IsolatedStorageTarget()
  {            
  }
  protected override void Write(LogEventInfo logEvent)        
  {
    try 
    { 
      using (IsolatedStorageFile store = 
             IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
        using (Stream stream = new IsolatedStorageFileStream
               ("Solution.Silverlight.log", FileMode.Append, FileAccess.Write, store)) 
        { 
          StreamWriter writer = new StreamWriter(stream); 
          writer.WriteLine(this.Layout.Render(logEvent));
        } 
        writer.Close(); 
      } 
    } 
    catch (Exception ex) 
    { 
    } 
  }
}

Некоторые вещи, которые я могу придумать, могут улучшить это:

Может быть, лучше сохранить поток и файл открытыми, пока цель жива.Возможно, это можно сделать, переопределив InitializeTarget и CloseTarget.

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

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

Если вы идете по этому пути, удачи!Сообщите, успешны ли вы или нет.

...