/*************************************************
* 描述:本地日志操作类
* 功能:1、本地常规日志写操作。
* 2、本地异常日志写操作。
* 3、本地日志查询操作。
*
* Author :Y
* Date:
* Update:
* ************************************************/
using System;
using System.Configuration;
using System.IO;
using System.Text;
namespace CoreX.Common
{
/// <summary>
/// 本地日志操作类
/// </summary>
public class LocalLog
{
//本地日志根目录
private static string logRootPath = null;
//本地日志级别
private static LogLevel logLevel = LogLevel.easy | LogLevel.common | LogLevel.important | LogLevel.emergency;
//日志文件最大大小
private const long MAXSIZE = 1048576;
private static readonly object lockObj = new object();
//获取本地日志根目录
private static string RootPath
{
get
{
if (string.IsNullOrEmpty(logRootPath))
{
logRootPath = ConfigurationManager.AppSettings["LocalLogPath"];
if (string.IsNullOrEmpty(logRootPath))
{
logRootPath = AppDomain.CurrentDomain.BaseDirectory + @"\Log\";
}
}
return logRootPath;
}
}
//本地日志级别
private static LogLevel Level
{
get
{
string level = ConfigurationManager.AppSettings["LogLevel"];
int levelNum = (int)logLevel;
if (int.TryParse(level, out levelNum))
{
logLevel = (LogLevel)levelNum;
}
return logLevel;
}
}
//当前日志文件
private static string LogFile
{
get
{
string logPath = RootPath;
if (!Directory.Exists(logPath))
{
Directory.CreateDirectory(logPath);
}
//#if DEBUG
// string logFile = Path.Combine(logPath, $"{DateTime.Today.ToString("yyyyMMdd")}.log");
//#else
string date = DateTime.Today.ToString("yyyyMMdd_");
string[] logFiles = Directory.GetFiles(logPath, date + "*.log", SearchOption.TopDirectoryOnly);
string logFile = string.Empty;
if (logFiles.Length == 0)
{
logFile = Path.Combine(logPath, date + "1.log");
}
else
{
logFile = Path.Combine(logPath, date + logFiles.Length + ".log");
}
FileInfo fileInfo = new FileInfo(logFile);
if (fileInfo.Exists && fileInfo.Length > MAXSIZE)
{
logFile = Path.Combine(logPath, date + (logFiles.Length + 1) + ".log");
}
//#endif
return logFile;
}
}
//错误日志文件
private static string ErrLogFile
{
get
{
string logPath = RootPath;
if (!Directory.Exists(logPath))
{
Directory.CreateDirectory(logPath);
}
//#if DEBUG
// string logFile = Path.Combine(logPath, $"{DateTime.Today.ToString("yyyyMMdd")}.log");
//#else
string date = DateTime.Today.ToString("yyyyMMdd.err_");
string[] logFiles = Directory.GetFiles(logPath, date + "*.log", SearchOption.TopDirectoryOnly);
string logFile = string.Empty;
if (logFiles.Length == 0)
{
logFile = Path.Combine(logPath, date + "1.log");
}
else
{
logFile = Path.Combine(logPath, date + logFiles.Length + ".log");
}
FileInfo fileInfo = new FileInfo(logFile);
if (fileInfo.Exists && fileInfo.Length > MAXSIZE)
{
logFile = Path.Combine(logPath, date + (logFiles.Length + 1) + ".log");
}
//#endif
return logFile;
}
}
/// <summary>
/// 写本地日志
/// </summary>
/// <param name="logLevel">日志级别</param>
/// <param name="log">日志内容</param>
public static void Write(LogLevel logLevel, string log)
{
if ((Level & logLevel) == logLevel && !string.IsNullOrEmpty(log))
{
lock (lockObj)
{
try
{
using(StreamWriter writer = new StreamWriter(LogFile, true, Encoding.GetEncoding("gb2312")))
{
writer.WriteLine(">{0}\t{1}", DateTime.Now.ToString("HH:mm:ss.ffff"), log);
}
}
catch(Exception ex)
{
#if DEBUG
string exceptionFile = Path.Combine(RootPath, "exception.log");
try
{
using(StreamWriter writer =
new StreamWriter(exceptionFile, true, Encoding.GetEncoding("gb2312")))
{
writer.WriteLine("{0}{1}", ex.Message, Environment.NewLine);
}
}
finally
{
throw ex;
}
#endif
}
if(logLevel == LogLevel.important || logLevel == LogLevel.emergency)
{
try
{
using(StreamWriter writer = new StreamWriter(ErrLogFile, true, Encoding.GetEncoding("gb2312")))
{
writer.WriteLine(">{0}\t{1}", DateTime.Now.ToString("HH:mm:ss.ffff"), log);
}
}
catch(Exception ex)
{
#if DEBUG
string exceptionFile = Path.Combine(RootPath, "exception.log");
try
{
using(StreamWriter writer =
new StreamWriter(exceptionFile, true, Encoding.GetEncoding("gb2312")))
{
writer.WriteLine("{0}{1}", ex.Message, Environment.NewLine);
}
}
finally
{
throw ex;
}
#endif
}
}
}
}
WriteShell(log, false);
}
/// <summary>
/// 写本地日志
/// </summary>
/// <param name="logLevel">日志级别</param>
/// <param name="logFormat">带复合格式的日志内容</param>
/// <param name="args">复合格式参数</param>
public static void Write(LogLevel logLevel, string logFormat, params object[] args)
{
string log = string.Format(logFormat, args);
Write(logLevel, log);
WriteShell(log, false);
}
/// <summary>
/// 写本地异常日志
/// </summary>
/// <param name="ex">异常对象</param>
/// <param name="logFormat">带复合格式的日志内容</param>
/// <param name="args">复合格式参数</param>
public static void Write(Exception ex, string logFormat, params object[] args)
{
string log = string.Format(logFormat, args);
if (!string.IsNullOrEmpty(log))
{
log += Environment.NewLine;
}
log += string.Format("{0}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace);
if ((Level & LogLevel.important) == LogLevel.important && !string.IsNullOrEmpty(log))
{
lock (lockObj)
{
try
{
using (StreamWriter writer = new StreamWriter(LogFile, true, Encoding.GetEncoding("gb2312")))
{
writer.WriteLine(">{0}\t{1}", DateTime.Now.ToString("HH:mm:ss.ffff"), log);
}
}
catch
{
// ignored
}
//写到错误日志文件
try
{
using (StreamWriter writer = new StreamWriter(ErrLogFile, true, Encoding.GetEncoding("gb2312")))
{
writer.WriteLine(">{0}\t{1}", DateTime.Now.ToString("HH:mm:ss.ffff"), log);
}
}
catch
{
// ignored
}
}
}
WriteShell(log, true);
}
//日志信息写到控制台
private static void WriteShell(string output, bool isException)
{
#if DEBUG_Console
if (!string.IsNullOrEmpty(output))
{
if (!shellOpened)
{
AllocConsole();
Console.Title = "日志信息跟踪";
Console.BackgroundColor = ConsoleColor.White;
shellOpened = true;
}
Console.ForegroundColor = ConsoleColor.Black;
Console.Write("{0}[{1}]->", DateTime.Now.ToString("HH:mm:ss.fffff"), output == null ? 0 : output.Length);
if (isException)
{
Console.ForegroundColor = ConsoleColor.Red;
}
Console.WriteLine(output);
}
#endif
}
#if DEBUG_Console
public static void WriteShell(string output)
{
WriteShell(output, false);
}
public static void WriteShell(string format, params object[] args)
{
WriteShell(string.Format(format, args), false);
}
public static void WriteShell(string output, Exception ex)
{
WriteShell(string.Format("{0}{1}{2}{1}{3}", output, Environment.NewLine, ex.Message, ex.StackTrace), true);
}
//控制台窗口是否弹出
private static bool shellOpened = false;
//弹出控制台窗口
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern Boolean AllocConsole();
//释放控制台窗口
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern Boolean FreeConsole();
#endif
}
/// <summary>
/// 日志级别枚举
/// </summary>
[Flags]
public enum LogLevel : int
{
/// <summary>
/// 不重要=1
/// </summary>
easy = 1,
/// <summary>
/// 一般=2
/// </summary>
common = 2,
/// <summary>
/// 重要=4
/// </summary>
important = 4,
/// <summary>
/// 急=8
/// </summary>
emergency = 8
}
}