You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
5.3 KiB

1 month ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.IO;
  5. using System.Text;
  6. using System.Windows.Forms;
  7. using NLog;
  8. using NLog.Config;
  9. using System.Diagnostics;
  10. using System.Reflection;
  11. namespace ShenTun.IcCard.Instance
  12. {
  13. public class LogHelper
  14. {
  15. private static Logger logger = LogManager.GetCurrentClassLogger(); //初始化日志类
  16. public static object HttpContext { get; private set; }
  17. /// <summary>
  18. /// 日志状态枚举
  19. /// </summary>
  20. private enum LogState
  21. {
  22. /// <summary>
  23. /// 用户已登录
  24. /// </summary>
  25. NLogin,
  26. /// <summary>
  27. /// 用户未登录
  28. /// </summary>
  29. YLogin,
  30. }
  31. /// <summary>
  32. /// 静态构造函数
  33. /// </summary>
  34. static LogHelper()
  35. {
  36. //MessageBox.Show(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
  37. //初始化配置日志
  38. LogManager.Configuration = new XmlLoggingConfiguration(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\NLog.txt");
  39. }
  40. /// <summary>
  41. /// 日志写入通用方法(建议使用)
  42. /// </summary>
  43. /// <param name="msg">日志内容</param>
  44. /// <param name="logType"> 日志类别
  45. /// 类别: 1.Debug
  46. /// 2.Info
  47. /// 3.Error
  48. /// 4.Fatal
  49. /// 5.Warn
  50. /// </param>
  51. /// <param name="loginState">登录状态 true:有用户登录信息 false 无用户登录信息</param>
  52. /// <remarks>
  53. /// 注:默认类型为Info 可以配置其他日志 logType用于反射 规则一定要准确
  54. /// 例: 1.默认日志 LogWriter("test log"); 正常的业务日志
  55. /// 2.异常日志 LogWriter("test log","Fatal"); try catch 里请使用这个日志级别
  56. ///
  57. /// </remarks>
  58. public static void LogWriter(string msg, string logType = "Info", bool loginState = true)
  59. {
  60. try
  61. {
  62. string logMethod = ""; //调用者类名和方法名
  63. if (logType == "Fatal")
  64. {
  65. StackTrace trace = new StackTrace();
  66. //获取是哪个类来调用的
  67. string invokerType = trace.GetFrame(1).GetMethod().DeclaringType.Name;
  68. //获取是类中的那个方法调用的
  69. string invokerMethod = trace.GetFrame(1).GetMethod().Name;
  70. logMethod = invokerType + "." + invokerMethod + " | ";
  71. }
  72. string IP = string.Empty; //获取IP
  73. // IP = HttpContext.Current.Request.UserHostAddress; //反射执行日志方法
  74. Type type = typeof(Logger);
  75. MethodInfo method = type.GetMethod(logType, new Type[] { typeof(string) });
  76. if (loginState == true)
  77. {
  78. //如果是登陆状态 可以记录用户的登陆信息 比如用户名,Id等
  79. method.Invoke(logger, new object[] { logMethod + msg + " [ " + IP + " | " + LogState.NLogin + " ]" });
  80. }
  81. else
  82. {
  83. method.Invoke(logger, new object[] { logMethod + msg + " [ " + IP + " | " + LogState.NLogin + " ]" });
  84. }
  85. }
  86. catch
  87. {
  88. //日志代码错误,直接记录日志
  89. Fatal(msg);
  90. Warn(msg);
  91. }
  92. }
  93. /// <summary>
  94. /// 调试日志
  95. /// </summary>
  96. /// <param name="msg">日志内容</param>
  97. private static void Debug(String msg)
  98. {
  99. logger.Debug(msg);
  100. }
  101. /// <summary>
  102. /// 信息日志
  103. /// </summary>
  104. /// <param name="msg">日志内容</param>
  105. /// <remarks>
  106. /// 适用大部分场景
  107. /// 1.记录日志文件
  108. /// </remarks>
  109. private static void Info(String msg)
  110. {
  111. logger.Info(msg);
  112. }
  113. /// <summary>
  114. /// 错误日志
  115. /// </summary>
  116. /// <param name="msg">日志内容</param>
  117. /// <remarks>
  118. /// 适用异常,错误日志记录
  119. /// 1.记录日志文件
  120. /// </remarks>
  121. private static void Error(String msg)
  122. {
  123. logger.Error(msg);
  124. }
  125. /// <summary>
  126. /// 严重致命错误日志
  127. /// </summary>
  128. /// <param name="msg">日志内容</param>
  129. /// <remarks>
  130. /// 1.记录日志文件
  131. /// 2.控制台输出
  132. /// </remarks>
  133. private static void Fatal(String msg)
  134. {
  135. logger.Fatal(msg);
  136. }
  137. /// <summary>
  138. /// 警告日志
  139. /// </summary>
  140. /// <param name="msg">日志内容</param>
  141. /// <remarks>
  142. /// 1.记录日志文件
  143. /// 2.发送日志邮件
  144. /// </remarks>
  145. private static void Warn(String msg)
  146. {
  147. try
  148. {
  149. logger.Warn(msg);
  150. }
  151. catch { }
  152. }
  153. }
  154. }