Singleton pattern for logger class

Implementing Singleton Design pattern for logger service is something used extensively.

Here is the implementation which i used recently:

    class Logger
    {
        #region Private member

        //Stream writer to write log to file.
        private static StreamWriter streamWriter = null;

        //Will be used in synchLock to make initialisation thread safe.
        private static Object synchLock = typeof(Logger);
        private static Logger logger = null;

        //Log file name.
        private const string LOG_FILE_NAME = "Log.txt";

        #endregion

        #region Constructors

        ///
        /// Constructor for loggging class.
        /// As singleton design is followed so making this constructor private.
        ///

        private Logger() { }

        #endregion

        #region Public methods
       
        ///
        /// Gets instance of logger class.
        ///

        /// Object of logger class.
        public static Logger Instance()
        {
            //To make class thread safe.
            lock (synchLock)
            {
                if (logger == null)
                {
                    logger = new Logger();
                }
            }
            return logger;
        }

        ///
        /// Logs exception in the log file.
        /// Only Stack trace and message is logged.
        ///

        public void LogException(Exception ex)
        {
            try
            {
                //Open stream if empty.
                if (streamWriter == null)
                {
                    streamWriter = new StreamWriter(LOG_FILE_NAME, true, Encoding.UTF8);
                }
                streamWriter.WriteLine("---------------------------------------------------------------");
                streamWriter.WriteLine(string.Format("Date: {0}", DateTime.UtcNow));
                streamWriter.WriteLine(ex.StackTrace);
                streamWriter.WriteLine(ex.Message);
                streamWriter.WriteLine("--------------------------------------------------------");
            }
            catch { }
            finally
            {
                //Close stream if open.
                if (streamWriter != null)
                {
                    streamWriter.Close();
                }
            }
        }

        #endregion
    }

Comments

Popular posts from this blog

Inversion of control in 3 layer architecture

Consistent Response Validation - Invalid Value for types & Business Rules in Web API