1
public void WriteXmlLog(string logType, string logFlag, string logModule, string logLocation, string logText, string logStackTrace)
    {
        Mutex objMutex = new Mutex(false, @"Global\MySharedLog");
        objMutex.WaitOne();
        try
        {
            if(!File.Exists(_logFilePath))
            {
                File.WriteAllText(_logFilePath, "<?xml version='1.0' encoding='utf-8' standalone='yes'?>\r\n <AppXmlLogWritter></AppXmlLogWritter>");
            }

            string currentDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(_logFilePath);
            XmlElement newelement = xmlDoc.CreateElement("LogData");
            XmlElement xmlLogID = xmlDoc.CreateElement("LogID");
            XmlElement xmlLogDateTime = xmlDoc.CreateElement("LogDateTime");
            XmlElement xmlLogType = xmlDoc.CreateElement("LogType");
            XmlElement xmlLogFlag = xmlDoc.CreateElement("LogFlag");
            XmlElement xmlLogApplication = xmlDoc.CreateElement("LogApplication");
            XmlElement xmlLogModule = xmlDoc.CreateElement("LogModule");
            XmlElement xmlLogLocation = xmlDoc.CreateElement("LogLocation");
            XmlElement xmlLogText = xmlDoc.CreateElement("LogText");
            XmlElement xmlLogStackTrace = xmlDoc.CreateElement("LogStackTrace");

            xmlLogID.InnerText = _logIDPrefix + currentDateTime + randomNumber;
            xmlLogDateTime.InnerText = currentDateTime;
            xmlLogType.InnerText = ((LogTypes)Convert.ToInt32(logType)).ToString();
            xmlLogFlag.InnerText = logFlag;
            xmlLogApplication.InnerText = _logApplication;
            xmlLogModule.InnerText = logModule;
            xmlLogLocation.InnerText = logLocation;
            xmlLogText.InnerText = logText;
            xmlLogStackTrace.InnerText = logStackTrace;

            newelement.AppendChild(xmlLogID);
            newelement.AppendChild(xmlLogDateTime);
            newelement.AppendChild(xmlLogType);
            newelement.AppendChild(xmlLogFlag);
            newelement.AppendChild(xmlLogApplication);
            newelement.AppendChild(xmlLogModule);
            newelement.AppendChild(xmlLogLocation);
            newelement.AppendChild(xmlLogText);

            xmlDoc.DocumentElement.AppendChild(newelement);
            xmlDoc.Save(_logFilePath);

        }
        finally
        {
            objMutex.ReleaseMutex();
        }
    }

我正在几个不同应用程序的 xml 文件中编写日志。请参阅下面的代码,我使用 Mutex 类进行锁定目的意味着当两个线程同时出现时,如果第一个线程执行任务,mutex.waitone() 方法将不会释放第二个线程。是否可以不使用 Mutex 类我必须在不同应用程序的 xml 文件中写入日志

4

1 回答 1

2

Mutex是一种跨多个进程同步访问共享资源的标准技术。如果它是同一进程中的并发访问,您可以使用更轻量级的类,例如ReaderWriterLockSlim. 但是由于您需要支持跨进程同步,所以互斥锁是要走的路。

或者也许开始问自己在这种情况下是否适合将日志写入文本文件。您是否考虑过记录到将为您处理并发的 EventLog?您是否考虑过将日志记录到一个共享数据库,该数据库也将为您处理并发?

顺便说一句,您是否考虑过使用日志库来执行日志记录,而不是手动执行一些XmlDocument?.NET 已经具有内置的跟踪功能。也许您应该在推出此类自定义解决方案之前探索它们。

你现在可能应该问自己很多问题。

于 2013-01-15T06:23:58.563 回答