工程异常日志管理方案

简介: 一、工程错误日志管理方案设计 主要采用SystemInfo.ini设备文件存储标识: DEBUG状态弹出异常; RELEASE状态直接将异常信息写入日志文件而不弹出窗口。

一、工程错误日志管理方案设计

主要采用SystemInfo.ini设备文件存储标识:

DEBUG状态弹出异常;

RELEASE状态直接将异常信息写入日志文件而不弹出窗口。

image

 

调试状态下,

[Setting]
IsShowException=True

运行效果:

image

发布状态下,

[Setting]
IsShowException=False

运行效果:

image

 

二、关键类设计

CIniFileIO.cs类用于读INI文件的IsShowException关键字

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. using System.Runtime.InteropServices;

  6. namespace TestGetSelfNameAPI
  7. {
  8.     public class CIniFileIO
  9.     {
  10.         [DllImport("kernel32")]
  11.         private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
  12.         [DllImport("kernel32")]
  13.         private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
  14.         [DllImport("kernel32")]
  15.         private static extern int GetPrivateProfileString(string section, string key, string def, byte[] BufferRe, uint size, string FilePath);


  16.         #region =============-------Write and Read IsShowException ---------================
  17.         public static bool GetIsShowException()
  18.         {
  19.             bool isShow = true;
  20.             FileInfo sysInfo = new FileInfo(System.Windows.Forms.Application.StartupPath + "\\SystemInfo.ini");
  21.             string sectionName = "Setting";
  22.             string keyName = "IsShowException";
  23.             string truthValue = "True";

  24.             if (sysInfo.Exists)
  25.             {
  26.                 StringBuilder strBuilder = new StringBuilder(255);
  27.                 GetPrivateProfileString(sectionName, keyName, "", strBuilder, 255, sysInfo.ToString().Trim());
  28.                 truthValue = strBuilder.ToString();
  29.                 if (truthValue.Equals("True"))
  30.                     isShow = true;
  31.                 else
  32.                     isShow = false;
  33.             }

  34.             return isShow;
  35.         }

  36.         public static void WriteIsShowException(bool isShowException)
  37.         {
  38.             /* 为DayaSystemInof.ini文件写进信息,来进行登记 */
  39.             string iniFilePath = System.Windows.Forms.Application.StartupPath + "\\SystemInfo.ini";
  40.             string sectionName = "Setting";
  41.             string keyName = "IsShowException";
  42.             string truthValue = "True";

  43.             if (isShowException)
  44.                 truthValue = "True";
  45.             else
  46.                 truthValue = "False";
  47.             string keyValue = truthValue;
  48.             WritePrivateProfileString(sectionName, keyName, keyValue, iniFilePath);
  49.         }
  50.         #endregion
  51.     }
  52. }



