我有一个长期运行的" WPF桌面应用程序,它使用NLog和NLogViewer显示运行时状态。它用于监视数据库,获取处理请求,然后记录结果。 (是的 - 应该是一个服务,但我们想先从这个方式开始 - 婴儿步骤。)结果记录到文本日志文件中,NLogViewer实时显示日志中的当前项目。
应用程序运行几个小时之后,我发现我只能查看日志的一部分 - 从当前条目返回到早一个小时左右。滚动条让我向下滚动到最新的条目,但在第一个条目之前停止。此时,还没有很多日志记录正在进行,即没有调试或跟踪,只有信息,警告和错误,所以我不认为日志的大小会产生影响。< / p>
有没有办法让NLogViewer让我查看整个日志文件,还是只显示一个有限的日志窗口?是否有备用NLog查看器WPF控件?我此时并没有真正看到一个独立的NLog查看器。如果您需要更多信息,请告诉我。
谢谢!
编辑:我有时间重新审视这个问题并从GitHub获得NLogViewer源代码。在视图的代码隐藏中,对于ListView的项目源中保留的条目数,硬编码值为50。对于超过50的每个项目,将从日志的开头删除一个项目。当然,我可以下载源代码并根据自己的喜好对其进行修改,这可能是最终的解决方案,因为项目在3年内没有更新。但是,我可能会尝试查看是否可以在原始控件周围创建一个包装器,并允许一些基本扩展,例如要显示的可配置数量的日志条目,并始终显示添加的最后一个条目。如果我有任何成功,我会发布我的所作所为。
答案 0 :(得分:1)
我制作了NLogViewer
的新版本。没有任何限制。您还可以根据需要更改样式
答案 1 :(得分:0)
我昨天花了很多时间研究这个问题,试图用新的行为或属性扩展现有的类。最大的问题是受保护方法中的硬编码50个条目,我无法访问或覆盖。由于NLogViewer控件是用XAML定义的,因此我不能轻易地将它与一个非XAML&#34; class(编译错误)。最后,使用原始源代码并制作一些mod来获得所需的结果似乎更简单。
我做了以下更改:
我在NLogViewer中添加了2个属性&#34;查看&#34;:
[Description("Automatically scroll last entry into view?"), Category("Data")]
public bool ScrollIntoView { get; set; } = true;
[Description("How many log entries should be kept in memory."), Category("Data")]
public int VisibleEntryCount { get; set; } = 50; // Original code default
这些将控制最后一个日志条目是否滚动到视图中以及可以显示多少个日志条目。
我修改了现有的LogReceived处理程序以使用VisibleEntryCount属性。
protected void LogReceived(NLog.Common.AsyncLogEventInfo log)
{
LogEventViewModel vm = new LogEventViewModel(log.LogEvent);
if (this.VisibleEntryCount == 0)
{
this.VisibleEntryCount = 50; // Original code default.
}
this.Dispatcher.BeginInvoke(new Action(() =>
{
if (this.LogEntries.Count >= this.VisibleEntryCount)
{
// We've reached our limit.
this.LogEntries.RemoveAt(0);
}
this.LogEntries.Add(vm);
}));
}
每当添加新的日志条目时,我都会添加一个新的事件处理程序。这将让我确保最后一个条目始终可见(如果用户指定)。
private void LogEntries_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (this.ScrollIntoView)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
if (this.logView != null)
{
int count = this.LogEntries.Count;
object selectedItem = (count > 0) ? this.LogEntries[count - 1] : null;
if (selectedItem != null)
{
this.logView.Dispatcher.BeginInvoke((Action)(() =>
{
this.logView.UpdateLayout();
this.logView.ScrollIntoView(selectedItem);
}));
}
}
}
}
}
似乎工作正常。与往常一样,我可以接受其他解决方案或建议。谢谢!