Регистрация с помощью NLog в изолированном хранилище

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

Ответы спасибо 4

Ответ 1

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

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

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

Наконец, 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.

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

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

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