3

我在我的 C# Win Forms 中使用 NLog 库 (http://nlog-project.org/) 来进行日志记录。如果可以使用此 NLogger 将日志文件写入“隔离存储”,有没有人有经验?

谢谢 4 个答案

4

1 回答 1

4

我没有在 Silverlight 中使用过 NLog,但是一个新版本 2.0 刚刚发布为 beta 版,它可以在 Silverlight 中使用(网站上有一些示例)。我还没有见过一个独立的存储目标,但我敢打赌,写一个并不难。

此链接显示(在克里斯蒂安的回答中)一种“记录”到隔离存储的方法。我无法评论这是否是一个好主意。有了这些信息,您可能可以编写一个 NLog 目标,该目标可以配置到 NLog 中,以便 NLog 记录器可以写入隔离存储。

这是另一个记录到隔离存储的示例(在 Chris S 的回答中)。

最后,NLog 2.0 确实带有我认为可从 Silverlight 客户端使用的 LogReceiveService 和 LogReceiverServiceTarget。我还没有这样做,所以我无法评论它们是否有效或它们是如何工作的。

以克里斯蒂安的例子为例,你可以做这样的事情(我没有尝试过):

[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 来做到这一点。

也许允许指定文件名而不是使用硬编码的文件名会很好。

一些错误处理可能很有用。至少检测隔离存储是否已用尽并且可能正常(或静默)失败。

如果你走这条路,祝你好运!报告你是否成功。

于 2010-10-26T21:22:20.470 回答