public void Typical( MockFileSystem fs, LogCleaner cleaner) { cleaner.LogSettings.LogFolder.Returns(new DirectoryPath("C:/logs")); cleaner.LogSettings.DateFormat.Returns(Log.DateFormat); cleaner.NowProvider.NowLocal.Returns(new DateTime(2021, 9, 16)); fs.Directory.CreateDirectory("C:/logs"); var keepDir = $"C:/logs/{new DateTime(2021, 9, 15).ToString(Log.DateFormat)}"; fs.Directory.CreateDirectory($"C:/logs/{new DateTime(2021, 9, 15).ToString(Log.DateFormat)}"); var keepFile = Path.Combine(keepDir, "SomeFile"); fs.File.Create(keepFile); var deleteDir = $"C:/logs/{new DateTime(2021, 9, 6).ToString(Log.DateFormat)}"; fs.Directory.CreateDirectory(deleteDir); var deleteFile = Path.Combine(deleteDir, "SomeFile"); fs.File.Create(deleteFile); cleaner.Start(); fs.Directory.Exists(keepDir).Should().BeTrue(); fs.File.Exists(keepFile).Should().BeTrue(); fs.Directory.Exists(deleteDir).Should().BeFalse(); fs.File.Exists(deleteFile).Should().BeFalse(); }
public void Clean_ShouldSkipLockedFile() { // Arrange const string logPath = nameof(Clean_ShouldSkipLockedFile); CreateEmptyDirectory(logPath); var files = new[] { "file2.log", "file1.log", "file.log" }.Select(f => Path.Combine(logPath, f)).ToList(); files.ForEach(CreateEmptyFile); File.SetCreationTimeUtc(files[0], new DateTime(2000, 01, 01, 0, 10, 0)); File.SetCreationTimeUtc(files[1], new DateTime(2000, 01, 01, 0, 20, 0)); File.SetCreationTimeUtc(files[2], new DateTime(2000, 01, 01, 0, 30, 0)); var cleaner = new LogCleaner(_logger); // Act using (File.OpenRead(files[1])) { cleaner.Clean(logPath, 0); } var result = Directory.GetFiles(logPath).Select(Path.GetFileName); // Assert result.Should().HaveCount(1) .And.Contain(new[] { "file1.log" }); }
private void InitializeApplication() { AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; Version = Assembly.GetExecutingAssembly().GetName().Version; LogProvider.Log.Info(string.Format("--------------- PPPoker Card Catcher (v.{0}) ---------------", Version)); LogProvider.Log.Info(string.Format("OsVersion: {0}", Environment.OSVersion)); LogProvider.Log.Info(string.Format("Current Culture: {0}", Thread.CurrentThread.CurrentCulture)); LogProvider.Log.Info(string.Format("Current UI Culture: {0}", Thread.CurrentThread.CurrentUICulture)); ValidateLicenseAssemblies(); ResourceRegistrator.Initialization(); if (IsCheckForUpdates()) { CheckUpdates(); } LogCleaner.ClearLogsFolder(); /* Without this user won't be able to input decimal point for float bindings if UpdateSourceTrigger set to PropertyChanged */ FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false; }
private void InitializeApplication(GeneralSettingsModel generalSettingsModel) { AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; Version = Assembly.GetExecutingAssembly().GetName().Version; LogProvider.Log.Info(string.Format("---------------=============== Initialize DriveHUD (v.{0}) ===============---------------", Version)); LogProvider.Log.Info(string.Format("OsVersion: {0}", Environment.OSVersion)); LogProvider.Log.Info(string.Format("Current Culture: {0}", Thread.CurrentThread.CurrentCulture)); LogProvider.Log.Info(string.Format("Current UI Culture: {0}", Thread.CurrentThread.CurrentUICulture)); ValidateLicenseAssemblies(); if (generalSettingsModel.IsAutomaticallyDownloadUpdates) { CheckUpdates(); } VisualStudio2013Palette.LoadPreset(VisualStudio2013Palette.ColorVariation.Dark); LogCleaner.ClearLogsFolder(); /* Without this user won't be able to input decimal point for float bindings if UpdateSourceTrigger set to PropertyChanged */ System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false; }
private static IDisposable InitLogger(Func <LoggerConfiguration> createConfiguration)//, bool useSyncLogger) { lock (syncRoot) { if (logCleaner != null) { logCleaner.Dispose(); logCleaner = null; } try { var configuration = createConfiguration(); Log.Logger = //useSyncLogger //? configuration.CreateLogger() //: configuration.CreateLoggerAsync(); ; logCleaner = new LogCleaner(Log.Logger); return(logCleaner); } catch (Exception) { Log.Logger = new LoggerConfiguration().CreateLogger(); throw; } } }
public void Clean_ShouldNotThrow_WhenFolderNotExists() { // Arrange const string logPath = "Folder\\Does\\Not\\Exist"; var cleaner = new LogCleaner(_logger); // Act Action action = () => cleaner.Clean(logPath, 0); //Assert action.Should().NotThrow <Exception>(); }
/// <summary> /// 1分钟任务 /// </summary> public static void Do() { R.SystemStatus.DriveTotal = DriveTool.GetDriveTotalSize(R.Paths.App); R.SystemStatus.DriveAvail = DriveTool.GetDriveAvailableSize(R.Paths.App); LogCleaner.LogFileAnalyse(); if (R.IsAutoDeleteExpiredLog) { LogCleaner.CleanLogFile(); } }
/// <summary> /// 1分钟任务 /// </summary> public static void Do() { R.SystemStatus.DriveTotal = DriveTool.GetDriveTotalSize(R.Paths.App); R.SystemStatus.DriveAvail = DriveTool.GetDriveAvailableSize(R.Paths.App); LogCleaner.LogFileAnalyse(); R.Log.I($"全部日志文件:{R.SystemStatus.AllLogCount} 个, 共计:{ByteConvertTool.Cvt(R.SystemStatus.AllLogSize, "MB")} GB"); R.Log.I($"过期日志文件:{R.SystemStatus.ExpireLogCount} 个, 共计:{ByteConvertTool.Cvt(R.SystemStatus.ExpireLogSize, "MB")} GB"); //string toMail = "*****@*****.**"; //string subject = $"服务器状态报表:日报:{DateTime.Now.ToString("yyyy年MM月dd日")}"; //string emailBody = "测试内容"; //EmailTool et = new EmailTool( // "*****@*****.**", // toMail, subject, emailBody, // "bigbird_server","bigbird528"); //et.Send(); }
public void Clean_ShouldDeleteOldestFiles() { // Arrange const string logPath = nameof(Clean_ShouldDeleteOldestFiles); CreateEmptyDirectory(logPath); var files = new[] { "file.log", "file1.log", "file2.log", "file3.log", "file4.log" }.Select(f => Path.Combine(logPath, f)).ToList(); files.ForEach(CreateEmptyFile); File.SetCreationTimeUtc(files[0], new DateTime(2019, 03, 15, 10, 50, 0)); File.SetCreationTimeUtc(files[1], new DateTime(2019, 03, 15, 10, 40, 0)); File.SetCreationTimeUtc(files[2], new DateTime(2019, 03, 15, 10, 30, 0)); File.SetCreationTimeUtc(files[3], new DateTime(2019, 03, 15, 10, 20, 0)); File.SetCreationTimeUtc(files[4], new DateTime(2019, 03, 15, 10, 10, 0)); var cleaner = new LogCleaner(_logger); // Act cleaner.Clean(logPath, 2); var result = Directory.GetFiles(logPath).Select(Path.GetFileName); // Assert result.Should().HaveCount(2) .And.Contain(new[] { "file.log", "file1.log" }); }
/// <summary> /// 接受消息 /// </summary> /// <param name="host"></param> /// <param name="model"></param> public static void ReceiveMessage(string host, TcpDataModel model) { switch (model.Type) { case 10001000: R.Tx.IsAuth = true; R.Tx.ConnectTime = DateTime.Now; R.MainUI.UITxStatus(); TxSendQueue.Start(); break; //状态信息 case 20001000: /* 普通应答 */ break; case 20001001: /* 状态 */ //R.MainUI.UIStatus(model); break; case 20001002: /* 状态(二维码) */ break; case 20002000: //R.MainUI.UILog(Json.Byte2Object<string>(model.Data)); break; case 20003000: //R.MainUI.UIScreen(model); break; case 20004000: /* 系统信息 */ //R.MainUI.UIInfo(model); break; case 20004001: /* 软件信息 */ //R.MainUI.UIInfo(model); break; case 20004002: /* 硬件信息 */ //R.MainUI.UIInfo(model); break; case 20004003: /* 共享信息 */ //R.MainUI.UIInfo(model); break; case 20004004: /* APP信息 */ //R.MainUI.UIInfo(model); break; case 30001000: //R.MainUI.UIConsole(Json.Byte2Object<List<string>>(model.Data)); break; //指令操作 case 40001000: /* 清除过期日志 */ R.Log.I("收到指令操作:40001000:清除过期日志:15天之前日志"); LogCleaner.CleanLogFile(); break; case 40002000: /* 重启服务 */ try { R.Log.I("收到指令操作:40002000:重启服务"); string ss = Json.Byte2Object <string>(model.Data); Tuple <string, int> info = Json.String2Object <Tuple <string, int> >(ss); if (R.Tx.LocalIP == info.Item1 && R.ProjectItems.Any(x => x.Port == info.Item2)) { Parts.ProjectItemPart item = R.ProjectItems.FirstOrDefault(x => x.Port == info.Item2); if (item != null) { item.Restart(); } } } catch { } break; //更新操作 case 90001000: /* 获取更新文件基本信息 */ try { Tuple <string, string> data = Json.Byte2Object <Tuple <string, string> >(model.Data); if (Str.Ok(data.Item1, data.Item2)) { R.AppointName = data.Item1; R.AppointMD5 = data.Item2; TxSendQueue.Add(90001000, "Fire in the hole"); } } catch { } break; case 90002000: /* 获取更新文件 */ try { if (Str.Ok(R.AppointName, R.AppointMD5)) { if (File.Exists(DirTool.Combine(R.Paths.App, R.AppointName))) { FileTool.Delete(DirTool.Combine(R.Paths.App, R.AppointName)); } if (BinaryFileTool.write(DirTool.Combine(R.Paths.App, R.AppointName), model.Data)) { IniTool.Set(R.Files.Settings, "Appoint", "Name", R.AppointName); IniTool.Set(R.Files.Settings, "Appoint", "MD5", R.AppointMD5); // 判断文件存在,并且MD5相符,则退出并运行新版本(否则删除不一致文件) if (File.Exists(DirTool.Combine(R.Paths.App, R.AppointName)) && FileTool.GetMD5(DirTool.Combine(R.Paths.App, R.AppointName)) == R.AppointMD5) { ProcessTool.Start(R.Files.App); R.MainUI.UIExitApp(); } else { FileTool.Delete(DirTool.Combine(R.Paths.App, R.AppointName)); } } } } catch { } break; default: break; } }
public void Start(string[] args) { Singleton = this; Console.Title = BaseWindowTitle; if (_restartsLimit > -1) { if (_restartsTimeWindow > 0) { if (!RestartsStopwatch.IsRunning) { RestartsStopwatch.Start(); } else if (RestartsStopwatch.Elapsed.TotalSeconds > _restartsTimeWindow) { RestartsStopwatch.Restart(); _restarts = 0; } } if (!_ignoreNextRestart) { _restarts++; } else { _ignoreNextRestart = false; } if (_restarts > _restartsLimit) { ConsoleUtil.WriteLine("Restarts limit exceeded.", ConsoleColor.Red); ExitAction = ShutdownAction.SilentShutdown; Exit(1); } } try { var reconfigure = false; var useDefault = false; if (_firstRun) { if (args.Length == 0 || !ushort.TryParse(args[0], out GamePort)) { ConsoleUtil.WriteLine("You can pass port number as first startup argument.", ConsoleColor.Green); Console.WriteLine(string.Empty); ConsoleUtil.Write("Port number (default: 7777): ", ConsoleColor.Green); ReadInput((input) => { if (!string.IsNullOrEmpty(input)) { return(ushort.TryParse(input, out GamePort)); } GamePort = 7777; return(true); }, () => { }, () => { ConsoleUtil.WriteLine("Port number must be a unsigned short integer.", ConsoleColor.Red); }); } var capture = CaptureArgs.None; foreach (var arg in args) { switch (capture) { case CaptureArgs.None: if (arg.StartsWith("-", StringComparison.Ordinal) && !arg.StartsWith("--", StringComparison.Ordinal) && arg.Length > 1) { for (var i = 1; i < arg.Length; i++) { switch (arg[i]) { case 'c': NoSetCursor = true; break; case 'p': PrintControlMessages = true; break; case 'n': AutoFlush = false; break; case 'l': EnableLogging = false; break; case 'r': reconfigure = true; break; case 's': _stdPrint = true; break; case 'd': useDefault = true; break; } } } else { switch (arg) { case "--noSetCursor": NoSetCursor = true; break; case "--printControl": PrintControlMessages = true; break; case "--noAutoFlush": AutoFlush = false; break; case "--noLogs": EnableLogging = false; break; case "--reconfigure": reconfigure = true; break; case "--printStd": _stdPrint = true; break; case "--useDefault": useDefault = true; break; case "--config": capture = CaptureArgs.ConfigPath; break; case "--logs": capture = CaptureArgs.LaLogsPath; break; case "--gameLogs": capture = CaptureArgs.GameLogsPath; break; case "--restartsLimit": capture = CaptureArgs.RestartsLimit; break; case "--restartsTimeWindow": capture = CaptureArgs.RestartsTimeWindow; break; case "--logLengthLimit": capture = CaptureArgs.LogLengthLimit; break; case "--logEntriesLimit": capture = CaptureArgs.LogEntriesLimit; break; case "--": capture = CaptureArgs.ArgsPassthrough; break; } } break; case CaptureArgs.ArgsPassthrough: _gameArguments += $"\"{arg}\" "; break; case CaptureArgs.ConfigPath: ConfigPath = arg; capture = CaptureArgs.None; break; case CaptureArgs.LaLogsPath: LaLogsPath = arg + Path.DirectorySeparatorChar; capture = CaptureArgs.None; break; case CaptureArgs.GameLogsPath: GameLogsPath = arg + Path.DirectorySeparatorChar; capture = CaptureArgs.None; break; case CaptureArgs.RestartsLimit: if (!int.TryParse(arg, out _restartsLimit) || _restartsLimit < -1) { _restartsLimit = 4; ConsoleUtil.WriteLine("restartsLimit argument value must be an integer greater or equal to -1.", ConsoleColor.Red); } capture = CaptureArgs.None; break; case CaptureArgs.RestartsTimeWindow: if (!int.TryParse(arg, out _restartsTimeWindow) || _restartsLimit < 0) { _restartsTimeWindow = 480; ConsoleUtil.WriteLine("restartsTimeWindow argument value must be an integer greater or equal to 0.", ConsoleColor.Red); } capture = CaptureArgs.None; break; case CaptureArgs.LogLengthLimit: { string a = arg.Replace("k", "000", StringComparison.Ordinal) .Replace("M", "000000", StringComparison.Ordinal) .Replace("G", "000000000", StringComparison.Ordinal) .Replace("T", "000000000000", StringComparison.Ordinal); if (!ulong.TryParse(a, out LogLengthLimit)) { ConsoleUtil.WriteLine( "logLengthLimit argument value must be an integer greater or equal to 0.", ConsoleColor.Red); LogLengthLimit = 25000000000; } capture = CaptureArgs.None; } break; case CaptureArgs.LogEntriesLimit: { string a = arg.Replace("k", "000", StringComparison.Ordinal) .Replace("M", "000000", StringComparison.Ordinal) .Replace("G", "000000000", StringComparison.Ordinal) .Replace("T", "000000000000", StringComparison.Ordinal); if (!ulong.TryParse(a, out LogEntriesLimit)) { ConsoleUtil.WriteLine( "logEntriesLimit argument value must be an integer greater or equal to 0.", ConsoleColor.Red); LogEntriesLimit = 10000000000; } capture = CaptureArgs.None; } break; default: throw new ArgumentOutOfRangeException(); } } } if (ConfigPath != null) { if (File.Exists(ConfigPath)) { Configuration = Config.DeserializeConfig(File.ReadAllLines(ConfigPath, Encoding.UTF8)); } else { reconfigure = true; } } else { var cfgPath = $"{GameUserDataRoot}config{Path.DirectorySeparatorChar}{GamePort}{Path.DirectorySeparatorChar}config_localadmin.txt"; if (File.Exists(cfgPath)) { Configuration = Config.DeserializeConfig(File.ReadAllLines(cfgPath, Encoding.UTF8)); } else { cfgPath = $"{GameUserDataRoot}config{Path.DirectorySeparatorChar}config_localadmin_global.txt"; if (File.Exists(cfgPath)) { Configuration = Config.DeserializeConfig(File.ReadAllLines(cfgPath, Encoding.UTF8)); } else { reconfigure = true; } } } if (reconfigure) { ConfigWizard.RunConfigWizard(useDefault); } NoSetCursor |= Configuration !.LaNoSetCursor; AutoFlush &= Configuration !.LaLogAutoFlush; EnableLogging &= Configuration !.EnableLaLogs; InputQueue.Clear(); if (_firstRun) { try { SetupExitHandlers(); } catch (Exception ex) { ConsoleUtil.WriteLine( $"Starting exit handlers threw {ex}. Game process will NOT be closed on console closing!", ConsoleColor.Yellow); } } if (_firstRun || _exit) { _exit = false; _firstRun = false; SetupKeyboardInput(); } RegisterCommands(); SetupReader(); StartSession(); _readerTask !.Start(); if (!EnableLogging) { ConsoleUtil.WriteLine("Logging has been disabled.", ConsoleColor.Red); } else if (!AutoFlush) { ConsoleUtil.WriteLine("Logs auto flush has been disabled.", ConsoleColor.Yellow); } if (PrintControlMessages) { ConsoleUtil.WriteLine("Printing control messages been enabled using startup argument.", ConsoleColor.Gray); } if (NoSetCursor) { ConsoleUtil.WriteLine("Cursor management been disabled.", ConsoleColor.Gray); } if (Configuration.LaDeleteOldLogs || Configuration.DeleteOldRoundLogs || Configuration.CompressOldRoundLogs) { LogCleaner.Initialize(); } while (!_exit) { Thread.Sleep(250); } // If the game was terminated intentionally, then wait, otherwise no Exit(0, true); // After the readerTask is completed this will happen } catch (Exception ex) { File.WriteAllText($"LocalAdmin Crash {DateTime.UtcNow:yyyy-MM-ddTHH-mm-ssZ}.txt", ex.ToString()); Logger.Log("|===| Exception |===|"); Logger.Log(ex); Logger.Log("|===================|"); Logger.Log(""); } }