//************************************************************************
// https://github.com/yuzhengyang
// author: yuzhengyang
// date: 2017.3.29 - 2017.7.6
// desc: 日志功能
// Copyright (c) yuzhengyang. All rights reserved.
//************************************************************************
//R.Log.IsWriteFile = true;
//R.Log.LogLevel = LogLevel.Warning | LogLevel.Debug;
//Log.AllocConsole();
//R.Log.v("this is v 啰嗦");
//R.Log.d("this is d 调试");
//R.Log.i("this is i 重要");
//R.Log.w("this is w 警告");
//R.Log.e("this is e 错误");
using Azylee.Core.DataUtils.CollectionUtils;
using Azylee.Core.DataUtils.StringUtils;
using Azylee.Core.IOUtils.DirUtils;
using Azylee.Core.IOUtils.TxtUtils;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
namespace Azylee.Core.LogUtils
{
///
/// Log 输出工具
///
/// 说明:
/// 1、Log.AllocConsole();开启控制台
/// 2、Log.FreeConsole();关闭控制台
/// 3、Log.i("information");输出消息
///
public class Log
{
#region 基础属性
//输出的 Log 格式
const string LOG_FORMAT = "{0} {1} {2}";
const string TIME_FORMAT = "HH:mm:ss.fff";
const string LOG_PATH = "Log";
private object LogFileLock = new object();//写日志文件锁
private bool IsWriteFile = false;//是否写日志文件
public string LogPath = LOG_PATH;
public LogLevel LogLevel = LogLevel.All;//日志输出等级
bool IsStart = false;
ConcurrentQueue Queue = new ConcurrentQueue();
#endregion
public Log()
{ }
public Log(bool isWrite, string logPath = LOG_PATH, LogLevel level = LogLevel.All)
{
if (isWrite && !string.IsNullOrWhiteSpace(logPath))
{
LogPath = logPath.Trim();
IsWriteFile = true;
LogLevel = level;
}
}
void Start()
{
return;
if (!IsStart)
{
IsStart = true;
Task.Factory.StartNew(() =>
{
while (IsStart)
{
Thread.Sleep(500);
if (Queue.Any())
{
List list = new List();
for (int i = 0; i < Queue.Count; i++)
{
LogModel model = null;
if (Queue.TryDequeue(out model)) list.Add(model);
}
if (ListTool.HasElements(list)) WriteFile(list);
}
}
});
}
}
void Stop()
{
if (IsStart)
IsStart = false;
}
public bool SetWriteFile(bool isWrite, string logPath)
{
if (isWrite && !string.IsNullOrWhiteSpace(logPath))
{
LogPath = logPath.Trim();
IsWriteFile = true;
return true;
}
IsWriteFile = false;
return false;
}
#region Console 开启/关闭 API
[DllImport("kernel32.dll")]
public static extern Boolean AllocConsole();
[DllImport("kernel32.dll")]
public static extern Boolean FreeConsole();
#endregion
///
/// 获取输出颜色
///
/// 输出类型
///
private ConsoleColor GetColor(LogType type)
{
switch (type)
{
case LogType.v: return ConsoleColor.Gray;
case LogType.d: return ConsoleColor.Blue;
case LogType.i: return ConsoleColor.Green;
case LogType.w: return ConsoleColor.Yellow;
case LogType.e: return ConsoleColor.Red;
default: return ConsoleColor.Gray;
}
}
///
/// 写出到控制台
///
/// 类型
/// 标记
/// 消息
private void Write(LogType type, string message)
{
try
{
Console.ForegroundColor = GetColor(type);
Console.WriteLine(LOG_FORMAT, DateTime.Now.ToString(TIME_FORMAT), type.ToString(), message);
//取消单独线程输出日志文件(单独线程输出日志必然会有延迟)
//if (IsWriteFile) Queue.Enqueue(new LogModel() { Type = type, Message = message, CreateTime = DateTime.Now });
if (IsWriteFile) WriteFile(new LogModel() { Type = type, Message = message, CreateTime = DateTime.Now });
}
catch { }
}
private void WriteFile(LogModel log)
{
if (IsWriteFile)
{
lock (LogFileLock)
{
//设置日志目录
string logPath = AppDomain.CurrentDomain.BaseDirectory + LogPath;
string file = string.Format(@"{0}\{1}.txt", logPath, DateTime.Now.ToString("yyyy-MM-dd"));
//创建日志目录
DirTool.Create(logPath);
//写出日志
TxtTool.Append(
file,
string.Format(LOG_FORMAT,
log.CreateTime.ToString(TIME_FORMAT),
log.Type.ToString(),
StringTool.ReplaceNewLine(log.Message)));
}
}
}
private void WriteFile(List list)
{
if (IsWriteFile)
{
lock (LogFileLock)
{
//设置日志目录
string logPath = AppDomain.CurrentDomain.BaseDirectory + LogPath;
string file = string.Format(@"{0}\{1}.txt", logPath, DateTime.Now.ToString("yyyy-MM-dd"));
//创建日志目录
DirTool.Create(logPath);
//整理要输出的内容
List txts = new List();
foreach (var item in list)
{
txts.Add(string.Format(LOG_FORMAT, item.CreateTime.ToString(TIME_FORMAT), item.Type.ToString(), item.Message));
}
//写出日志
TxtTool.Append(file, txts);
}
}
}
#region 分类详细输出
///
/// 输出 verbose (啰嗦信息)
///
/// 消息
/// 可选:标记
public void v(T msg)
{
if ((LogLevel & LogLevel.Verbose) == LogLevel.Verbose)
Write(LogType.v, msg.ToString());
}
///
/// 输出 Debug (调试信息)
///
/// 消息
/// 可选:标记
public void d(T msg)
{
if ((LogLevel & LogLevel.Debug) == LogLevel.Debug)
Write(LogType.d, msg.ToString());
}
///
/// 输出 Information (重要信息)
///
/// 消息
/// 可选:标记
public void i(T msg)
{
if ((LogLevel & LogLevel.Information) == LogLevel.Information)
Write(LogType.i, msg.ToString());
}
///
/// 输出 Warning (警告信息)
///
/// 消息
/// 可选:标记
public void w(T msg)
{
if ((LogLevel & LogLevel.Warning) == LogLevel.Warning)
Write(LogType.w, msg.ToString());
}
///
/// 输出 Error (错误信息)
///
/// 消息
/// 可选:标记
public void e(T msg)
{
if ((LogLevel & LogLevel.Error) == LogLevel.Error)
Write(LogType.e, msg.ToString());
}
#endregion
}
}