| | |
| | | using System.Collections.Generic; |
| | | using System.Data; |
| | | using System.IO; |
| | | using System.Linq; |
| | | using System.Threading.Tasks; |
| | | using System.Timers; |
| | | using System.Windows; |
| | | using System.Windows.Controls; |
| | |
| | | /// </summary> |
| | | public partial class LogViewer : PluginControl |
| | | { |
| | | private string logDir; |
| | | private string todayLogFile; |
| | | |
| | | private bool autoRfh; |
| | | |
| | |
| | | |
| | | private Timer autoRfhTimer; |
| | | |
| | | private int currentPage = 1; |
| | | public int CurrentPage |
| | | { |
| | | get => currentPage; |
| | | set |
| | | { |
| | | Set(ref currentPage, value); |
| | | } |
| | | } |
| | | |
| | | private int maxPage = 0; |
| | | public int MaxPage |
| | | { |
| | | get => maxPage; |
| | | set |
| | | { |
| | | Set(ref currentPage, value); |
| | | } |
| | | } |
| | | |
| | | |
| | | public LogViewer() |
| | | { |
| | | string logDir = Path.Combine(PathHelper.AppFolder, "Log"); |
| | | todayLogFile = Path.Combine(logDir, $"log{DateTime.Now.ToString("yyyy-MM-dd")}.db"); |
| | | |
| | | if (!Directory.Exists(logDir)) |
| | | { |
| | | Directory.CreateDirectory(logDir); |
| | | } |
| | | this.logDir = logDir; |
| | | DataContext = this; |
| | | autoRfhTimer = new Timer |
| | | { |
| | | Enabled = false, |
| | | Interval = 1500, |
| | | AutoReset = false |
| | | }; |
| | | autoRfhTimer.Elapsed += AutoRfhTimer_Elapsed; |
| | | InitializeComponent(); |
| | | } |
| | | |
| | | public override void InitFinish() |
| | | { |
| | | base.InitFinish(); |
| | | string baseFile = Path.Combine(logDir, "log.db"); |
| | | //base.InitFinish(); |
| | | //string baseFile = Path.Combine(logDir, "log.db"); |
| | | |
| | | try |
| | | { |
| | | if (!File.Exists(baseFile)) |
| | | { |
| | | SqliteHelper.CreateDatabase(baseFile); |
| | | } |
| | | SqliteHelper sqliteHelper = new SqliteHelper(baseFile); |
| | | sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS log ( |
| | | id INTEGER PRIMARY KEY AUTOINCREMENT, |
| | | type TEXT NOT NULL, |
| | | text TEXT NOT NULL, |
| | | source TEXT, |
| | | time TIME |
| | | );"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Create Log File Failed.", ex); |
| | | } |
| | | //try |
| | | //{ |
| | | // if (!File.Exists(baseFile)) |
| | | // { |
| | | // SqliteHelper.CreateDatabase(baseFile); |
| | | // } |
| | | // SqliteHelper sqliteHelper = new SqliteHelper(baseFile); |
| | | // sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS log ( |
| | | // id INTEGER PRIMARY KEY AUTOINCREMENT, |
| | | // level TEXT NOT NULL, |
| | | // text TEXT NOT NULL, |
| | | // source TEXT, |
| | | // time TIME |
| | | // );"); |
| | | //} |
| | | //catch (Exception ex) |
| | | //{ |
| | | // log.Error("Create Log File Failed.", ex); |
| | | //} |
| | | } |
| | | |
| | | |
| | | private void UserControl_Loaded(object sender, RoutedEventArgs e) |
| | | { |
| | | autoRfhTimer = new Timer |
| | | { |
| | | Enabled = false, |
| | | Interval = 1000 |
| | | }; |
| | | autoRfhTimer.Elapsed += AutoRfhTimer_Elapsed; |
| | | Loaded -= UserControl_Loaded; |
| | | } |
| | | |
| | |
| | | { |
| | | try |
| | | { |
| | | if (startTimeInput.SelectedDateTime == null && endTimeInput.SelectedDateTime == null) |
| | | { |
| | | ToastHelper.Error(this.lang("log.timeCantBeNull")); |
| | | return; |
| | | } |
| | | |
| | | if (endTimeInput.SelectedDateTime != null && startTimeInput.SelectedDateTime != null && |
| | | endTimeInput.SelectedDateTime < startTimeInput.SelectedDateTime) |
| | | { |
| | | ToastHelper.Error(this.lang("log.timeRangeError")); |
| | | return; |
| | | } |
| | | |
| | | queryBtn.IsEnabled = false; |
| | | autoRfhInput.IsEnabled = false; |
| | | Filtrate(); |
| | | queryBtn.IsEnabled = true; |
| | | autoRfhInput.IsEnabled = true; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Log Query Failed.", ex); |
| | | this.Error($"查询失败!{ex.Message}"); |
| | | } |
| | | finally |
| | | { |
| | | queryBtn.IsEnabled = true; |
| | | autoRfhInput.IsEnabled = true; |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | string str = LoadSql(); |
| | | DataTable dt = new DataTable(); |
| | | var files = Directory.GetFiles(logDir, "*.db"); |
| | | var files = GetOldDbFiles(PathHelper.LogViewerDir, new DateTime?[] { startTimeInput.SelectedDateTime, |
| | | endTimeInput.SelectedDateTime }); |
| | | foreach (string file in files) |
| | | { |
| | | SqliteHelper sql = new SqliteHelper(file); |
| | | dt.Merge(sql.GetDataTable(str)); |
| | | sql.Close(); |
| | | using (SqliteHelper sql = new SqliteHelper(file)) |
| | | { |
| | | dt.Merge(sql.GetDataTable(str)); |
| | | } |
| | | } |
| | | |
| | | dt.DefaultView.Sort = "time Desc"; |
| | | if (dt.Rows.Count > 0) |
| | | { |
| | | dt.DefaultView.Sort = "time Desc"; |
| | | } |
| | | table.ItemsSource = dt.DefaultView; |
| | | } |
| | | |
| | | public static string[] GetOldDbFiles(string folderPath, DateTime?[] range) |
| | | { |
| | | if (!Directory.Exists(folderPath)) |
| | | { |
| | | return new string[0]; |
| | | } |
| | | // 获取所有.db文件并筛选出7天前更新的文件 |
| | | var oldFiles = Directory.GetFiles(folderPath, "*.db"); |
| | | try |
| | | { |
| | | oldFiles = oldFiles.Where(file => |
| | | { |
| | | var lastWriteTime = File.GetLastWriteTime(file); |
| | | bool flag = true; |
| | | if (range[0] != null) flag &= lastWriteTime >= range[0]; |
| | | //if (range[1] != null) flag &= lastWriteTime <= range[1]; |
| | | return flag; |
| | | }).OrderByDescending(f => f).ToArray(); |
| | | |
| | | return oldFiles; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return new string[0]; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// <returns> str数据库的语句 </returns> |
| | | private string LoadSql() |
| | | { |
| | | string sql = " select type,time,source,text from log"; |
| | | |
| | | string sql = " select level,time,source,text from log"; |
| | | List<string> datas = new List<string>(); |
| | | if (!string.IsNullOrEmpty(levelInput.Text)) |
| | | { |
| | | datas.Add($"type='{levelInput.Text}'"); |
| | | datas.Add($"level='{levelInput.Text}'"); |
| | | } |
| | | if (!string.IsNullOrEmpty(startTimeInput.Text)) |
| | | { |
| | |
| | | /// </summary> |
| | | private void Refresh100items() |
| | | { |
| | | try |
| | | autoRfhTimer.Enabled = false; |
| | | Task.Run(() => |
| | | { |
| | | if (!File.Exists(todayLogFile)) return; |
| | | string str = "select type,time,source,text from log order by time desc limit 100"; |
| | | SqliteHelper sql = new SqliteHelper(todayLogFile); |
| | | var dt = sql.GetDataTable(str); |
| | | this.Dispatcher.BeginInvoke((Action)delegate () |
| | | try |
| | | { |
| | | table.ItemsSource = dt.DefaultView; |
| | | }); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Log Auto Refresh Failed.", ex); |
| | | this.Error($"自动刷新失败!{ex.Message}"); |
| | | } |
| | | string todayLogFile = Path.Combine(PathHelper.LogViewerDir, $"log_{DateTime.Today:yyyy-MM-dd}.db"); |
| | | if (!File.Exists(todayLogFile)) return; |
| | | string str = "select level,time,source,text from log order by time desc limit 100"; |
| | | using (SqliteHelper sql = new SqliteHelper(todayLogFile)) |
| | | { |
| | | var dt = sql.GetDataTable(str); |
| | | this.Dispatcher.BeginInvoke((Action)delegate () |
| | | { |
| | | table.ItemsSource = dt.DefaultView; |
| | | }); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Log Auto Refresh Failed.", ex); |
| | | this.Error($"自动刷新失败!{ex.Message}"); |
| | | } |
| | | finally |
| | | { |
| | | this.Dispatcher.BeginInvoke((Action)delegate () |
| | | { |
| | | autoRfhTimer.Enabled = AutoRfh; |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |