/**************************************************************************
*
* =================================
* CLR版本 :4.0.30319.42000
* 命名空间 :ToDoStylet.ViewModel
* 文件名称 :LogHelper.cs
* =================================
* 创 建 者 :LQZ
* 创建日期 :2019-10-9 16:31:19
* 功能描述 :日志操作类-使用KingAOP框架进行切面编程
* =================================
* 修 改 者 :
* 修改日期 :
* 修改内容 :
* =================================
*
***************************************************************************/
using Castle.DynamicProxy;
using KingAOP.Aspects;
using System;
using System.IO;
using System.Linq;
using System.Text;
namespace ToDoStylet.ViewModel
{
public class LoggerAspect : OnMethodBoundaryAspect, Stylet.Logging.ILogger
{
// 日志文件存放目录
private string _logDir = AppDomain.CurrentDomain.BaseDirectory + "\\Log";
//流程日志文件存放目录
private string _commLogDir = AppDomain.CurrentDomain.BaseDirectory + "\\Log\\CommLog";
//异常日志文件存放目录
private string _errLogDir = AppDomain.CurrentDomain.BaseDirectory + "\\Log\\ErrLog";
//传入的操作源名称
private readonly string name;
public LoggerAspect(string loggerName)
{
this.DelOldFile();
name = loggerName;
}
public LoggerAspect(){}
//日志级别为明细
public void Info(string format, params object[] args)
{
if (this.name == "Stylet.ViewManager" || this.name == "Stylet.WindowManager") return;
var logStr = new StringBuilder();
logStr.AppendLine();
logStr.Append("日志时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
logStr.AppendLine();
logStr.Append("日志级别:[INFO]");
logStr.AppendLine();
logStr.Append(string.Format("操作对象:[{0}]", this.name));
logStr.AppendLine();
logStr.Append(String.Format("日志内容:{0}", String.Format(format, args)));
//写到本地
WriteLog(logStr.ToString(), _commLogDir);
}
//日志级别为警告,同明细
public void Warn(string format, params object[] args)
{
if (this.name == "Stylet.ViewManager") return;
var logStr = new StringBuilder();
logStr.AppendLine();
logStr.Append("日志时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
logStr.AppendLine();
logStr.Append("日志级别:[WARN]");
logStr.AppendLine();
logStr.Append(string.Format("操作对象:[{0}]", this.name));
logStr.AppendLine();
logStr.Append(String.Format("日志内容: {0}", String.Format(format, args)));
//写到本地
WriteLog(logStr.ToString(), _commLogDir);
}
//日志级别为异常
public void Error(Exception exception, string message = null)
{
var logStr = new StringBuilder();
logStr.AppendLine();
logStr.Append("日志时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
logStr.AppendLine();
logStr.Append("日志级别:[ERROR]");
logStr.AppendLine();
logStr.Append(string.Format("操作对象:[{0}]", this.name));
logStr.AppendLine();
if (message == null)
logStr.Append(String.Format("日志内容:{0}", exception));
else
logStr.Append(String.Format("日志内容:{0} {1}", message, exception));
//写到本地
WriteLog(logStr.ToString(), _errLogDir);
}
///
/// 删除过期文件
///
private void DelOldFile()
{
// 遍历指定文件夹下所有子文件,将一定期限前的日志文件删除。
if (!Directory.Exists(this._logDir))
{
// 如果文件夹目录不存在
Directory.CreateDirectory(this._logDir);
}
if (!Directory.Exists(this._commLogDir))
{
Directory.CreateDirectory(this._commLogDir);
}
if (!Directory.Exists(this._errLogDir))
{
Directory.CreateDirectory(this._errLogDir);
}
var vFiles = (new DirectoryInfo(this._logDir)).GetFiles();
for (int i = vFiles.Length - 1; i >= 0; i--)
{
// 指定条件,然后删除
if (vFiles[i].Name.Contains("Log"))
{
if ((DateTime.Now - vFiles[i].LastWriteTime).Days > 14)
{
vFiles[i].Delete();
}
}
}
}
#region
public override void OnEntry(MethodExecutionArgs args)
{
string logData = CreateInfoLogData("Entering", args);
//写入本地
WriteLog(logData,_commLogDir);
}
public override void OnException(MethodExecutionArgs args)
{
string logData = CreateErrLogData("Exception", args);
WriteLog(logData, _errLogDir);
}
public override void OnSuccess(MethodExecutionArgs args)
{
string logData = CreateInfoLogData("Success", args);
//写入本地
WriteLog(logData, _commLogDir);
}
public override void OnExit(MethodExecutionArgs args)
{
string logData = CreateInfoLogData("Exiting", args);
//写入本地
WriteLog(logData, _commLogDir);
}
///
/// AOP处理逻辑,日志等级为INFO
///
/// 方法状态
/// 方法参数
///
private string CreateInfoLogData(string methodStage, MethodExecutionArgs args)
{
var str = new StringBuilder();
str.AppendLine();
str.Append("日志时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
str.AppendLine();
str.Append("日志级别:[INFO]");
str.AppendLine();
str.Append(string.Format("操作对象:[{0}] -->> {1} ", args.Method, methodStage));
str.AppendLine();
str.Append("日志内容:");
foreach (var argument in args.Arguments)
{
//下面利用反射机制获取对象名称和对象属性和属性值
var argType = argument.GetType();
str.Append("对象类型:"+argType.Name+" - 对象属性:");
if (argType == typeof(string) || argType.IsPrimitive)
{
str.Append(argument);
}
else
{
foreach (var property in argType.GetProperties())
{
str.AppendFormat("{0} = {1} ; ",
property.Name, property.GetValue(argument, null));
}
}
}
return str.ToString();
}
///
/// AOP处理逻辑,日志等级为Error
///
/// 方法状态
/// 方法参数
///
private string CreateErrLogData(string methodStage,MethodExecutionArgs args)
{
var str = new StringBuilder();
str.AppendLine();
str.Append("日志时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
str.AppendLine();
str.Append("日志级别:[ERROR]");
str.AppendLine();
str.Append(string.Format("对象类型:[{0}] -->> {1} ", args.Method, methodStage));
str.AppendLine();
str.Append("日志内容:");
foreach (var argument in args.Arguments)
{
//下面利用反射机制获取对象名称和对象属性和属性值
var argType = argument.GetType();
str.Append("操作对象:" + argType.Name + " - 对象属性:");
if (argType == typeof(string) || argType.IsPrimitive)
{
str.Append(argument);
}
else
{
foreach (var property in argType.GetProperties())
{
str.AppendFormat("{0} = {1} ;",
property.Name, property.GetValue(argument, null));
}
}
}
return str.ToString();
}
#endregion
///
/// 写入一条日志记录
///
/// 日志记录内容
private void WriteLog(string pLog, string path)
{
lock (path) //排它锁:防止主程序中出现多线程同时访问同一个文件出错
{
// 根据时间创建一个日志文件
var vDT = DateTime.Now;
string vLogDir = string.Format("{0}\\{1}{2}{3}", path, vDT.Year, vDT.Month, vDT.Day);
//创建子目录
if (!Directory.Exists(vLogDir)) Directory.CreateDirectory(vLogDir);
string vLogFile = string.Format("{0}\\{1}.log", vLogDir, vDT.ToString("yyyyMMddHH"));
// 创建文件流,用于写入
using (FileStream fs = new FileStream(vLogFile, FileMode.Append))
{
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(pLog);
sw.Flush();
sw.Close();
fs.Close();
}
}
}
}
public class LoggerHelper : IInterceptor
{
///
/// 拦截方法 打印被拦截的方法执行前的名称、参数和方法执行后的 返回结果
///
/// 包含被拦截方法的信息
public void Intercept(IInvocation invocation)
{
Console.WriteLine("方法执行前:拦截{0}类下的方法{1}的参数是{2}",
invocation.InvocationTarget.GetType(),
invocation.Method.Name, string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray()));
//在被拦截的方法执行完毕后 继续执行
invocation.Proceed();
Console.WriteLine("方法执行完毕,返回结果:{0}", invocation.ReturnValue);
Console.WriteLine();
}
}
}