﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Последовательное логирование в отдельном потоке</title>
  <id>~/topic/3405/posledovatelnoe-logirovanie-v-otdelnom-potoke/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-16T09:43:16Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=3405" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/24104/</id>
    <title type="text">Это было сделано для того, чтобы очередь не отжирала всю память. Это понятно. Вызов я не отменил, а ...</title>
    <published>2013-02-18T10:50:39Z</published>
    <updated>2013-02-18T10:50:39Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;pyhta4og &lt;a href="https://stocksharp.com/posts/m/24103/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Это было сделано для того, чтобы очередь не отжирала всю память. &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Это понятно. Вызов я не отменил, а заменил его пинанием таймера.&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;pyhta4og &lt;a href="https://stocksharp.com/posts/m/24103/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Помимо этого есть режим MaxMessages=-1 когда логирование идет синхронно. Это сделано для того чтобы производить отладку. Иначе получится что вы уже на бреакпойнт в коде робота встали, а логи еще в файл не записались.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Для отладки нужно не костыли городить, а, например, сделать класс-заглушку, которая будет писать, куда надо и как надо, или просто сделать явный ключ bool OneThread.    &lt;br /&gt;&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24103/</id>
    <title type="text">Кстати. У LogManager есть такой косяк: когда количество сообщений превышает заданный максимум (т.е. ...</title>
    <published>2013-02-18T10:43:37Z</published>
    <updated>2013-02-18T10:43:37Z</updated>
    <author>
      <name>pyhta4og</name>
      <uri>https://stocksharp.com/users/497/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;VassilSanych &lt;a href="https://stocksharp.com/posts/m/24100/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Кстати.&lt;br /&gt;У LogManager есть такой косяк:&lt;br /&gt;когда количество сообщений превышает заданный максимум (т.е. как раз когда система очень сильно нагружена), логирование запускается в потоке вызова. &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Это было сделано для того, чтобы очередь не отжирала всю память. &lt;br /&gt;&lt;br /&gt;Помимо этого есть режим MaxMessages=-1 когда логирование идет синхронно. Это сделано для того чтобы производить отладку. Иначе получится что вы уже на бреакпойнт в коде робота встали, а логи еще в файл не записались.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24101/</id>
    <title type="text">Изменил буфер сообщений на конкурентную очередь, убрал все локи, принудительный запуск логирования з...</title>
    <published>2013-02-18T09:11:25Z</published>
    <updated>2013-02-18T09:11:25Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Изменил буфер сообщений на конкурентную очередь, убрал все локи, принудительный запуск логирования заменил перещёлкиванием таймера.&lt;br /&gt;Последнее исправление не тестировал.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24100/</id>
    <title type="text">Кстати. У LogManager есть такой косяк: когда количество сообщений превышает заданный максимум (т.е. ...</title>
    <published>2013-02-18T09:07:16Z</published>
    <updated>2013-02-18T09:07:16Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Кстати.&lt;br /&gt;У LogManager есть такой косяк:&lt;br /&gt;когда количество сообщений превышает заданный максимум (т.е. как раз когда система очень сильно нагружена), логирование запускается в потоке вызова. </content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24088/</id>
    <title type="text">Ага. Понял. Пишет пачками по таймеру (вспомнил, почему у меня пропадало сообщение о завершении работ...</title>
    <published>2013-02-17T17:06:12Z</published>
    <updated>2013-02-17T17:21:24Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Ага. Понял. Пишет пачками по таймеру (вспомнил, почему у меня пропадало сообщение о завершении работы).&lt;br /&gt;И всё-таки лочит основной поток при добавлении сообщения в список. &lt;br /&gt;Очередь была бы производительнее.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24086/</id>
    <title type="text">Так ведь сейчас уже в 4.1 логирование отделено от основного потока. Где? Я не нашёл. LogManager.cs Э...</title>
    <published>2013-02-17T16:52:37Z</published>
    <updated>2013-02-17T16:52:37Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;VassilSanych &lt;a href="https://stocksharp.com/posts/m/24084/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/24083/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Так ведь сейчас уже в 4.1 логирование отделено от основного потока.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Где?&lt;br /&gt;Я не нашёл.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;LogManager.cs Это к слову о важности взаимодействия.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24084/</id>
    <title type="text">Так ведь сейчас уже в 4.1 логирование отделено от основного потока. Где? Я не нашёл. </title>
    <published>2013-02-17T16:35:51Z</published>
    <updated>2013-02-17T16:35:51Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/24083/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Так ведь сейчас уже в 4.1 логирование отделено от основного потока.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Где?&lt;br /&gt;Я не нашёл.&lt;br /&gt;&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24083/</id>
    <title type="text">Логирование включает файловые и другие системные операции. Это в любом случае замедляет выполнение о...</title>
    <published>2013-02-17T16:26:07Z</published>
    <updated>2013-02-17T16:26:07Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;VassilSanych &lt;a href="https://stocksharp.com/posts/m/24075/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Логирование включает файловые и другие системные операции.&lt;br /&gt;Это в любом случае замедляет выполнение основных алгоритмов.&lt;br /&gt;При том, что логирование - операция как раз совершенно не критичная к времени запуска, в отличие от торговых операций.&lt;br /&gt;Это не решение проблемы, это - архитектурная плюшка (о чём и сказано в комментарии темы).&lt;br /&gt;PS&lt;br /&gt;Должно было быть указано, но почему-то не было. Исправил :)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Так ведь сейчас уже в 4.1 логирование отделено от основного потока.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24079/</id>
    <title type="text">Да и вообще была проблема того что блокирование потока логов приводило к блокированию всей системы. ...</title>
    <published>2013-02-17T16:02:45Z</published>
    <updated>2013-02-17T16:02:45Z</updated>
    <author>
      <name>ra81</name>
      <uri>https://stocksharp.com/users/16581/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Да и вообще была проблема того что блокирование потока логов приводило к блокированию всей системы. :). С такой плюшкой думаю сего не повторится.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24071/</id>
    <title type="text">Ещё одна доработка исходников: Разгрузка основного потока от логирования. Возможность изоляции от си...</title>
    <published>2013-02-17T14:02:12Z</published>
    <updated>2013-02-17T15:41:29Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Ещё одна доработка исходников:&lt;br /&gt;Разгрузка основного потока от логирования.&lt;br /&gt;Возможность изоляции от системных ресурсов, связанных с логированием.&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_ef7b359a2d8b4b87971ed6ef0c02a473');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_ef7b359a2d8b4b87971ed6ef0c02a473' style='display:none'&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
public abstract class BaseLogReceiver&amp;lt;TParent&amp;gt; : BaseLogSource&amp;lt;TParent&amp;gt;, ILogReceiver
	{
		/// &amp;lt;summary&amp;gt;
		/// Инициализировать &amp;lt;see cref=&amp;quot;BaseLogReceiver{TParent}&amp;quot;/&amp;gt;.
		/// &amp;lt;/summary&amp;gt;
		protected BaseLogReceiver()
		{
		}

		void ILogReceiver.AddLog(LogMessage message)
		{
			LoggingQueue.AddLogAction(()=&amp;gt;RaiseLog(message));
		}
	}


	/// &amp;lt;summary&amp;gt;
	///  Логирование в отдельном параллельном потоке
	/// &amp;lt;/summary&amp;gt;
	public class LoggingQueue
	{
		//если понадобится подменять реализацию
		public static LoggingQueue Instance { get; set; }


		static LoggingQueue()
		{
			Instance = new LoggingQueue();
		}


		public LoggingQueue()
		{
			StartThread();
		}


		/// &amp;lt;summary&amp;gt;
		///  Запуск отдельного параллельного потока логирования
		/// &amp;lt;/summary&amp;gt;
		protected virtual void StartThread()
		{
			_loggingQueue = new ConcurrentQueue&amp;lt;Action&amp;gt;();
			_waitLog = new AutoResetEvent(false);
			Task.Run(() =&amp;gt; DoLoggingListen());
		}


		private ConcurrentQueue&amp;lt;Action&amp;gt; _loggingQueue;
		private AutoResetEvent _waitLog;


		/// &amp;lt;summary&amp;gt;
		///		Добавление записи в лог
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		public static void AddLogAction(Action action)
		{
			Instance.AddAction(action);
		}


		/// &amp;lt;summary&amp;gt;
		///  Добавление действия записи в лог в очередь потока логирования
		/// &amp;lt;/summary&amp;gt;
		/// &amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
		public virtual void AddAction(Action action)
		{
			_loggingQueue.Enqueue(action);
			_waitLog.Set();
		}


		/// &amp;lt;summary&amp;gt;
		///  Чтение очереди действий логирования
		/// &amp;lt;/summary&amp;gt;
		protected virtual void DoLoggingListen()
		{
			do
			{
				Action logAction;
				if (_loggingQueue.TryDequeue(out logAction))
					logAction.Invoke();
				else
					_waitLog.WaitOne();
			} while (!_stopped);
		}

		private bool _stopped;
		/// &amp;lt;summary&amp;gt;
		///  Создание условий окончания работы прослушивания очереди
		/// &amp;lt;/summary&amp;gt;
		public virtual void Stop()
		{
			_stopped = true;
			_waitLog.Set();
		}

	}


	/// &amp;lt;summary&amp;gt;
	///  Затычка логирования (может понадобиться для тестирования)
	/// &amp;lt;/summary&amp;gt;
	public class LoggingQueueMock: LoggingQueue
	{
		//protected override void DoLoggingListen()
		//{
		//}

		public override void AddAction(Action action)
		{
		}

		protected override void StartThread()
		{
		}
	}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Кстати, можно что-то придумать и для затыкания LoggingHelper.Now.&lt;br /&gt;Потому что привязка кода к ресурсам системного времени - это совсем не TDD.&lt;br /&gt;--------------------------------------&lt;br /&gt;Критика просто жизненно необходима :)&lt;br /&gt;&lt;br /&gt;PS&lt;br /&gt;Беда какая-то с описанием темы. Ломается.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24075/</id>
    <title type="text">Логирование включает файловые и другие системные операции. Это в любом случае замедляет выполнение о...</title>
    <published>2013-02-17T15:19:29Z</published>
    <updated>2013-02-17T15:39:46Z</updated>
    <author>
      <name>VassilSanych</name>
      <uri>https://stocksharp.com/users/6491/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Логирование включает файловые и другие системные операции.&lt;br /&gt;Это в любом случае замедляет выполнение основных алгоритмов.&lt;br /&gt;При том, что логирование - операция как раз совершенно не критичная к времени запуска, в отличие от торговых операций.&lt;br /&gt;Это не решение проблемы, это - архитектурная плюшка (о чём и сказано в комментарии темы).&lt;br /&gt;PS&lt;br /&gt;Должно было быть указано, но почему-то не было. Исправил :)</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/24074/</id>
    <title type="text">Критика просто жизненно необходима :) Начнем с того, что обычно формулируют проблему (типа как перед...</title>
    <published>2013-02-17T15:14:21Z</published>
    <updated>2013-02-17T15:14:42Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;VassilSanych &lt;a href="https://stocksharp.com/posts/m/24071/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Критика просто жизненно необходима :)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Начнем с того, что обычно формулируют проблему (типа как перед чтением стихов произносят название произведения и автора). Как решалась проблема?&lt;br /&gt;&lt;br /&gt;Для примера. Я выделял логирование в отдельный поток, чтобы разгрузить основной поток торговли. Была проблема с перформансом логирования в файл, была решена с помощью параллельного потока.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>