using System;
using System.Collections.Concurrent;
using System.IO;
using System.Text;
namespace StandardScene.Magnetic.Tasking
{
///
/// Mag2Car 本地文件日志,按协议车号分目录:log/car{VehicleCode}/mag2_yyyyMMdd.log
///
public static class Mag2CarFileLogger
{
private static readonly ConcurrentDictionary CarLocks = new ConcurrentDictionary();
private static string _baseDirectory = "log";
private static bool _enabled = true;
public static void Configure(string baseDirectory, bool enabled)
{
_baseDirectory = string.IsNullOrWhiteSpace(baseDirectory) ? "log" : baseDirectory.Trim();
_enabled = enabled;
}
public static string GetCarLogDirectory(ushort vehicleCode)
{
return Path.Combine(ResolveBaseDirectory(), $"car{vehicleCode}");
}
public static string GetCurrentLogFilePath(ushort vehicleCode)
{
var fileName = $"mag2_{DateTime.Now:yyyyMMdd}.log";
return Path.Combine(GetCarLogDirectory(vehicleCode), fileName);
}
public static void Write(ushort vehicleCode, string message)
{
if (!_enabled || vehicleCode == 0 || string.IsNullOrWhiteSpace(message))
{
return;
}
var carLock = CarLocks.GetOrAdd(vehicleCode, _ => new object());
lock (carLock)
{
var directory = GetCarLogDirectory(vehicleCode);
Directory.CreateDirectory(directory);
var path = GetCurrentLogFilePath(vehicleCode);
File.AppendAllText(
path,
$"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] {message}{Environment.NewLine}",
new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));
}
}
private static string ResolveBaseDirectory()
{
return Path.IsPathRooted(_baseDirectory)
? _baseDirectory
: Path.Combine(AppContext.BaseDirectory, _baseDirectory);
}
}
}