| | |
| | | using System.Data; |
| | | using System.IO; |
| | | using System.Linq; |
| | | using System.Threading.Tasks; |
| | | using System.Timers; |
| | | using System.Windows; |
| | | using System.Windows.Controls; |
| | |
| | | |
| | | private Timer autoRfhTimer; |
| | | |
| | | private long pageSize = 50; |
| | | |
| | | private long currentPage = 1; |
| | | public long CurrentPage |
| | | { |
| | | get => currentPage; |
| | | set |
| | | { |
| | | Set(ref currentPage, value); |
| | | Filtrate(value, pageSize); |
| | | } |
| | | } |
| | | |
| | | private long maxPage = 1; |
| | | public long MaxPage |
| | | { |
| | | get => maxPage; |
| | | set |
| | | { |
| | | Set(ref maxPage, value); |
| | | } |
| | | } |
| | | |
| | | |
| | | public LogViewer() |
| | | { |
| | | DataContext = this; |
| | | autoRfhTimer = new Timer |
| | | { |
| | | Enabled = false, |
| | | Interval = 1500, |
| | | AutoReset = false |
| | | }; |
| | | autoRfhTimer.Elapsed += AutoRfhTimer_Elapsed; |
| | | InitializeComponent(); |
| | | QueryReset(); |
| | | } |
| | | |
| | | public override void InitFinish() |
| | |
| | | //} |
| | | } |
| | | |
| | | |
| | | private void UserControl_Loaded(object sender, RoutedEventArgs e) |
| | | { |
| | | autoRfhTimer = new Timer |
| | | { |
| | | Enabled = false, |
| | | Interval = 1000 |
| | | }; |
| | | autoRfhTimer.Elapsed += AutoRfhTimer_Elapsed; |
| | | Loaded -= UserControl_Loaded; |
| | | } |
| | | |
| | |
| | | { |
| | | Refresh100items(); |
| | | } |
| | | |
| | | //private void RefreshTable() { |
| | | // if(CurrentPage == ) |
| | | //} |
| | | |
| | | private void Button_Click(object sender, RoutedEventArgs e) |
| | | { |
| | |
| | | break; |
| | | case "resetBtn": |
| | | QueryReset(); |
| | | CurrentPage = 1; |
| | | break; |
| | | case "exportBtn": |
| | | DoExport(); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | |
| | | private void DoExport() { |
| | | |
| | | } |
| | | |
| | | private void QueryLog() |
| | |
| | | return; |
| | | } |
| | | |
| | | queryBtn.IsEnabled = false; |
| | | autoRfhInput.IsEnabled = false; |
| | | Filtrate(); |
| | | AutoRfh = false; |
| | | //queryBtn.IsEnabled = false; |
| | | //autoRfhInput.IsEnabled = false; |
| | | CurrentPage = 1; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | |
| | | private void QueryReset() |
| | | { |
| | | var today = DateTime.Now; |
| | | var start = DateTime.Parse(today.ToString("yyyy-MM-dd 00:00:00")).AddDays(-7); |
| | | var end = DateTime.Parse(today.ToString("yyyy-MM-dd 00:00:00")).AddDays(1); |
| | | |
| | | levelInput.Text = null; |
| | | startTimeInput.SelectedDateTime = null; |
| | | endTimeInput.SelectedDateTime = null; |
| | | startTimeInput.Text = null; |
| | | table.ItemsSource = null; |
| | | startTimeInput.SelectedDateTime = start; |
| | | endTimeInput.SelectedDateTime = end; |
| | | } |
| | | |
| | | private void Filtrate() |
| | | private void Filtrate(long page, long size) |
| | | { |
| | | string str = LoadSql(); |
| | | DataTable dt = new DataTable(); |
| | | var files = GetOldDbFiles(PathHelper.LogViewerDir, new DateTime?[] { startTimeInput.SelectedDateTime, |
| | | endTimeInput.SelectedDateTime }); |
| | | foreach (string file in files) |
| | | try |
| | | { |
| | | SqliteHelper sql = new SqliteHelper(file); |
| | | dt.Merge(sql.GetDataTable(str)); |
| | | sql.Close(); |
| | | var files = GetOldDbFiles(PathHelper.LogViewerDir, new DateTime?[] { startTimeInput.SelectedDateTime, |
| | | endTimeInput.SelectedDateTime }); |
| | | if (files.Length <= 0) |
| | | { |
| | | table.ItemsSource = new DataTable().DefaultView; |
| | | return; |
| | | } |
| | | |
| | | using (Sqlite3Helper helper = new Sqlite3Helper(files[0])) |
| | | { |
| | | for (int i = 0; i < files.Length; i++) |
| | | { |
| | | var attach = $"ATTACH DATABASE '{files[i]}' AS 'db{i}'"; |
| | | helper.Execute(attach); |
| | | } |
| | | |
| | | string sql = string.Join(" UNION ALL ", GetSqls(files)); |
| | | |
| | | string sortName = "time", sortDirection = "DESC"; |
| | | |
| | | string baseSql = $"SELECT level,time,source,text FROM ({sql}) as _temp"; |
| | | |
| | | string countSql = $"SELECT COUNT(1) FROM ({sql}) as __temp"; |
| | | |
| | | long total = (long)helper.SelectOne(countSql); |
| | | long pages = (total/pageSize)+ ((total % pageSize) > 0 ? 1 : 0); |
| | | |
| | | sql = $"{baseSql} ORDER BY {sortName} {sortDirection} LIMIT {size} OFFSET {(page - 1) * size} "; |
| | | |
| | | DataTable dt = helper.GetDataTable(sql); |
| | | table.ItemsSource = dt.DefaultView; |
| | | |
| | | MaxPage = pages; |
| | | } |
| | | |
| | | } |
| | | dt.DefaultView.Sort = "time Desc"; |
| | | table.ItemsSource = dt.DefaultView; |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Select Log Error.", ex); |
| | | MsgBoxHelper2.Error($"查询失败: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | public static string[] GetOldDbFiles(string folderPath, DateTime?[] range) |
| | |
| | | var lastWriteTime = File.GetLastWriteTime(file); |
| | | bool flag = true; |
| | | if (range[0] != null) flag &= lastWriteTime >= range[0]; |
| | | if (range[1] != null) flag &= lastWriteTime <= range[1]; |
| | | //if (range[1] != null) flag &= lastWriteTime <= range[1]; |
| | | return flag; |
| | | }).ToArray(); |
| | | }).OrderByDescending(f => f).ToArray(); |
| | | |
| | | return oldFiles; |
| | | } |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 加载界面判断数据库语句 |
| | | /// |
| | | /// </summary> |
| | | /// <returns> str数据库的语句 </returns> |
| | | private string LoadSql() |
| | | /// <param name="files"></param> |
| | | /// <returns></returns> |
| | | private string[] GetSqls(string[] files) |
| | | { |
| | | string sql = " select level,time,source,text from log"; |
| | | List<string> datas = new List<string>(); |
| | | if (!string.IsNullOrEmpty(levelInput.Text)) |
| | | string[] sqls = new string[files.Length]; |
| | | for (int i = 0; i < files.Length; i++) |
| | | { |
| | | datas.Add($"level='{levelInput.Text}'"); |
| | | } |
| | | if (!string.IsNullOrEmpty(startTimeInput.Text)) |
| | | { |
| | | datas.Add($"time>='{startTimeInput.Text}'"); |
| | | } |
| | | if (!string.IsNullOrEmpty(endTimeInput.Text)) |
| | | { |
| | | datas.Add($"time<='{endTimeInput.Text}'"); |
| | | } |
| | | if (!string.IsNullOrEmpty(sourceInput.Text)) |
| | | { |
| | | datas.Add($"source='{sourceInput.Text}'"); |
| | | } |
| | | string sql = $"SELECT level,time,source,text FROM db{i}.log"; |
| | | List<string> datas = new List<string>(); |
| | | if (!string.IsNullOrEmpty(levelInput.Text)) |
| | | { |
| | | datas.Add($"level='{levelInput.Text}'"); |
| | | } |
| | | if (!string.IsNullOrEmpty(startTimeInput.Text)) |
| | | { |
| | | datas.Add($"time>='{startTimeInput.Text}'"); |
| | | } |
| | | if (!string.IsNullOrEmpty(endTimeInput.Text)) |
| | | { |
| | | datas.Add($"time<'{endTimeInput.Text}'"); |
| | | } |
| | | if (!string.IsNullOrEmpty(sourceInput.Text)) |
| | | { |
| | | datas.Add($"source='{sourceInput.Text}'"); |
| | | } |
| | | |
| | | string condition = string.Join(" AND ", datas); |
| | | condition = string.IsNullOrEmpty(condition) ? string.Empty : $" WHERE {condition}"; |
| | | |
| | | sql = $"{sql}{condition} order by time desc"; |
| | | return sql; |
| | | string condition = string.Join(" AND ", datas); |
| | | condition = string.IsNullOrEmpty(condition) ? string.Empty : $" WHERE {condition}"; |
| | | sql = $"{sql}{condition}"; |
| | | sqls[i] = sql; |
| | | } |
| | | return sqls; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// </summary> |
| | | private void Refresh100items() |
| | | { |
| | | //try |
| | | //{ |
| | | // 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 () |
| | | // { |
| | | // table.ItemsSource = dt.DefaultView; |
| | | // }); |
| | | //} |
| | | //catch (Exception ex) |
| | | //{ |
| | | // log.Error("Log Auto Refresh Failed.", ex); |
| | | // this.Error($"自动刷新失败!{ex.Message}"); |
| | | //} |
| | | autoRfhTimer.Enabled = false; |
| | | Task.Run(() => |
| | | { |
| | | try |
| | | { |
| | | 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; |
| | | MaxPage = 1; |
| | | }); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | log.Error("Log Auto Refresh Failed.", ex); |
| | | this.Error($"自动刷新失败!{ex.Message}"); |
| | | } |
| | | finally |
| | | { |
| | | this.Dispatcher.BeginInvoke((Action)delegate () |
| | | { |
| | | autoRfhTimer.Enabled = AutoRfh; |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |