kumarravishankar Ответов: 2

Как написать файл асинхронно с помощью logfornet


Я пишу информацию о протоколировании в файл с помощью библиотеки DLL log4net, но я хочу писать файлы асинхронно (например, с помощью async ) с помощью библиотеки dll log4net.

Что я уже пробовал:

public static void WriteInfoToLog(string Message, string RequestID, MCashModel.MCashEnums.RequestResponseType type)
        {
            try
            {
                string file_Path = String.Empty;
                string directory_Path = "~/LogDetails/" + DateTime.Today.ToString("yyyy") + "/" + DateTime.Today.ToString("MM") + "/" + DateTime.Today.ToString("dd") + "/" + DateTime.Now.Hour.ToString();
                if (type == MCashEnums.RequestResponseType.Request)
                {
                    file_Path = directory_Path + "/RQ_" + RequestID + ".txt";
                }
                else if (type == MCashEnums.RequestResponseType.Response)
                {
                    file_Path = directory_Path + "/RQ_" + RequestID + ".txt";
                }

                if (!Directory.Exists(System.Web.HttpContext.Current.Server.MapPath(directory_Path)))
                {
                    Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath(directory_Path));
                }
                if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(file_Path)))
                {
                    File.Create(System.Web.HttpContext.Current.Server.MapPath(file_Path)).Close();
                }
                using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(file_Path)))
                {
                    w.WriteLine("\r\nLog Entry (InFo): ");
                    w.WriteLine("{0}", DateTime.Now.ToString(CultureInfo.InvariantCulture));
                    string err = "URL : " + System.Web.HttpContext.Current.Request.Url.ToString() + "." +
                                  "\r\n XML: \r\n" + Message + ".";
                    //+  "\r\nStack Trace:" + stackTrace + ".";
                    w.WriteLine(err);
                    w.WriteLine("__________________________");
                    w.Flush();
                    w.Close();
                }
            }
            catch (Exception exObject)
            {
                LoggerHelper.LogMessage(exObject.ToString());
            }

        }

Afzaal Ahmad Zeeshan

Поддерживают ли они асинхронный паттерн?

Если нет, пожалуйста, рассмотрите возможность использования объектов задач для запуска процесса сохранения в фоновом режиме.

kumarravishankar

нет ее не поддерживают

kumarravishankar

можете ли вы, пожалуйста, предложить мне образец кода для этого

Afzaal Ahmad Zeeshan

Пожалуйста, смотрите Решение 1 для образца. Конечно, вам потребуется переписать максимум его, чтобы соответствовать вашим потребностям.

2 Ответов

Рейтинг:
2

Afzaal Ahmad Zeeshan

Поскольку ваш API не предоставляет никакого асинхронного подхода к записи данных в файлы, существует только один способ достижения асинхронного шаблона; использование Task объект. Хотя вы также можете использовать потоки, но это будет сложно. Концепция заключается в том, что вы можете запустить любую функцию, которая возвращает Task в фоновом потоке или, по крайней мере, освободите от него свой основной поток пользовательского интерфейса. Таким образом, вы инкапсулируете долго работающий код ввода-вывода в функцию, а затем ждете его в своем коде.

// you will call this function.
public async void writeData() {
    // capture the data
    await _writeIo(data);
    // move onwards
}

private Task _writeIo(object data) {
    // your code to write the content.
}

Что происходит, так это то, что элемент управления будет двигаться назад, когда он попадает в _writeIo, и будет ждать, пока эта функция не завершится. Для получения дополнительной информации об этой концепции, пожалуйста, ознакомьтесь со следующим руководством MSDN, Асинхронное программирование с помощью async и await (C#)[^].

Есть пример, который вы можете использовать на MSDN: Task. Run Метод (Действие) (System.Нарезание резьбы.Задачи)[^].


Рейтинг:
1

Kornfeld Eliyahu Peter

log4net as is не поддерживает асинхронную запись...
Вы должны использовать один из вариантов, например: NuGet Gallery | Log4Net. Async 2.0.3[^]
Также читайте о Асинхронный Файловый Ввод-Вывод[^] в сетях...

Я бы добавил к этому, что IO - по своей природе (по крайней мере, в текущих ОС) блокирует, поэтому решение оборачивает его в отдельный поток и продолжает с основным... Все это хорошо и приятно, но в случае ведения журнала это может быть очень проблематично, из-за возможного объема данных журнала (представьте себе сайт с более чем 10000 одновременными пользователями)...
Поэтому в некоторых случаях лучше позволить одному пользователю ждать лога, чем открывать большое количество потоков для обработки неблокирующего ввода-вывода...
И конечно, надо хорошенько подумать, что и когда регистрировать!!!