359 lines
10 KiB
C#
359 lines
10 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Data.SqlClient;
|
|||
|
|
|
|||
|
|
using System.Threading;
|
|||
|
|
using CYQ.Data.Tool;
|
|||
|
|
|
|||
|
|
|
|||
|
|
namespace CYQ.Data
|
|||
|
|
{
|
|||
|
|
internal static class Error
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 抛出异常
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="msg"></param>
|
|||
|
|
internal static object Throw(string msg)
|
|||
|
|
{
|
|||
|
|
//#if DEBUG
|
|||
|
|
// return "";
|
|||
|
|
//#else
|
|||
|
|
throw new Exception("V" + AppConfig.Version + " " + msg);
|
|||
|
|
//#endif
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// LogType
|
|||
|
|
/// <para>日志类型</para>
|
|||
|
|
/// </summary>
|
|||
|
|
public enum LogType
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 调试
|
|||
|
|
/// </summary>
|
|||
|
|
Debug,
|
|||
|
|
/// <summary>
|
|||
|
|
/// 信息
|
|||
|
|
/// </summary>
|
|||
|
|
Info,
|
|||
|
|
/// <summary>
|
|||
|
|
/// 警告
|
|||
|
|
/// </summary>
|
|||
|
|
Warn,
|
|||
|
|
/// <summary>
|
|||
|
|
/// 错误
|
|||
|
|
/// </summary>
|
|||
|
|
Error,
|
|||
|
|
/// <summary>
|
|||
|
|
/// 断言
|
|||
|
|
/// </summary>
|
|||
|
|
Assert
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Write Log to txt or database
|
|||
|
|
/// <para>日志静态类(可将日志输出到文本中)</para>
|
|||
|
|
/// </summary>
|
|||
|
|
public static class Log
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 内部写日志
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="message"></param>
|
|||
|
|
internal static void WriteLog(string message)
|
|||
|
|
{
|
|||
|
|
WriteLog(false, message);
|
|||
|
|
}
|
|||
|
|
internal static void WriteLog(bool isWriteLog, string message)
|
|||
|
|
{
|
|||
|
|
if (isWriteLog || AppConfig.Log.IsWriteLog)
|
|||
|
|
{
|
|||
|
|
if (message.Contains(":OpenCon()"))//数据库链接异常不再写数据库(因为很多情况都指向同一个库)
|
|||
|
|
{
|
|||
|
|
WriteLogToTxt(message, LogType.Error);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
WriteLogToDB(message, LogType.Error);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Error.Throw("Error : " + message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// write log to database [LogConn must has config value]
|
|||
|
|
/// <para>将日志写到数据库中[需要配置LogConn项后方生效 ]</para>
|
|||
|
|
/// </summary>
|
|||
|
|
public static void WriteLogToDB(Exception err)
|
|||
|
|
{
|
|||
|
|
WriteLogToDB(GetExceptionMessage(err));
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// write log to database [LogConn must has config value]
|
|||
|
|
/// <para>将日志写到数据库中[需要配置LogConn项后方生效 ]</para>
|
|||
|
|
/// </summary>
|
|||
|
|
public static void WriteLogToDB(string message)
|
|||
|
|
{
|
|||
|
|
WriteLogToDB(message, LogType.Error);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void WriteLogToDB(string message, LogType logType)
|
|||
|
|
{
|
|||
|
|
WriteLogToDB(message, logType, "System");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void WriteLogToDB(string message, LogType logType, string userName)
|
|||
|
|
{
|
|||
|
|
WriteLogToDB(message, logType.ToString(), userName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public static void WriteLogToDB(string message, string logType, string userName)
|
|||
|
|
{
|
|||
|
|
string conn = AppConfig.Log.LogConn;
|
|||
|
|
if (string.IsNullOrEmpty(conn))
|
|||
|
|
{
|
|||
|
|
WriteLogToTxt("[LogConnIsEmpty]:" + message);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string pageUrl = string.Empty;
|
|||
|
|
if (AppConfig.IsWeb)
|
|||
|
|
{
|
|||
|
|
System.Web.HttpRequest request = System.Web.HttpContext.Current.Request;
|
|||
|
|
pageUrl = request.Url.Scheme + "://" + request.Url.Authority + request.RawUrl;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
pageUrl = AppConst.RunFolderPath;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
using (SysLogs el = new SysLogs())
|
|||
|
|
{
|
|||
|
|
el.AllowWriteLog = false;
|
|||
|
|
el.LogType = logType.ToString();
|
|||
|
|
el.PageUrl = pageUrl;
|
|||
|
|
el.Message = message;
|
|||
|
|
el.UserName = userName;
|
|||
|
|
el.CreateTime = DateTime.Now;
|
|||
|
|
el.Insert(InsertOp.None);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
WriteLogToTxt("[WriteDbLogError]:" + message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region 日志写到文件
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Write log to txt
|
|||
|
|
/// <para>将日志写到外部txt[web.config中配置路径,配置项为Logpath,默认路径为 "Log/" ]</para>
|
|||
|
|
/// </summary>
|
|||
|
|
public static void WriteLogToTxt(string message)
|
|||
|
|
{
|
|||
|
|
WriteLogToTxt(message, null);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public static void WriteLogToTxt(string message, LogType logType)
|
|||
|
|
{
|
|||
|
|
WriteLogToTxt(message, logType.ToString());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void WriteLogToTxt(string message, string logType)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string folder = AppConfig.RunPath;
|
|||
|
|
string logPath = AppConfig.Log.LogPath;
|
|||
|
|
if (logPath.StartsWith("~/"))
|
|||
|
|
{
|
|||
|
|
logPath = logPath.Substring(2);
|
|||
|
|
}
|
|||
|
|
folder = folder + logPath;
|
|||
|
|
if (!System.IO.Directory.Exists(folder))
|
|||
|
|
{
|
|||
|
|
System.IO.Directory.CreateDirectory(folder);
|
|||
|
|
}
|
|||
|
|
string todayKey = DateTime.Today.ToString("yyyyMMdd") + ".txt";
|
|||
|
|
if (!string.IsNullOrEmpty(logType))
|
|||
|
|
{
|
|||
|
|
if (logType.EndsWith(".txt"))
|
|||
|
|
{
|
|||
|
|
todayKey = logType;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
todayKey = logType.TrimEnd('_') + '_' + todayKey;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
string filePath = folder + todayKey;
|
|||
|
|
string title = "V" + AppConfig.Version + " Record On : " + DateTime.Now.ToString() + " : " + Log.Url;
|
|||
|
|
string body = title + AppConst.NewLine + AppConst.NewLine + message + AppConst.NewLine;
|
|||
|
|
body += "---------------------------------------" + AppConst.NewLine + AppConst.NewLine;
|
|||
|
|
IOHelper.Save(filePath, body, true, false);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch //(Exception err)
|
|||
|
|
{
|
|||
|
|
//Error.Throw("Log.WriteLogToTxt() : " + err.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void WriteLogToTxt(Exception err)
|
|||
|
|
{
|
|||
|
|
if (err is ThreadAbortException)//线程中止异常不记录
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
string message = GetExceptionMessage(err);
|
|||
|
|
WriteLogToTxt("[Exception]:" + message + AppConst.NewLine + err.StackTrace);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
internal static string Url
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
string pageUrl = string.Empty;
|
|||
|
|
if (AppConfig.IsWeb)
|
|||
|
|
{
|
|||
|
|
System.Web.HttpRequest request = System.Web.HttpContext.Current.Request;
|
|||
|
|
pageUrl = request.Url.Scheme + "://" + request.Url.Authority + request.RawUrl;
|
|||
|
|
if (request.UrlReferrer != null && request.Url != request.UrlReferrer)
|
|||
|
|
{
|
|||
|
|
pageUrl += AppConst.NewLine + AppConst.NewLine + "Referer:" + request.UrlReferrer.ToString();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return pageUrl;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Convert Exception to string
|
|||
|
|
/// <para>获取异常的内部信息</para>
|
|||
|
|
/// </summary>
|
|||
|
|
public static string GetExceptionMessage(Exception err)
|
|||
|
|
{
|
|||
|
|
string message = err.Message;
|
|||
|
|
if (err.InnerException != null)
|
|||
|
|
{
|
|||
|
|
message += ":" + err.InnerException.Message + AppConst.NewLine + err.InnerException.StackTrace;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
message += ":" + AppConst.NewLine + err.StackTrace;
|
|||
|
|
}
|
|||
|
|
return message;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// A class for you to Write log to database
|
|||
|
|
/// <para>日志记录到数据库(需要配置LogConn链接后方有效)</para>
|
|||
|
|
/// </summary>
|
|||
|
|
public class SysLogs : Orm.SimpleOrmBase
|
|||
|
|
{
|
|||
|
|
public SysLogs()
|
|||
|
|
{
|
|||
|
|
base.SetInit(this, AppConfig.Log.LogTableName, AppConfig.Log.LogConn);
|
|||
|
|
}
|
|||
|
|
private int _ID;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 标识主键
|
|||
|
|
/// </summary>
|
|||
|
|
public int ID
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _ID;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_ID = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
private string _LogType;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 日志类型
|
|||
|
|
/// </summary>
|
|||
|
|
public string LogType
|
|||
|
|
{
|
|||
|
|
get { return _LogType; }
|
|||
|
|
set { _LogType = value; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private string _PageUrl;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 请求的地址
|
|||
|
|
/// </summary>
|
|||
|
|
public string PageUrl
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(_PageUrl))
|
|||
|
|
{
|
|||
|
|
_PageUrl = Log.Url;
|
|||
|
|
}
|
|||
|
|
return _PageUrl;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_PageUrl = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
private string _Message;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 日志内容
|
|||
|
|
/// </summary>
|
|||
|
|
public string Message
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _Message;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_Message = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
private string _UserName;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 记录者用户名
|
|||
|
|
/// </summary>
|
|||
|
|
public string UserName
|
|||
|
|
{
|
|||
|
|
get { return _UserName; }
|
|||
|
|
set { _UserName = value; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private DateTime _CreateTime;
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建时间
|
|||
|
|
/// </summary>
|
|||
|
|
public DateTime CreateTime
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (_CreateTime == DateTime.MinValue)
|
|||
|
|
{
|
|||
|
|
_CreateTime = DateTime.Now;
|
|||
|
|
}
|
|||
|
|
return _CreateTime;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_CreateTime = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|