86 lines
2.7 KiB
C#
86 lines
2.7 KiB
C#
|
|
using System;
|
|||
|
|
using System.Diagnostics;
|
|||
|
|
using System.Text;
|
|||
|
|
using NLog;
|
|||
|
|
using Prism.Events;
|
|||
|
|
using Prism.Regions;
|
|||
|
|
using RIZO_Application.Core;
|
|||
|
|
using RIZO_Application.Core.Mvvm;
|
|||
|
|
|
|||
|
|
namespace RIZO_Application.Modules.LogModule.ViewModels
|
|||
|
|
{
|
|||
|
|
public class SystemLogViewModel : RegionViewModelBase
|
|||
|
|
{
|
|||
|
|
private readonly IEventAggregator _eventAggregator;
|
|||
|
|
private SubscriptionToken _token;
|
|||
|
|
private readonly StringBuilder _logMessageBuilder = new StringBuilder();
|
|||
|
|
private Logger _logger = LogManager.GetCurrentClassLogger();
|
|||
|
|
private const int MaxLogLength = 1000; // 假设最大长度为1000,可以根据实际情况调整
|
|||
|
|
private const string LogFormat = "\n{0}: {1}";
|
|||
|
|
|
|||
|
|
// 定义一个日志更新事件
|
|||
|
|
public event EventHandler LogUpdated;
|
|||
|
|
|
|||
|
|
public string LogMessage
|
|||
|
|
{
|
|||
|
|
get { return _logMessageBuilder.ToString(); }
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_logMessageBuilder.Clear();
|
|||
|
|
_logMessageBuilder.Append(value);
|
|||
|
|
RaisePropertyChanged(nameof(LogMessage));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public SystemLogViewModel(
|
|||
|
|
IRegionManager regionManager,
|
|||
|
|
IEventAggregator eventAggregator)
|
|||
|
|
: base(regionManager)
|
|||
|
|
{
|
|||
|
|
OnLogReceived("初始化日志系统");
|
|||
|
|
_eventAggregator = eventAggregator;
|
|||
|
|
// 订阅事件,使用UI线程处理,保持强引用
|
|||
|
|
_token = _eventAggregator.GetEvent<SystemLogEvent>().Subscribe(OnLogReceived, ThreadOption.UIThread, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void OnLogReceived(string message)
|
|||
|
|
{
|
|||
|
|
string newLog = string.Format(LogFormat, DateTime.Now, message);
|
|||
|
|
_logMessageBuilder.Append(newLog);
|
|||
|
|
|
|||
|
|
if (_logMessageBuilder.Length > MaxLogLength)
|
|||
|
|
{
|
|||
|
|
// 计算需要截取的位置,保留最新的日志
|
|||
|
|
int startIndex = Math.Max(0, _logMessageBuilder.Length - MaxLogLength);
|
|||
|
|
_logMessageBuilder.Remove(0, startIndex);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
RaisePropertyChanged(nameof(LogMessage));
|
|||
|
|
_logger.Info(newLog);
|
|||
|
|
|
|||
|
|
// 触发日志更新事件
|
|||
|
|
OnLogUpdated();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected virtual void OnLogUpdated()
|
|||
|
|
{
|
|||
|
|
LogUpdated?.Invoke(this, EventArgs.Empty);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Destroy()
|
|||
|
|
{
|
|||
|
|
_token?.Dispose();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void AddTestLogMessage()
|
|||
|
|
{
|
|||
|
|
// 示例实现,可根据需求修改
|
|||
|
|
OnLogReceived("测试日志消息");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void OnNavigatedTo(NavigationContext navigationContext)
|
|||
|
|
{
|
|||
|
|
//do something
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|