Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. using reLogger.Abstract;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Text;
  6. using System.Collections.Concurrent;
  7. using System.Threading.Tasks;
  8.  
  9. namespace reLogger.LoggerTargets
  10. {
  11. public class FileLogger : ILoggerTarget
  12. {
  13. public string Name => "FileLogger";
  14.  
  15. public Guid Id { get; private set; }
  16.  
  17. public HashSet<ILoggerCategory> Whitelist { get; private set; } = new HashSet<ILoggerCategory>();
  18.  
  19. private FileStream LogStream = null;
  20. private Task LogTask = null;
  21. private string LogDirectory { get; set; } = string.Empty;
  22. private string FileNameFormat { get; set; } = string.Empty;
  23.  
  24. private DateTime StreamCreationTime { get; set; }
  25.  
  26. private ConcurrentQueue<(string, ILoggerCategory)> LogQueue { get; set; } = new ConcurrentQueue<(string, ILoggerCategory)>();
  27.  
  28. public FileLogger(string logDirectory = "logs", string nameFormat = "dd.MM.yyyy")
  29. {
  30. Id = Guid.NewGuid();
  31.  
  32. if (!Directory.Exists(logDirectory))
  33. Directory.CreateDirectory(logDirectory);
  34.  
  35. FileNameFormat = nameFormat;
  36. LogDirectory = logDirectory;
  37.  
  38. LogTask = Task.Run(() =>
  39. {
  40. while (LogQueue.TryDequeue(out (string, ILoggerCategory) currentItem))
  41. {
  42. if (Whitelist.Contains(currentItem.Item2))
  43. {
  44. byte[] encodedMessage = Encoding.UTF8.GetBytes(currentItem.Item1);
  45. FileStream currentLogStream = GetLoggerStream();
  46.  
  47. currentLogStream.Write(encodedMessage, 0, encodedMessage.Length);
  48. currentLogStream.Flush();
  49. }
  50. }
  51. });
  52.  
  53. LogTask.
  54. }
  55.  
  56. public void Dispose()
  57. {
  58. LogStream?.Dispose();
  59. LogTask?.Dispose();
  60. }
  61.  
  62. public void Write(string message, ILoggerCategory loggerCategory)
  63. {
  64. LogQueue.Enqueue((message, loggerCategory));
  65. }
  66.  
  67. private FileStream GetLoggerStream()
  68. {
  69. DateTime currentTime = DateTime.UtcNow;
  70.  
  71. if ((StreamCreationTime - currentTime) > TimeSpan.FromDays(1))
  72. {
  73. LogStream.Close();
  74. LogStream.Dispose();
  75.  
  76. File.Move(Path.Combine(LogDirectory, "lastest.log"),
  77. Path.Combine(LogDirectory, currentTime.ToString(FileNameFormat)));
  78.  
  79. LogStream = new FileStream(Path.Combine(LogDirectory, "latest.log"),
  80. FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read);
  81.  
  82. StreamCreationTime = currentTime;
  83. }
  84.  
  85. return LogStream;
  86. }
  87. }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement