Как добавить файл, используемый "dotnet" - PullRequest
0 голосов
/ 22 мая 2019

Когда я начал перехватывать и отображать мои исключения из журналов в моем консольном приложении, я понял, что довольно много моих сообщений журнала отсутствуют из-за следующей ошибки

Процесс не может получить доступ к файлу '[MY_LOG_FILE_PATH]', поскольку он используется другим процессом

Так я записываю свои сообщения в файл журнала (я создаю новый файл, который запускается при каждом запуске приложения). Переменные callingClass и callingMethod являются соответственно классом и методом, вызывающим функцию Log.

try
{
    var stackTrace = new StackTrace();
    string callingMethod = stackTrace.GetFrame(1).GetMethod().Name;
    string callingClass = stackTrace.GetFrame(1).GetMethod().ReflectedType.Name;
    string logText = string.Format(format, DateTime.Now, "INFO", callingClass, callingMethod, message);
    if (!Directory.Exists("log"))
        Directory.CreateDirectory("log");
    if (!File.Exists(logFilePath))
        File.Create(logFilePath);
    using (FileStream f = new FileStream(logFilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
    using (StreamWriter sw = new StreamWriter(f))
        sw.WriteLine(logText);
}
catch(IOException)
{
    Console.WriteLine("Processes locking the file:");
    var lockingProcesses = FileHelper.WhoIsLocking(logFilePath);
    foreach (Process p in lockingProcesses)
        Console.WriteLine("Process: " + p.ProcessName + "   Machine:" + p.MachineName);
}
catch (Exception ex)
{
    Console.ForegroundColor = ConsoleColor.DarkRed;
    Console.WriteLine("The following log could not be written to file: " + message);
    Console.WriteLine("Error: " + ex.Message);
    Console.ResetColor();
}

Когда я поймал IOException, вызвавшего описанную выше ситуацию, я обнаружил, что процесс, в котором находится файл журнала, "dotnet" находится на компьютере "." , который я предполагаю, является текущей машиной.

Как мне не потерять сообщения журнала?

IDE : Visual Studio Community 2019 версия 16.0.4

.NET Framework Версия : 4.7.03190

ОС : Windows 10 Pro 64x

Ответы [ 2 ]

1 голос
/ 22 мая 2019

File.Create создает файл и также открывает его. Так что в следующей строке при попытке создать новый FileStream файл уже открыт и выдает ошибку.

Один из вариантов заключается в немедленном вызове Close в потоке файла при его создании:

File.Create(logFilePath).Close();

Другой способ - просто использовать StreamWriter, чтобы открыть / создать файл и пропустить, используя FileStream. Передача true означает добавление к файлу, если он существует.

try
{
    var stackTrace = new StackTrace();
    string callingMethod = stackTrace.GetFrame(1).GetMethod().Name;
    string callingClass = stackTrace.GetFrame(1).GetMethod().ReflectedType.Name;
    string logText = string.Format(format, DateTime.Now, "INFO", callingClass, callingMethod, message);

    if (!Directory.Exists("log"))
        Directory.CreateDirectory("log");

    using (var sw = new StreamWriter(logFilePath, true))
    {
        sw.WriteLine(logText);
    } 
}
catch(IOException)
{
    Console.WriteLine("Processes locking the file:");
    var lockingProcesses = FileHelper.WhoIsLocking(logFilePath);
    foreach (Process p in lockingProcesses)
        Console.WriteLine("Process: " + p.ProcessName + "   Machine:" + p.MachineName);
}
catch (Exception ex)
{
    Console.ForegroundColor = ConsoleColor.DarkRed;
    Console.WriteLine("The following log could not be written to file: " + message);
    Console.WriteLine("Error: " + ex.Message);
    Console.ResetColor();
}
0 голосов
/ 22 мая 2019

Попробуйте перенести ваши сообщения в общую коллекцию BlockingCollection и создайте поток, который читает из этого и записывает в ваш файл журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...