- rework: Logging logic and file logging
This commit is contained in:
@@ -1,47 +1,33 @@
|
||||
using System.Reflection;
|
||||
using Nebula.Shared.FileApis;
|
||||
using Nebula.Shared.Services.Logging;
|
||||
using Robust.LoaderApi;
|
||||
|
||||
namespace Nebula.Shared.Services;
|
||||
|
||||
[ServiceRegister]
|
||||
public class DebugService : IDisposable
|
||||
{
|
||||
public ILogger Logger;
|
||||
|
||||
public DebugService(ILogger logger)
|
||||
private ServiceLogger Root {get; set;}
|
||||
|
||||
public DebugService()
|
||||
{
|
||||
Logger = logger;
|
||||
Root = new ServiceLogger("Root");
|
||||
}
|
||||
|
||||
public ILogger GetLogger(string loggerName)
|
||||
{
|
||||
return Root.GetLogger(loggerName);
|
||||
}
|
||||
|
||||
public ILogger GetLogger(object objectToLog)
|
||||
{
|
||||
return Root.GetLogger(objectToLog.GetType().Name);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Debug(string message)
|
||||
{
|
||||
Log(LoggerCategory.Debug, message);
|
||||
}
|
||||
|
||||
public void Error(string message)
|
||||
{
|
||||
Log(LoggerCategory.Error, message);
|
||||
}
|
||||
|
||||
public void Log(string message)
|
||||
{
|
||||
Log(LoggerCategory.Log, message);
|
||||
}
|
||||
|
||||
public void Error(Exception e)
|
||||
{
|
||||
Error(e.Message + "\r\n" + e.StackTrace);
|
||||
if (e.InnerException != null)
|
||||
Error(e.InnerException);
|
||||
}
|
||||
|
||||
private void Log(LoggerCategory category, string message)
|
||||
{
|
||||
Logger.Log(category, message);
|
||||
Root.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,4 +36,89 @@ public enum LoggerCategory
|
||||
Log,
|
||||
Debug,
|
||||
Error
|
||||
}
|
||||
|
||||
internal class ServiceLogger : ILogger
|
||||
{
|
||||
public ServiceLogger? Root { get; private set; }
|
||||
public ServiceLogger(string category)
|
||||
{
|
||||
Category = category;
|
||||
|
||||
var directory = Path.Combine(FileService.RootPath,"log", Assembly.GetEntryAssembly()?.GetName().Name ?? "App");
|
||||
if(!Directory.Exists(directory)) Directory.CreateDirectory(directory);
|
||||
|
||||
_fileStream = File.Open(Path.Combine(directory,$"{Category}.log"), FileMode.Create, FileAccess.Write, FileShare.Read);
|
||||
_streamWriter = new StreamWriter(_fileStream);
|
||||
}
|
||||
|
||||
public string Category { get; init; }
|
||||
|
||||
private Dictionary<string, ServiceLogger> Childs { get; init; } = new();
|
||||
|
||||
private readonly FileStream _fileStream;
|
||||
private readonly StreamWriter _streamWriter;
|
||||
|
||||
public ServiceLogger GetLogger(string category)
|
||||
{
|
||||
if (Childs.TryGetValue(category, out var logger))
|
||||
return logger;
|
||||
|
||||
logger = new ServiceLogger(category);
|
||||
logger.Root = this;
|
||||
Childs.Add(category, logger);
|
||||
return logger;
|
||||
}
|
||||
|
||||
public void Log(LoggerCategory loggerCategory, string message)
|
||||
{
|
||||
var output =
|
||||
$"[{DateTime.Now.ToUniversalTime():yyyy-MM-dd HH:mm:ss}][{Enum.GetName(loggerCategory)}][{Category}]: {message}";
|
||||
Console.WriteLine(output);
|
||||
|
||||
LogToFile(output);
|
||||
}
|
||||
|
||||
private void LogToFile(string output)
|
||||
{
|
||||
Root?.LogToFile(output);
|
||||
_streamWriter.WriteLine(output);
|
||||
_streamWriter.Flush();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_fileStream.Dispose();
|
||||
_streamWriter.Dispose();
|
||||
foreach (var (_, child) in Childs)
|
||||
{
|
||||
child.Dispose();
|
||||
}
|
||||
Childs.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public static class LoggerExtensions
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user