#region Copyright (C) 2016 Kevin (OSS开源系列) 公众号:OSSCore
/***************************************************************************
* 文件功能描述:全局插件 - 日志插件默认实现
*
* 创建人: Kevin
* 创建人Email:1985088337@qq.com
*
*
*****************************************************************************/
#endregion
using System.Text;
using System.Threading.Tasks.Dataflow;
namespace OSS.Tools.Log
{
///
/// 系统默认写日志来源
///
public class DefaultToolLog : IToolLog
{
///
/// 构造函数
///
public DefaultToolLog()
{
}
///
/// 写日志
///
///
public Task WriteLogAsync(LogInfo info)
{
_asyncBlock.Post(info);
return Task.CompletedTask;
}
private static readonly object _obj = new();
private static readonly ActionBlock _asyncBlock = new((info) =>
{
try
{
var logTime = info.log_time > 0
? DateTimeOffset.FromUnixTimeSeconds(info.log_time).LocalDateTime
: DateTime.Now;
lock (_obj)
{
var filePath = getLogFilePath(info.source_name, info.level, logTime);
using (var sw = new StreamWriter(new FileStream(filePath, FileMode.Append, FileAccess.Write),
Encoding.UTF8))
{
sw.WriteLine("{0:T} TraceNo:{1} Key:{2} Detail:{3}\r\n",
logTime.ToString("yyyy-MM-dd HH:mm:ss"),
info.trace_no, info.msg_key, info.msg_body);
}
}
}
catch
{
// 写日志本身不能再报异常,这里特殊处理
}
});
private static string getLogFilePath(string? sourceName, LogLevelEnum level, DateTime logTime)
{
var moduleName = string.IsNullOrEmpty(sourceName) ? "default" : sourceName;
var dirPath = Path.Combine(GetBaseDirPath(), string.Concat(moduleName, "_", level), logTime.ToString("yyyyMM"));
if (!Directory.Exists(dirPath))
Directory.CreateDirectory(dirPath);
var fileName = string.Concat(logTime.ToString("yyyy-MM-dd-HH-"), Math.Floor(logTime.Minute / 10M), "0.txt");
return Path.Combine(dirPath, fileName);
}
private static string _logBaseDirPath = string.Empty;
private static string GetBaseDirPath()
{
if (!string.IsNullOrEmpty(_logBaseDirPath))
{
return _logBaseDirPath;
}
_logBaseDirPath = Path.Combine(AppContext.BaseDirectory, "logs");
if (!Directory.Exists(_logBaseDirPath))
Directory.CreateDirectory(_logBaseDirPath);
return _logBaseDirPath;
}
}
}