Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
.NET 6

Посоветуйте Thread-Safe Logger с записью в файл (не Unit test)

05.05.2022, 20:36. Показов 999. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Через xUnit реально сделать? Что-то крутил-вертел, так и не понял как его юзать вне тест-юнитов.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.05.2022, 20:36
Ответы с готовыми решениями:

Что такое unit test и regression test
Что такое unit test и regression test?

thread-safe ли?
Насколько я понимаю, для х32 процессоров атомарными операциями не являются те, что с double/long long, для х64 же и они атомарны. Если я...

Vector и thread-safe
Как лучше сделать свой класс типа контейнер шаблонный как вектор который будет ещё и thread-safe. Допустим есть обычный класс внутри вектор...

5
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
05.05.2022, 21:31
Лучший ответ Сообщение было отмечено Dragokas как решение

Решение

NLog подойдёт?
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
05.05.2022, 21:47  [ТС]
Спасибо, посмотрю.

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    internal static class Logger
    {
        private static ReaderWriterLock locker = new ReaderWriterLock();
        private static string? appdir = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
        private static string logpath = Path.Combine((appdir != null ? appdir : "").Replace("file:\\", ""), "debug.txt");
        
        public static void WriteDebug(string text)
        {
            try
            {
                locker.AcquireWriterLock(int.MaxValue);
                System.IO.File.AppendAllLines(logpath, new[] { text });
            }
            finally
            {
                locker.ReleaseWriterLock();
            }
        }
    }
Предложенный там же вариант с очередью сообщений в коллекции и отдельным обработчком очереди, конечно ещё по-интереснее.

Но меня ещё интересовал, именно xUnit, т.к. есть готовая приложуха с тест-юнитами с кучей логирований через xUnit, вот и хочу узнать, можно ли тупо скопировать код теста в основную приложуху и юзать тот же код логирования без изменений. Можно конечно Find-Replace / заменить на свое, но все равно интересено, xUnit умеет или нет.
К примеру, если он инжектирован в класс (в юнит-тесте):

C#
1
2
3
4
5
6
7
8
9
public class SomeService
{
    private static readonly LogSource Log = new LogSource();
 
    public SomeService(ITestOutputHelper testOutputHelper)
    {
        LogSettings.RegisterDefaultLogger<XUnitLogger>(LogLevels.Verbose, testOutputHelper);
    }
...
Если я вынесу класс за пределы юнит-теста, как потом создать экземпляр такого класса, т.е. как будет выглядеть реализация этого интерфейса ITestOutputHelper, ссылку на которую мы передаём при создании экземпляра класса.
0
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
05.05.2022, 23:23
Dragokas, причём тут xUnit? Это фреймворк для создания юнит-тестов.

Берите NLog и не переизобретайте велосипед.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
06.05.2022, 15:19  [ТС]
Есть понимание, почему в NLog таргет OutputDebugString срабатывает только при запуске по Ctrl + F5, а по F5 нет?

nlog.config:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      >
 
    <targets>
        <target name="logfile" xsi:type="File" fileName="app.log"
                layout="${longdate} | ${level} | ${message} ${exception:format=tostring}" />
        <target name="logconsole" xsi:type="Console"
                layout="${longdate} | ${level} | ${message} ${exception:format=tostring}" />
        <target name="debugstring" xsi:type="OutputDebugString"
                layout="${longdate} | ${level} | ${message} ${exception:format=tostring}" />
    </targets>
 
    <rules>
        <logger name="*" minlevel="Info" writeTo="logfile" final="true" />
        <logger name="*" minlevel="Debug" writeTo="logconsole" final="true" />
        <logger name="*" minlevel="Trace" writeTo="debugstring" final="true" />
    </rules>
</nlog>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    internal class Program
    {
        private static Logger log = LogManager.GetCurrentClassLogger();
 
        //static async Task Main(string[] args)
        static void Main(string[] args)
        {
            log.Info("Text Info");
            log.Debug("Text Debug");
            log.Trace("Text Trace");
 
            NLog.LogManager.Shutdown();
        }
    }
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.05.2022, 13:18  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
Есть понимание, почему в NLog таргет OutputDebugString срабатывает только при запуске по Ctrl + F5, а по F5 нет?
Вообщем, это особенность работы Visual Studio. Вероятно, есть настройка, отвечающая за перехват вывода OutputDebugString.
Завёл Issue.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2022, 13:18
Помогаю со студенческими работами здесь

Секундомер и thread-safe
В моей программе мне нужно отслеживать время по секундам. Я сделал следующее: создал доп. поток, в котором вызывается методом с телом: ...

Падают Unit-тесты. EnterpriseLibrary 5.0. Logger.Write(message, category);
Есть десктоп C# WPF проект. Используется nUnit + часть тестов написана с использованием RhinoMocks, другая часть с nSubstitute. ...

Thread-safe smart pointer
Нужно мне это для реализации COW механизма. В STL, насколько я понимаю, shared_ptr такого не может дать. Однако, покопавшись в...

Что такое thread safe?
Всем добрый день! Вопрос, собственно, в имени темы.:) Что это такое? Я так понимаю, что переменная не меняет значения при...

Thread-safe ли чтение структур?
Собственно, безопасно ли нескольким потокам одновременно читать значение глобальной переменной, если она не влазит в примитивный тип?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru