using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using WCS.BLL.Config;
using WCS.DAL;
using WCS.Model;
namespace WCS.BLL
{
///
/// 日志类型
///
public enum LogsType
{
///
/// 信息
///
Info,
///
/// 启动信息
///
StartBoot,
///
/// 调用外部Api的接口
///
Api,
///
/// 指令发送接收
///
Instructions,
///
/// 指令重发
///
InstructionResend,
///
/// 出库流程日志
///
Outstore,
///
/// 入库流程日志
///
Instore,
WebSocket,
///
/// 指令发送接收
///
InstructionsProcess,
}
///
/// 日志
///
public static class Logs
{
static object obj = new object();
const string logExtension = ".log";
///
/// 写入日志失败
///
public static Action, DateTime, LogsType, Exception> WriteErr = null;
///
/// 写入日志
///
/// 内容
/// 类型
/// 是否写入成功
public static void Write(IEnumerable content, LogsType type = LogsType.Info)
{
if (content == null || !content.Any())
return;
var dt = DateTime.Now;
string hms = dt.ToString("HH:mm:ss.fff");
List lines = new List(content.Count());
try
{
string path = Path.Combine(Config.LocalFile.LogDir, type.ToString(), $"{(dt.ToString("yyyyMMdd"))}{logExtension}");
foreach (var item in content)
lines.AddRange($"[{hms}]{item}".Split(new string[] { Environment.NewLine }, StringSplitOptions.None));
lock (obj)
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
File.AppendAllLines(path, lines, Encoding.UTF8);
}
}
catch (Exception ex)
{
WriteErr?.Invoke(content, dt, type, ex);
}
}
///
/// 写入日志
///
/// 内容对象
/// 类型
/// 是否写入成功
public static void Write(string content, LogsType type = LogsType.Info)
{
Write(new string[] { content }, type);
}
///
/// 写入日志
///
/// 内容对象
/// 类型
/// 是否写入成功
public static void Write(object content, LogsType type = LogsType.Info)
{
Write(JsonConvert.SerializeObject(content), type);
}
///
/// 写入日志
///
/// 内容
/// 内容标题
/// 类型
/// 是否写入成功
public static void Write(object content, string contentTitle, LogsType type = LogsType.Info)
{
Write($"{contentTitle} {JsonConvert.SerializeObject(content)}", type);
}
///
/// 清除日志
///
/// 保留时间
/// 清理的大小(字节)
public static long Clear(TimeSpan time)
{
long size = 0;
var rs = EnumHelps.GetEnumList(typeof(LogsType));
foreach (var item in rs)
{
try
{
var path = Path.Combine(Config.LocalFile.LogDir, item);
DirectoryInfo directoryInfo = new DirectoryInfo(path);
if (!directoryInfo.Exists)
continue;
var files = directoryInfo.GetFiles($"**{logExtension}", SearchOption.TopDirectoryOnly);
var fileDel = files.Where(o => o.CreationTime < (DateTime.Now - time));
foreach (var item2 in fileDel)
{
size += item2.Length;
item2.Delete();
}
}
catch (Exception)
{
}
}
return size;
}
}
}