// Must be a separated method that is called by all other WriteLine methods otherwise calling method cannot be determined.
        private void WriteLineInternal(string message, string category)
        {
            if (string.IsNullOrEmpty(message))
            {
                throw new ArgumentNullException("message");
            }

            if (string.IsNullOrEmpty(category))
            {
                throw new ArgumentNullException("category");
            }

            MethodBase currentMethod = RadoslavFileTraceListener.GetCallingMethod();

            message = string.Join(
                "|",
                DateTime.UtcNow.ToString("yyyy\\/MM\\/dd hh:mm:ss.fffffff", CultureInfo.InvariantCulture),  // Sortable format with milliseconds.
                category.ToUpperInvariant(),
                currentMethod.DeclaringType.Name,
                currentMethod.Name,
                Thread.CurrentThread.ManagedThreadId,
                message);

            base.WriteLine(message);
        }
        /// <summary>
        /// Creates a new instance of the <see cref="RadoslavFileTraceListener"/> class with a specified file name and
        /// adds it to the <see cref="Trace"/>.<see cref="Trace.Listeners"/> collection.
        /// </summary>
        /// <param name="fileName">The log file name.</param>
        /// <returns>The newly created <see cref="RadoslavFileTraceListener"/> instance.</returns>
        public static RadoslavFileTraceListener Add(string fileName)
        {
            RadoslavFileTraceListener result = new RadoslavFileTraceListener(fileName);

            Trace.Listeners.Add(result);

            return(result);
        }
        /// <summary>
        /// Creates a new instance of the <see cref="RadoslavFileTraceListener"/> class with a temp file name and
        /// adds it to the <see cref="Trace"/>.<see cref="Trace.Listeners"/> collection.
        /// </summary>
        /// <returns>The newly created <see cref="RadoslavFileTraceListener"/> instance.</returns>
        public static RadoslavFileTraceListener Add()
        {
            RadoslavFileTraceListener result = new RadoslavFileTraceListener();

            Trace.Listeners.Add(result);

            return(result);
        }
        /// <summary>
        /// Changes the underlying log file name.
        /// </summary>
        /// <remarks>This method removes the current <see cref="RadoslavFileTraceListener"/> instance from the
        /// <see cref="Trace"/>.<see cref="Trace.Listeners"/> collection, renames the old file to <paramref name="newFileName"/>,
        /// and creates a new <see cref="RadoslavFileTraceListener"/> instance logging to the new file name.</remarks>
        /// <param name="newFileName">The new file name.</param>
        /// <returns>A new <see cref="RadoslavFileTraceListener"/> instance with the specified file name.</returns>
        public RadoslavFileTraceListener ChangeFileName(string newFileName)
        {
            this.Flush();

            Trace.Listeners.Remove(this);

            this.Close();

            string logFileFolder = Path.GetDirectoryName(newFileName);

            if (!Directory.Exists(logFileFolder))
            {
                Directory.CreateDirectory(logFileFolder);
            }

            File.Move(this.fileName, newFileName);

            RadoslavFileTraceListener result = new RadoslavFileTraceListener(newFileName);

            Trace.Listeners.Add(result);

            return(result);
        }