using HMI.Base;
|
using HMI.Core.Util;
|
using HMI.UI.Util;
|
using System;
|
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;
|
|
namespace HMI.LogViewer
|
{
|
/// <summary>
|
/// UserControl1.xaml 的交互逻辑
|
/// </summary>
|
public partial class LogViewer : PluginControl
|
{
|
|
private bool autoRfh;
|
|
public bool AutoRfh
|
{
|
get { return autoRfh; }
|
set
|
{
|
Set(ref autoRfh, value);
|
if (autoRfhTimer != null) autoRfhTimer.Enabled = value;
|
}
|
}
|
|
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()
|
{
|
//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,
|
// 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)
|
{
|
Loaded -= UserControl_Loaded;
|
}
|
|
private void AutoRfhTimer_Elapsed(object sender, ElapsedEventArgs e)
|
{
|
Refresh100items();
|
}
|
|
//private void RefreshTable() {
|
// if(CurrentPage == )
|
//}
|
|
private void Button_Click(object sender, RoutedEventArgs e)
|
{
|
Button btn = sender as Button;
|
switch (btn.Name)
|
{
|
case "queryBtn":
|
QueryLog();
|
break;
|
case "resetBtn":
|
QueryReset();
|
CurrentPage = 1;
|
break;
|
case "exportBtn":
|
DoExport();
|
break;
|
default:
|
break;
|
}
|
}
|
|
private void DoExport() {
|
|
}
|
|
private void QueryLog()
|
{
|
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;
|
}
|
|
AutoRfh = false;
|
//queryBtn.IsEnabled = false;
|
//autoRfhInput.IsEnabled = false;
|
CurrentPage = 1;
|
}
|
catch (Exception ex)
|
{
|
log.Error("Log Query Failed.", ex);
|
this.Error($"查询失败!{ex.Message}");
|
}
|
finally
|
{
|
queryBtn.IsEnabled = true;
|
autoRfhInput.IsEnabled = true;
|
}
|
}
|
|
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 = start;
|
endTimeInput.SelectedDateTime = end;
|
}
|
|
private void Filtrate(long page, long size)
|
{
|
try
|
{
|
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;
|
}
|
|
}
|
catch (Exception ex)
|
{
|
log.Error("Select Log Error.", ex);
|
MsgBoxHelper2.Error($"查询失败: {ex.Message}");
|
}
|
}
|
|
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>
|
///
|
/// </summary>
|
/// <param name="files"></param>
|
/// <returns></returns>
|
private string[] GetSqls(string[] files)
|
{
|
string[] sqls = new string[files.Length];
|
for (int i = 0; i < files.Length; i++)
|
{
|
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}";
|
sqls[i] = sql;
|
}
|
return sqls;
|
}
|
|
/// <summary>
|
/// 刷新100条数据
|
/// </summary>
|
private void Refresh100items()
|
{
|
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;
|
});
|
}
|
});
|
}
|
}
|
}
|