CLogManager.cs用于写错误日志文件

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO;
  5. using System.Threading;
  6. using System.Net;
  7. using System.Windows.Forms;
  8. using System.Web;
  9. using System.Diagnostics;

  10. namespace TestGetSelfNameAPI
  11. {
  12.     ///
  13.     /// 通过检测DayaSystemInfo.ini目录下的IsShowException关键字
  14.     /// 以决定是否弹出异常
  15.     ///
  16.     public class CLogManager
  17.     {
  18.         private static string mLogFilePath = null;
  19.         private static object mConcreteObject = new object();
  20.         private static string mStrExecutePath = null;
  21.         private static StreamWriter mLogStringWriter = null;
  22.         private static short mLoggerLevel = 0;

  23.         static CLogManager()
  24.         {
  25.             mStrExecutePath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf(@"\") + 1);
  26.             if (!Directory.Exists(mStrExecutePath + "LogMessage"))
  27.             {
  28.                 Directory.CreateDirectory(mStrExecutePath + "LogMessage");
  29.             }
  30.             mLogFilePath = (mStrExecutePath + @"LogMessage\ExceptionRecordLog.txt");

  31.             if (!File.Exists(mLogFilePath))
  32.             {
  33.                 FileStream fs = File.Create(mLogFilePath);
  34.                 fs.Dispose();
  35.                 fs.Close();
  36.             }
  37.             try
  38.             {
  39.                 string level = System.Configuration.ConfigurationSettings.AppSettings["mLoggerLevel"];
  40.                 mLoggerLevel = short.Parse(level);
  41.             }
  42.             catch
  43.             {
  44.                 mLoggerLevel = 0;
  45.             }
  46.         }

  47.         ///
  48.         /// delete logs which have not been updated for more than 15 days
  49.         ///
  50.         public static void LogClean()
  51.         {
  52.             /* 获取十五天前的日期 */
  53.             string fifteenDaysbefore = DateTime.Now.AddDays(-15.0).ToString("yyyyMMdd");
  54.             string fiveminutebefore = DateTime.Now.AddMinutes(-5.0).ToString("yyyyMMddHHmmSS");
  55.             /* 应用程序目录+LogMessage文件夹 */
  56.             string[] logs = Directory.GetFiles(mStrExecutePath + "LogMessage");

  57.             foreach (string log in logs)
  58.             {
  59.                 System.IO.FileInfo info = new FileInfo(log);

  60.                 if (info.LastWriteTime.ToString("yyyyMMdd").CompareTo(fifteenDaysbefore)
  61.                 {
  62.                     try
  63.                     {
  64.                         File.Delete(log);
  65.                     }
  66.                     catch { }
  67.                 }
  68.             }
  69.         }


  70.         ///
  71.         /// ExceptionHandle 重载函数一
  72.         ///
  73.         public static void ExceptionHandle(string csFileName, string funcName, Exception exceptionName)
  74.         {
  75.             /* 同步访问对象方式 */
  76.             Monitor.Enter(mConcreteObject);
  77.             /* 创建前一天的日期文件(名) */
  78.             string strLogBakPath = mStrExecutePath + @"LogMessage\" + DateTime.Now.AddDays(-1.0).ToString("yyyyMMdd") + ".txt";

  79.             if (!File.Exists(strLogBakPath))
  80.             {
  81.                 /* Copy是非覆盖拷贝,所以要做文件存在性的判断
  82.                  取mLogFilePath,代表全局静态的NetConnectorLog.txt文件的值给前天的日期文件!*/
  83.                 File.Copy(mLogFilePath, strLogBakPath);
  84.             }

  85.             /* mLogStringWriter是一个IO流对象,没有就创建一个StreamWriter;*/
  86.             if (mLogStringWriter == null)
  87.             {
  88.                 /* 取mLogFilePath上的文件,生成一个bak备份文件 */
  89.                 strLogBakPath = mStrExecutePath + @"LogMessage\" + DateTime.Now.ToString("yyyyMMddHHmmsss") + ".txt.bak";
  90.                 File.Copy(mLogFilePath, strLogBakPath);
  91.                 try
  92.                 {
  93.                     mLogStringWriter = new StreamWriter(mLogFilePath);
  94.                 }
  95.                 catch { }
  96.             }
  97.             try
  98.             {
  99.                 mLogStringWriter.WriteLine("Exceptoin occurred in " + csFileName + "'s " + funcName + "() At " + string.Format("{0}", DateTime.Now.ToString()) + ">");
  100.                 mLogStringWriter.WriteLine("**********************************************************************************************************************");
  101.                 mLogStringWriter.WriteLine(string.Format("{0}", exceptionName.ToString()));
  102.                 mLogStringWriter.WriteLine("----------------------------------------------------------------------------------------------------------------------");
  103.                 mLogStringWriter.WriteLine();
  104.                 mLogStringWriter.WriteLine();
  105.                 mLogStringWriter.Flush();
  106.             }
  107.             finally
  108.             {
  109.                 /* 释放排他锁 */
  110.                 Monitor.Exit(mConcreteObject);
  111.             }
  112.         }

  113.         ///
  114.         /// 接收上层传进来的异常信息
  115.         ///
  116.         /// 包含发生异常的函数名及所有的文件的名称
  117.         /// 整个异常的信息
  118.         public static void SendException(StackTrace st, Exception exceptionName)
  119.         {
  120.             string csFileName = string.Empty;
  121.             string fileFullName = string.Empty;
  122.             string methodName = string.Empty;

  123.             StackFrame sf = st.GetFrame(0);
  124.             fileFullName = sf.GetFileName();
  125.             csFileName = fileFullName.Substring(fileFullName.LastIndexOf('\\') + 1);
                methodName = sf.GetMethod().Name;


                if (CIniFileIO.GetIsShowException())
                    MessageBox.Show(exceptionName.ToString());
                else
                {
                    ExceptionHandle(csFileName, methodName, exceptionName);
                    LogClean();
                }
            }




            public static void DirectWirteErrorToLog(string csFileName, string methodName, Exception exceptionName)
            {
                ExceptionHandle(csFileName, methodName, exceptionName);
                LogClean();
            }


        }
    }
源工程代码:
img_e25d4fb2f8de1caf41a735ec53088516.pngTestGetSelfNameAPI.rar


三、参考文献

获取当前函数名及函数所在的文件

http://www.cnblogs.com/hyddd/articles/1500808.html

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
12月前
|
运维 监控 安全
Syslog 日志分析与异常检测技巧
系统日志蕴含设备运行关键信息,但分析提取颇具挑战。本文详解从命令行工具(如 Grep、Tail、Awk)到专业软件(如 EventLog Analyzer)的全流程日志分析技巧,助你高效挖掘 Syslog 价值,提升运维与安全响应能力。
680 4
|
11月前
|
运维 监控 安全
2025 年 Splunk 的 5 大替代方案:企业日志管理工具新选择
Splunk 虽强大,但高昂成本和复杂性促使企业寻找替代方案。本文推荐 2025 年五大日志管理与安全分析工具:Log360、Elastic Security、Datadog、Graylog 和 Sumo Logic,涵盖开源、云原生与高性能方向,适配不同企业需求,助你提升安全与运维效率。
887 0
|
存储 监控 Serverless
阿里泛日志设计与实践问题之Grafana Loki在日志查询方案中存在哪些设计限制,如何解决
阿里泛日志设计与实践问题之Grafana Loki在日志查询方案中存在哪些设计限制,如何解决
393 0
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
测试技术 开发工具 git
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
为了高效地发现、定位和解决预发问题,闲鱼团队研发了一套异常日志问题自动追踪-定位-分发机制。这套机制通过自动化手段,实现了异常日志的定时扫描、精准定位和自动分发,显著降低了开发和测试的成本,提高了问题解决的效率。
679 15
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
|
消息中间件 存储 监控
微服务日志监控的挑战及应对方案
【10月更文挑战第23天】微服务化带来模块独立与快速扩展,但也使得日志监控复杂。日志作用包括业务记录、异常追踪和性能定位。
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
487 2
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
1333 8
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
JSON 缓存 fastjson
一行日志引发的系统异常
本文记录了一行日志引发的系统异常以及作者解决问题的思路。
350 11