using Newtonsoft.Json;
using PlcSiemens.Core.Extension;
using ServiceCenter.Extensions;
using ServiceCenter.Redis;
using System.Collections.Concurrent;
using System.Diagnostics;
using WCS.Core;
namespace ServiceCenter.Logs
{
public static class LogHub
{
///
/// 发布世界交互日志
///
///
/// 当前世界
public static void WorldPublish(ConcurrentQueue logs, string World)
{
if (logs.Count <= 0) return;
//var sql = new StringBuilder();
//sql.Append("INSERT INTO ");
//var db = new SqlSugarHelper().PLC;
try
{
Parallel.ForEach(logs.GroupBy(x => x.Channel.System), item1 =>
{
Parallel.ForEach(item1.GroupBy(x => x.Channel.Item), item2 =>
{
var msgList = item2.Select(x => new
{
x.Time,
x.Log.Message
}).ToList();
RedisHub.Default.Set($"WCSLog:{item1.Key}:{item2.Key}", JsonConvert.SerializeObject(msgList));
});
});
}
catch
{
// ignored
}
try
{
//每一条数据存入redis
foreach (var log in logs.OrderBy(x => x.Time))
{
try
{
var dir = $"D:\\WCSLogs\\{DateTime.Now.yyyyMMdd()}\\{log.Channel.World}\\{log.Channel.System}\\{log.Channel.Item}\\";
var msg = $"{log.Time.yyyyMMddhhmmssf()}--[{Thread.CurrentThread.ManagedThreadId}]--{log}";
if (log.Log.Message.IsNullOrEmpty()) continue;
var title = $"{log.Log.Message.Split(":")[0]}.txt";
RedisHub.Default.RPush("LogHub", JsonConvert.SerializeObject(new LogModel
{
Time = log.Time,
path = dir,
Title = title,
Con = msg
}));
}
catch
{
// ignored
}
}
//存入业务报警内容
List businesses = logs.Where(v => v.Log.Level > LogLevelEnum.Low && v.Log.LogUpLoad == LogUpLoadEnum.UpLoadWMS).Select(v => new BusinessAlarm()
{
BusinessName = v.Channel.System,
DevNo = v.Channel.Item,
Con = v.ToString(),
Time = DateTime.Now
}).ToList();
RedisHub.WMS.Set($"{nameof(BusinessAlarm)}:{World}", JsonConvert.SerializeObject(businesses));
}
catch
{
// ignored
}
}
///
/// 去除转义字符
///
///
///
public static string RemoveEscapeCharacters(this string? value)
{
return value.Trim('\0', '\a', '\b', '\f', '\n', '\r', '\t', '\v').Trim();
}
public static string GetString(string value)
{
return value.Replace("INSERT INTO ", "")
.Replace(",N'", ",'")
.Replace("\0", "")
.Replace("wcs_", "")
.Replace("(N'", "('") + "\r";
}
///
/// 执行记录
///
/// 系统
/// 设备号
/// 内容
public static void ExRecord(this SystemBase system, string devCode, string msg)
{
}
///
/// 执行记录
///
/// 系统
/// 设备号
/// 内容
public static async void ExRecord(this SystemBase system, string devCode, string msg, List ints)
{
try
{
}
catch
{
// ignored
}
}
///
/// 发布一条日志记录
///
/// 接口名
/// 内容
public static void InterfacePublish(string title, string con)
{
RedisHub.Default.RPush("LogHub", JsonConvert.SerializeObject(new LogModel
{
path = $"D:\\WCSLogs\\{DateTime.Now.yyyyMMdd()}\\接口日志\\",
Title = $"{title}.txt",
Con = $"{DateTime.Now.yyyyMMddhhmmssf()}--{con}"
}));
}
///
/// 初始化日志处理进程
///
public static void init()
{
var toao = 1000;
while (true)
{
var sw = new Stopwatch();
sw.Start();
int index = 0;
List logs = new List();
try
{
using (var tran = RedisHub.Default.Multi())
{
var a = tran.LRange("LogHub", 0, 19999);
tran.LTrim("LogHub", 20000, -1);
var value = tran.Exec()[0];
var ret = value as string[];
logs = ret.Select(JsonConvert.DeserializeObject).ToList();
}
foreach (var paths in logs.Where(log => log != null).GroupBy(x => x.path))
{
foreach (var title in paths.GroupBy(x => x.Title))
{
var log = title.First();
var cons = title.OrderBy(x => x.Time).Select(x => x.Con);
if (!Directory.Exists(log.path)) Directory.CreateDirectory(log.path);/*.txt*/
var path = Path.Combine(log.path, log.Title);
if (!File.Exists(path))
{
File.AppendAllLines(path, cons);
}
else
{
var fileInfo = new FileInfo(path);
var fileMb = fileInfo.Length / 1024 / 1024;
if (fileMb > 20) //如果当前文件大小超过20MB 开始封存此文件,
{
var fileIndex = 1; //文件索引
var isSave = false;
while (!isSave) //未保存成功
{
var newPath = Path.Combine(log.path, log.Title.Replace(".txt", $"{fileIndex}.txt"));//使用文件索引头来判断当前索引对应的标题文件是否存在
if (!File.Exists(newPath))//不存在,将现有文件更名成新的文件名
{
File.Move(path, newPath);
isSave = true;
}
fileIndex++;
}
}
File.AppendAllLines(path, cons);
}
index++;
}
}
}
catch (Exception ex)
{
var path = $"D:\\WCSLogs\\{DateTime.Now.yyyyMMdd()}\\日志处理进程";
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
}
sw.Stop();
var path1 = $"D:\\WCSLogs\\{DateTime.Now.yyyyMMdd()}\\日志处理进程";
if (!Directory.Exists(path1)) Directory.CreateDirectory(path1);
File.AppendAllText(Path.Combine(path1, "耗时.txt"), $"{DateTime.Now.yyyyMMddhhmmssf()}耗时:{sw.ElapsedMilliseconds}--{logs.Count}--{index}\n");
if (sw.ElapsedMilliseconds >= toao) continue;
var time = toao - sw.ElapsedMilliseconds.ToInt();
Thread.Sleep(time);
}
}
}
public class LogModel
{
public string path { get; set; }
public DateTime Time { get; set; }
public string Title { get; set; }
public string Con { get; set; }
}
///
/// 业务报警
///
public class BusinessAlarm
{
///
/// 业务名称
///
public string BusinessName { get; set; }
///
/// 设备号
///
public string DevNo { get; set; }
///
/// 内容
///
public string Con { get; set; }
///
/// 时间
///
public DateTime Time { get; set; }
}
}