All pastes #408702 Raw Edit

Mine

public text v1 · immutable
#408702 ·published 2007-03-25 01:10 UTC
rendered paste body
using Server.Mobiles;
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Collections.Generic;

namespace Server.Engines.Logging
{
	//	A logger class derived from the producder/consumer model.
	public class LogPCQueue
	{
		//	Static main logger for general debugging.
		public static LogPCQueue Logger = new LogPCQueue( "Logs", "debug.txt" );
		
		//	A nested class to wrap data sent to the worker thread.
		private class LogTask
		{
			public bool m_Exit;
			public string m_Format;
			public object[] m_Args;
			
			public LogTask( bool exit, string taskFormat, params object[] args )
			{
				//	If we are telling the thread to exit that is all we care about.
				if ( exit )
				{
					m_Exit = true;
					return;
				}
				else
				{
					//	These are only written if we are not exited.  m_Exit is explicitly checked by
					//	the worker thread.
					m_Exit = false;
					m_Format = taskFormat;
					m_Args = args;
				}
			}
		}
		
		EventWaitHandle m_Wh = new AutoResetEvent( false );
		Thread m_Worker;
		object m_Locker = new object( );
		Queue< LogTask > m_Tasks = new Queue< LogTask >( );
		
		private FileStream m_Fs;
		private StreamWriter m_Sw;
		
		public void EnqueueTask( LogLevel reqLevel, LogLevel level, string taskFormat, params object[] args )
		{
			EnqueueTask( false, reqLevel, level, taskFormat, args );
		}
		
		public void EnqueueTask( bool exit, LogLevel reqLevel, LogLevel level, string taskFormat, params object[] args )
		{
			try
			{
				if ( exit || reqLevel <= level )
				{
					LogTask task = new LogTask( exit, taskFormat, args );
					lock ( m_Locker ) m_Tasks.Enqueue( task );
					m_Wh.Set( );
				}
			}
			catch ( Exception e )
			{
				Console.WriteLine( "Exception in logger task enqueueing: " + e );
			}
		}
		public void WaitAndExit( )
		{
			//	Queue an exit task then wait for the thread to finish and close any current resources.
			try
			{
				EnqueueTask( false, LogLevel.Unspecified, LogLevel.Unspecified, null );
				m_Worker.Join( );
				m_Wh.Close( );
				m_Fs.Close( );
				m_Sw.Close( );
			}
			catch ( Exception e )
			{
				Console.WriteLine( "Exception in logger cleanup: " + e );
			}
		}
		
		void Work( )
		{
			try
			{
				while ( true )
				{
					LogTask task = null;
					lock ( m_Locker )
					
					if ( m_Tasks.Count > 0 )
					{
						task = m_Tasks.Dequeue( );
						if ( task.m_Exit )
							return;
					}
					
					if ( task != null )
					{
						task.m_Format = DateTime.Now + task.m_Format;
						m_Sw.WriteLine( task.m_Format, task.m_Args );
						m_Sw.Flush( );
					}
					else
						m_Wh.WaitOne( );
				}
			}
			catch ( Exception e )
			{
				Console.WriteLine( "Exception in logger worker thread: " + e );
			}
		}
		
		LogPCQueue( string outDirectory, string outFile )
		{
			try
			{
				string dateFormat = DateTime.Now.ToLongDateString( ).Replace( " ", "_" );
				dateFormat = dateFormat + " " + DateTime.Now.ToLongTimeString( ).Replace(":","_");
				m_Fs = new FileStream( Directory.GetCurrentDirectory( ) + "\\" + outDirectory + "\\" + dateFormat + "_" + outFile, FileMode.OpenOrCreate, FileAccess.Write );
				m_Sw = new StreamWriter( m_Fs );
				m_Worker = new Thread( Work );
				m_Worker.Start( );
			}
			catch ( Exception e )
			{
				Console.WriteLine( "Exception trying to create logger instance: " + e );
			}
		}
	}
}