跳到主要内容

github/tai

公开

Tai · Windows 软件与网站使用时长统计。上游 Planshit/Tai 的源码镜像,非灵栈原创;MIT 许可。来源:https://github.com/Planshit/Tai 。本次为手动同步,暂不提供安装包。

浏览文件

Logger.cs

170 行 · 5.7 KB历史下载
1using Core.Servicers.Interfaces;
2using System;
3using System.Collections.Generic;
4using System.Diagnostics;
5using System.IO;
6using System.Linq;
7using System.Management;
8using System.Reflection;
9using System.Runtime.CompilerServices;
10using System.Text;
11using System.Threading.Tasks;
12using System.Windows.Forms;
13using System.Windows.Threading;
14
15namespace Core.Librarys
16{
17 public static class Logger
18 {
19 private const int threshold = 50;
20
21 private static readonly object writeLock = new object();
22
23 private static List<string> loggers = new List<string>();
24
25
26 static Logger()
27 {
28 // 创建计时器,定时保存log
29
30 DispatcherTimer dispatcherTimer = new DispatcherTimer();
31 dispatcherTimer.Interval = new TimeSpan(0, 5, 0);
32 dispatcherTimer.Tick += DispatcherTimer_Tick;
33 dispatcherTimer.Start();
34 }
35
36 private static void DispatcherTimer_Tick(object sender, EventArgs e)
37 {
38 Save(true);
39 }
40
41 private enum LogLevel
42 {
43 Info,
44 Warn,
45 Error,
46 }
47
48 public static void Info(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null)
49 {
50 message = message + "\r\nLine:" + callerLineNumber + ",File:" + callerFilePath + ",name:" + callerMemberName;
51 message = Fromat(LogLevel.Info, message);
52
53 loggers.Add(message);
54 }
55
56 public static void Warn(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null)
57 {
58 message = message + "\r\nLine:" + callerLineNumber + ",File:" + callerFilePath + ",name:" + callerMemberName;
59 message = Fromat(LogLevel.Warn, message);
60
61 loggers.Add(message);
62 }
63 public static void Error(string message, [CallerLineNumber] int callerLineNumber = -1, [CallerFilePath] string callerFilePath = null, [CallerMemberName] string callerMemberName = null)
64 {
65 message = message + "\r\nLine:" + callerLineNumber + ",File:" + callerFilePath + ",name:" + callerMemberName;
66 message = Fromat(LogLevel.Error, message);
67
68 loggers.Add(message);
69 }
70
71 private static string Fromat(LogLevel logLevel, string message)
72 {
73 message = HandleMessage(message);
74 string logText = $"[{logLevel}] {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}\r\n{message}\r\n------------------------\r\n\r\n";
75 Debug.WriteLine(logText);
76 return logText;
77 }
78
79 /// <summary>
80 /// 将log写入文件
81 /// </summary>
82 /// <param name="isNow">是否强制立即写入</param>
83 public static void Save(bool isNow = false)
84 {
85 if ((!isNow && loggers.Count < threshold) || loggers.Count == 0)
86 {
87 return;
88 }
89
90 try
91 {
92 Write(string.Join(string.Empty, loggers));
93 loggers.Clear();
94 }
95 catch (Exception ec)
96 {
97 Error(ec.ToString());
98 }
99 }
100
101 private static void Write(string log_)
102 {
103 try
104 {
105 lock (writeLock)
106 {
107 string loggerName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
108 "Log", DateTime.Now.ToString("yyyy-MM-dd") + ".log");
109 string dir = Path.GetDirectoryName(loggerName);
110 if (!Directory.Exists(dir))
111 {
112 Directory.CreateDirectory(dir);
113 }
114
115 if (!File.Exists(loggerName))
116 {
117 List<string> clientInfo = new List<string>(5);
118
119 // 记录客户端信息
120 clientInfo.Add(FromatItem("Core Version", Assembly.GetExecutingAssembly().GetName().Version.ToString()));
121 clientInfo.Add(FromatItem("OS Name", SystemCommon.GetWindowsVersionName()));
122 clientInfo.Add(FromatItem("Computer Type", GetComputerType()));
123 clientInfo.Add(FromatItem("Screen", GetScreenSize()));
124 clientInfo.Add("\r\n++++++++++++++++++++++++++++++++++++++++++++++++++\r\n\r\n");
125
126 File.WriteAllText(loggerName, string.Join("\r\n", clientInfo), Encoding.UTF8);
127 }
128 File.AppendAllText(loggerName, log_, Encoding.UTF8);
129 }
130 }
131 catch (Exception ec)
132 {
133 loggers.Add(log_);
134 Error(ec.ToString());
135 }
136 }
137
138
139 private static string GetScreenSize()
140 {
141 return SystemInformation.VirtualScreen.Width + "*" + SystemInformation.VirtualScreen.Height;
142 }
143
144 /// <summary>
145 /// 获取电脑设备类型
146 /// </summary>
147 /// <returns>Desktop台式机,Laptop笔记本</returns>
148 private static string GetComputerType()
149 {
150 if (SystemInformation.PowerStatus.BatteryChargeStatus == BatteryChargeStatus.NoSystemBattery)
151 {
152 return "Desktop";
153 }
154 else
155 {
156 return "Laptop";
157 }
158 }
159 private static string FromatItem(string name, string text)
160 {
161 return $"{name}:{text}";
162 }
163
164 private static string HandleMessage(string message)
165 {
166 message = message.Replace("\\u", "\\\\u");
167 return message;
168 }
169 }
170}