LogCtrl.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using DevExpress.Utils;
  2. using DevExpress.XtraEditors;
  3. using Ips.Library.Basic;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel;
  7. using System.Data;
  8. using System.Drawing;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. namespace Ips.Library.DxpLib
  14. {
  15. public partial class LogCtrl : XtraUserControl
  16. {
  17. public LogCtrl()
  18. {
  19. InitializeComponent();
  20. InitCtrl();
  21. IpsLogger.Logged += (self, e) =>
  22. {
  23. switch (e.LogType)
  24. {
  25. case LogType.Info:
  26. Serilog.Log.Information(e.Content);
  27. break;
  28. case LogType.Warn:
  29. Serilog.Log.Warning(e.Exception, e.Content);
  30. break;
  31. case LogType.Error:
  32. Serilog.Log.Error(e.Exception, e.Content);
  33. break;
  34. }
  35. if (e.WriteToUI)
  36. {
  37. if (e.Exception != null && !string.IsNullOrWhiteSpace(e.Exception.Message) && e.Content != e.Exception.Message)
  38. e.Content = $"{e.Content},{e.Exception.Message}";
  39. this.AddLog(e.LogType, e.Content);
  40. }
  41. };
  42. this.Dock = DockStyle.Fill;
  43. }
  44. public bool AutoMoveToLastLine { get; set; } = true;
  45. public LogType MinLevel { get; set; } = LogType.Info;
  46. SvgImageCollection _logTypeImgList;
  47. BindingList<LogInfo> LogList = new BindingList<LogInfo>();
  48. public void AddInfo(string msg)
  49. {
  50. AddLog(LogType.Info, msg);
  51. }
  52. public void AddWarn(string msg)
  53. {
  54. AddLog(LogType.Warn, msg);
  55. }
  56. public void AddError(string msg)
  57. {
  58. AddLog(LogType.Error, msg);
  59. }
  60. public void AddLog(LogType logType, string logContent)
  61. {
  62. if (logType < MinLevel) return;
  63. try
  64. {
  65. this.Invoke(() =>
  66. {
  67. LogList.Add(new LogInfo() { LogType = logType, LogTime = DateTime.Now, LogContent = logContent });
  68. while (LogList.Count > 2000)
  69. {
  70. LogList.RemoveAt(0);
  71. }
  72. if (AutoMoveToLastLine) gvLog.MoveLastVisible();
  73. });
  74. }
  75. catch (InvalidOperationException)
  76. {
  77. //屏蔽UI退出释放的异常
  78. }
  79. }
  80. private void InitCtrl()
  81. {
  82. repLogTypeImgCbx.Items.AddEnum<LogType>();
  83. for (int i = 0; i < repLogTypeImgCbx.Items.Count; i++) repLogTypeImgCbx.Items[i].ImageIndex = i;
  84. _logTypeImgList = new SvgImageCollection(this.components);
  85. ((System.ComponentModel.ISupportInitialize)(_logTypeImgList)).BeginInit();
  86. //_logTypeImgList.Add("next", "image://svgimages/arrows/next.svg");
  87. _logTypeImgList.Add("about", "image://svgimages/outlook inspired/about.svg");
  88. _logTypeImgList.Add("warning", "image://svgimages/status/warning.svg");
  89. _logTypeImgList.Add("highimportance", "image://svgimages/outlook inspired/highimportance.svg");
  90. ((System.ComponentModel.ISupportInitialize)(_logTypeImgList)).EndInit();
  91. repLogTypeImgCbx.SmallImages = _logTypeImgList;
  92. }
  93. private void LogCtrl_Load(object sender, EventArgs e)
  94. {
  95. grdLog.DataSource = LogList;
  96. }
  97. private void IpsLoggerLogged(object sender, IpsLogEventArg e)
  98. {
  99. AddLog(e.LogType, e.Content);
  100. }
  101. private void btnClearLog_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  102. {
  103. LogList.Clear();
  104. }
  105. private void btnCopyRow_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  106. {
  107. gvLog.CopyToClipboard();
  108. }
  109. private void btnCopyRowCell_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  110. {
  111. }
  112. private void btnAutoMoveToLast_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  113. {
  114. AutoMoveToLastLine = btnAutoMoveToLast.Checked;
  115. }
  116. private void gvLog_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)
  117. {
  118. btnCopyRow.Enabled = gvLog.FocusedRowObject != null;
  119. logMenu.ShowPopup(Cursor.Position);
  120. }
  121. }
  122. public class LogInfo
  123. {
  124. public LogType LogType { get; set; }
  125. public DateTime LogTime { get; set; }
  126. public string LogContent { get; set; }
  127. }
  128. }