123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- 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
- {
- /// <summary>
- /// 发布世界交互日志
- /// </summary>
- /// <param name="logs"></param>
- /// <param name="World">当前世界</param>
- public static void WorldPublish(ConcurrentQueue<KeyLog> 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<BusinessAlarm> 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
- }
- }
- /// <summary>
- /// 去除转义字符
- /// </summary>
- /// <param name="value"></param>
- /// <returns></returns>
- 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";
- }
- /// <summary>
- /// 执行记录
- /// </summary>
- /// <param name="system">系统</param>
- /// <param name="devCode">设备号</param>
- /// <param name="msg">内容</param>
- public static void ExRecord(this SystemBase system, string devCode, string msg)
- {
- }
- /// <summary>
- /// 执行记录
- /// </summary>
- /// <param name="system">系统</param>
- /// <param name="devCode">设备号</param>
- /// <param name="msg">内容</param>
- public static async void ExRecord<T>(this SystemBase system, string devCode, string msg, List<T> ints)
- {
- try
- {
- }
- catch
- {
- // ignored
- }
- }
- /// <summary>
- /// 发布一条日志记录
- /// </summary>
- /// <param name="title">接口名</param>
- /// <param name="con">内容</param>
- 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}"
- }));
- }
- /// <summary>
- /// 初始化日志处理进程
- /// </summary>
- public static void init()
- {
- var toao = 1000;
- while (true)
- {
- var sw = new Stopwatch();
- sw.Start();
- int index = 0;
- List<LogModel> logs = new List<LogModel>();
- 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<LogModel>).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; }
- }
- /// <summary>
- /// 业务报警
- /// </summary>
- public class BusinessAlarm
- {
- /// <summary>
- /// 业务名称
- /// </summary>
- public string BusinessName { get; set; }
- /// <summary>
- /// 设备号
- /// </summary>
- public string DevNo { get; set; }
- /// <summary>
- /// 内容
- /// </summary>
- public string Con { get; set; }
- /// <summary>
- /// 时间
- /// </summary>
- public DateTime Time { get; set; }
- }
- }
|