Лучший способ написать лог-файл из разных пользовательских элементов управления
Я просто хочу записывать важные вещи в файл журнала, как. TXT. Я создал класс ErrorHandling для этого. Я читаю коды ошибок из файла CSV и добавляю текст в консоль / графический интерфейс. Теперь проблема в том, что я хочу записать файл ошибок из разных UserControls, но консоль находится в MainWindow. Как я могу просто добавить текст в мою консоль вывода из моего класса?
Это мой класс ErrorHandling.
public class ErrorHandling
{
public static Action WriteErrorLog;
private static object writeLock = new object();
public enum errorState
{
INFO, WARNING, CRIT
}
public string getErrorString(int ErrorCode)
{
var errorString = string.Empty;
var reader = new StreamReader(File.OpenRead(@"errorCodes.csv"));
List<string> Codes = new List<string>();
List<string> Error = new List<string>();
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(';');
Codes.Add(values[0]);
Error.Add(values[3]);
}
var index = Codes.FindIndex(p => p == ErrorCode.ToString());
if (index == -1)
return "Unbekannter Fehler aufgetreten!";
else
return Error[index] + " (" + Codes[index] + ")";
}
public void addToLogFile(errorState error, int errorCode = 0, string errorText = null)
{
var errorTextResult = error.ToString();
if (errorCode == 0 && errorText == null)
{
return;
}
else if (errorCode != 0 && errorText != null)
{
errorTextResult += " - " + DateTime.Now.ToString();
errorTextResult += " : " + getErrorString(errorCode) + "\n";
errorTextResult += errorText;
}
else if (errorCode != 0 && errorText == null)
{
errorTextResult += " - " + DateTime.Now.ToString();
errorTextResult += " : " + getErrorString(errorCode);
}
else if ( errorCode == 0 && errorText != null)
{
errorTextResult += " - " + DateTime.Now.ToString() + " : ";
errorTextResult += errorText;
}
ThreadPool.QueueUserWorkItem(writeToLogFile, errorTextResult);
}
#region LogDatei schreiben
public static void writeToLogFile(object text)
{
try
{
if (!File.Exists(Properties.Settings.Default.LogFilePath))
{
using(var writer = File.AppendText(Properties.Settings.Default.LogFilePath))
writer.WriteLine(Properties.Settings.Default.LogFilePath, "LatikeManager Logfile " + DateTime.Now.ToString());
}
using (var writer = File.AppendText(Properties.Settings.Default.LogFilePath))
writer.WriteLine(Properties.Settings.Default.LogFilePath, text + "\n");
WriteErrorLog();
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim schreiben der Log Datei : \n" + text + "\n" + ex.ToString());
}
}
#endregion
}
Когда я просто добавляю текст из другого UserControl, действие не запускается, потому что это новый экземпляр ErrorHandling.
1 ответ
Решение
Я только что нашел рабочее разрешение.
Я сейчас использую метод трассировки.
Просто добавил этот код в мой App.conf
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="myTrace" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\LogFile\mytrace.log"></add>
</listeners>
</trace>
</system.diagnostics>
А потом использовал
public static void writeToLogFile(object text)
{
Trace.Write(string.Format("{0}\r\n",text));
}
этот код в моем методе ErrorHandling. Это отлично сработало для меня.