1

2つ以上のアプリケーションからLogData.xmlファイルにXMLログファイルを書き込みたい。1つのアプリケーションを実行している間、LogData.xmlファイルを正しく作成しますが、同時に両方のalpicationが同時に実行され、LogData.xmlファイルを書き込もうとすると、「プロセスはファイルLog_Data.xmlにアクセスできません」などのエラーメッセージが表示されます。 '別のプロセスで使用されているためです。 私はこのコードを使用します

public void WriteXmlLog(string logType, string logFlag, string logModule, string logLocation, string logText, string logStackTrace)
        {
 if (!File.Exists(_logFilePath))
            {
                //File.WriteAllText(_logFilePath, "<?xml version='1.0' encoding='utf-8' standalone='yes'?>\r\n<AppXmlLogWritter></AppXmlLogWritter>");
                XmlTextWriter textWritter = new XmlTextWriter(_logFilePath, null);
                textWritter.WriteStartDocument();
                textWritter.WriteStartElement("AppXmlLogWritter");
                textWritter.WriteEndElement();
                textWritter.Close();
            }
            XmlDocument xmlDoc = new XmlDocument();
            using (FileStream fileStream = new FileStream(_logFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
            {

                string currentDateTime = DateTime.Now.ToString("yyyyMMddHHmmss");
                xmlDoc.Load(fileStream);
                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);

                //}
                //finally
                //{
                //    objMutex.ReleaseMutex();
                //}

            }
            xmlDoc.Save(_logFilePath);
        }

スレッド化せずにこれを達成したい

4

1 に答える 1

0

おそらく、両方のアプリケーションでNLogを使用してロギングを実装し、ターゲットとして同じ xml を設定してみてください。

于 2013-01-16T05:43:02.993 に答える