Files

164 lines
4.1 KiB
C#
Raw Permalink Normal View History

using System.Reflection;
using Nebula.Shared.FileApis;
2025-01-05 17:05:23 +03:00
using Nebula.Shared.Services.Logging;
using Robust.LoaderApi;
2024-12-22 16:38:47 +03:00
2025-01-05 17:05:23 +03:00
namespace Nebula.Shared.Services;
2024-12-22 16:38:47 +03:00
[ServiceRegister]
public class DebugService : IDisposable
{
2025-05-05 21:28:09 +03:00
public static bool DoFileLog;
private ServiceLogger Root {get; set;}
2025-05-05 21:28:09 +03:00
private readonly string _path =
Path.Combine(FileService.RootPath, "log", Assembly.GetEntryAssembly()?.GetName().Name ?? "App");
public DebugService()
2024-12-22 16:38:47 +03:00
{
2025-05-05 21:28:09 +03:00
ClearLog();
Root = new ServiceLogger("Root",_path);
Root.GetLogger("DebugService").Log("Initializing debug service " + (DoFileLog ? "with file logging" : "without file logging"));
2024-12-22 16:38:47 +03:00
}
public ILogger GetLogger(string loggerName)
2025-01-14 22:10:16 +03:00
{
return Root.GetLogger(loggerName);
}
2025-01-19 22:52:29 +03:00
public ILogger GetLogger(object objectToLog)
{
return Root.GetLogger(objectToLog.GetType().Name);
2025-01-14 22:10:16 +03:00
}
public void Dispose()
2024-12-22 16:38:47 +03:00
{
Root.Dispose();
2024-12-22 16:38:47 +03:00
}
2025-05-05 21:28:09 +03:00
private void ClearLog()
{
if(!Directory.Exists(_path))
return;
var di = new DirectoryInfo(_path);
foreach (var file in di.GetFiles())
{
file.Delete();
}
foreach (var dir in di.GetDirectories())
{
dir.Delete(true);
}
}
}
public enum LoggerCategory
{
Log,
Debug,
Error
}
2024-12-22 16:38:47 +03:00
internal class ServiceLogger : ILogger
{
2025-05-05 21:28:09 +03:00
private readonly string _directory;
public ServiceLogger? Root { get; private set; }
2025-05-05 21:28:09 +03:00
public ServiceLogger(string category, string directory)
2024-12-22 16:38:47 +03:00
{
2025-05-05 21:28:09 +03:00
_directory = directory;
Category = category;
2025-05-05 21:28:09 +03:00
if (!DebugService.DoFileLog) return;
if(!Directory.Exists(directory)) Directory.CreateDirectory(directory);
2025-06-19 21:12:42 +03:00
_path = Path.Combine(directory, $"{Category}.log");
2025-06-19 21:12:42 +03:00
File.Create(_path).Dispose();
2024-12-22 16:38:47 +03:00
}
public string Category { get; init; }
private Dictionary<string, ServiceLogger> Childs { get; init; } = new();
2025-06-19 21:12:42 +03:00
private FileStream? _fileStream;
private StreamWriter? _streamWriter;
private readonly string _path;
public ServiceLogger GetLogger(string category)
{
if (Childs.TryGetValue(category, out var logger))
return logger;
2025-05-05 21:28:09 +03:00
logger = new ServiceLogger(category, _directory);
logger.Root = this;
Childs.Add(category, logger);
return logger;
}
public void Log(LoggerCategory loggerCategory, string message)
2024-12-22 16:38:47 +03:00
{
2025-05-05 21:28:09 +03:00
var output = DebugService.DoFileLog
? $"[{DateTime.Now.ToUniversalTime():yyyy-MM-dd HH:mm:ss}][{Enum.GetName(loggerCategory)}][{Category}]: {message}"
: message;
Console.WriteLine(output);
LogToFile(output);
2024-12-22 16:38:47 +03:00
}
private void LogToFile(string output)
2024-12-27 19:15:33 +03:00
{
2025-05-05 21:28:09 +03:00
if(!DebugService.DoFileLog) return;
2025-06-19 21:12:42 +03:00
_fileStream = File.Open(_path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
_streamWriter = new StreamWriter(_fileStream);
Root?.LogToFile(output);
_streamWriter.WriteLine(output);
_streamWriter.Flush();
2025-06-19 21:12:42 +03:00
_streamWriter.Dispose();
_fileStream.Dispose();
_fileStream = null;
_streamWriter = null;
2024-12-27 19:15:33 +03:00
}
public void Dispose()
2024-12-22 16:38:47 +03:00
{
2025-05-05 21:28:09 +03:00
if (!DebugService.DoFileLog) return;
2025-06-19 21:12:42 +03:00
_streamWriter?.Dispose();
_fileStream?.Dispose();
foreach (var (_, child) in Childs)
{
child.Dispose();
}
Childs.Clear();
2024-12-22 16:38:47 +03:00
}
}
public static class LoggerExtensions
2024-12-22 16:38:47 +03:00
{
public static void Debug(this ILogger logger,string message)
{
logger.Log(LoggerCategory.Debug, message);
}
public static void Error(this ILogger logger,string message)
{
logger.Log(LoggerCategory.Error, message);
}
public static void Log(this ILogger logger,string message)
{
logger.Log(LoggerCategory.Log, message);
}
public static void Error(this ILogger logger,Exception e)
{
Error(logger,e.Message + "\r\n" + e.StackTrace);
if (e.InnerException != null)
Error(logger, e.InnerException);
}
2024-12-22 16:38:47 +03:00
}