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 クラスを使用する以下のコードを参照してください。一度に 2 つのスレッドが発生した場合、最初のスレッドがタスクを実行している場合、mutex.waitone() メソッドは 2 番目のスレッドを解放しません。Mutex クラスを使用せずに可能ですか?さまざまなアプリケーションの xml ファイルにログを書き込む必要があります

4

1 に答える 1

2

Mutex複数のプロセス間で共有リソースへのアクセスを同期するための標準的な手法です。同じプロセス内での同時アクセスであれば、 などのより軽量なクラスを使用できたはずReaderWriterLockSlimです。しかし、プロセス間の同期をサポートする必要があるため、Mutex が最適です。

または、この場合、ログをテキスト ファイルに書き込むことが適切かどうかを自問し始めるかもしれません。同時実行を処理する EventLog へのログ記録を検討しましたか? 同時実行も処理する共有データベースへのログ記録を検討しましたか?

ところで、手動でログを記録する代わりに、ログ ライブラリを使用してログを記録することを検討しましたかXmlDocument? .NET には既に組み込みのトレース機能があります。そのようなカスタム ソリューションを展開する前に、それらを調査する必要があるかもしれません。

おそらく今、自分自身に問いかけるべき多くの質問があります。

于 2013-01-15T06:23:58.563 に答える