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
{
///
/// 抛出异常
///
///
internal static object Throw(string msg)
{
//#if DEBUG
// return "";
//#else
throw new Exception("V" + AppConfig.Version + " " + msg);
//#endif
}
}
///
/// LogType
/// 日志类型
///
public enum LogType
{
///
/// 调试
///
Debug,
///
/// 信息
///
Info,
///
/// 警告
///
Warn,
///
/// 错误
///
Error,
///
/// 断言
///
Assert
}
///
/// Write Log to txt or database
/// 日志静态类(可将日志输出到文本中)
///
public static class Log
{
///
/// 内部写日志
///
///
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);
}
}
///
/// write log to database [LogConn must has config value]
/// 将日志写到数据库中[需要配置LogConn项后方生效 ]
///
public static void WriteLogToDB(Exception err)
{
WriteLogToDB(GetExceptionMessage(err));
}
///
/// write log to database [LogConn must has config value]
/// 将日志写到数据库中[需要配置LogConn项后方生效 ]
///
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 日志写到文件
///
/// Write log to txt
/// 将日志写到外部txt[web.config中配置路径,配置项为Logpath,默认路径为 "Log/" ]
///
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;
}
}
///
/// Convert Exception to string
/// 获取异常的内部信息
///
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;
}
}
///
/// A class for you to Write log to database
/// 日志记录到数据库(需要配置LogConn链接后方有效)
///
public class SysLogs : Orm.SimpleOrmBase
{
public SysLogs()
{
base.SetInit(this, AppConfig.Log.LogTableName, AppConfig.Log.LogConn);
}
private int _ID;
///
/// 标识主键
///
public int ID
{
get
{
return _ID;
}
set
{
_ID = value;
}
}
private string _LogType;
///
/// 日志类型
///
public string LogType
{
get { return _LogType; }
set { _LogType = value; }
}
private string _PageUrl;
///
/// 请求的地址
///
public string PageUrl
{
get
{
if (string.IsNullOrEmpty(_PageUrl))
{
_PageUrl = Log.Url;
}
return _PageUrl;
}
set
{
_PageUrl = value;
}
}
private string _Message;
///
/// 日志内容
///
public string Message
{
get
{
return _Message;
}
set
{
_Message = value;
}
}
private string _UserName;
///
/// 记录者用户名
///
public string UserName
{
get { return _UserName; }
set { _UserName = value; }
}
private DateTime _CreateTime;
///
/// 创建时间
///
public DateTime CreateTime
{
get
{
if (_CreateTime == DateTime.MinValue)
{
_CreateTime = DateTime.Now;
}
return _CreateTime;
}
set
{
_CreateTime = value;
}
}
}
}