//using System;
//using System.Collections.Generic;
//using System.Text;
//using System.Diagnostics;
//using System.Collections;
//using System.IO;
//using COSXML.Utils;
//using System.Threading;

//namespace COSXML.Log
//{
//    /// <summary>
//    /// 异步写入本地文件日志
//    /// 日志路径:当前应用工程的Log文件夹下
//    /// 后台写入:开启一个后台线程 logThread
//    /// 缓存区域:开辟一块临时日志缓存区域 logBuffer
//    /// 消息循环机制:循环获取->写入 handle -> looper
//    /// </summary>
//    public sealed class FileLogImpl : Log
//    {
//        private string logDir;
//        private const int LOG_BUFFER_SIZE = 32 * 1024; //32kb
//        private const int LOG_FILE_MAX_COUNTS = 30; // 30个文件数 
//        private const int LOG_FILE_MAX_LENGTH = 3 * 1048576; // 文件最大为3M
//        private Queue<string> logFiles;
//        private List<string> buffer;
//        private int currentBufferSize;

//        private Handler handler;
//        public const byte MESSAGE_COMNE_IN = 0;
//        public const byte MESSAGE_FLUSH = 1;

//        public FileLogImpl(string logDir)
//        {
//            if (String.IsNullOrEmpty(logDir))
//            {
//                Trace.WriteLine("log dir = null");
//            }
//            else
//            {
//                this.logDir = logDir;
//                DirectoryInfo dirInfo = new DirectoryInfo(logDir);
//                if (!dirInfo.Exists) dirInfo.Create();
//                logFiles = new Queue<string>(30);
//                buffer = new List<string>(10);
//                currentBufferSize = 0;
//                handler = new Handler();
//                handler.OnHandleMessage = OnHandleMessage;
//                Thread logThread = new Thread(handler.InternalHandle) { Name = "LogThread", IsBackground = true};
//                logThread.Start();
//            }
//        }

//        private void OnHandleMessage(Message message)
//        {
//            Trace.WriteLine(String.Format("currentThread :name = {0} id = {1} isBackground = {2}", Thread.CurrentThread.Name, Thread.CurrentThread.ManagedThreadId,
//                Thread.CurrentThread.IsBackground));
//            switch (message.what)
//            {
//                case MESSAGE_COMNE_IN:
//                    WriteLogToBuffer((string)message.obj);
//                    break;
//                case MESSAGE_FLUSH:
//                    WriteLogToFile();
//                    break;
//            }
//        }

//        public void PrintLog(string logMessage)
//        {
//            if (handler == null) return;
//            Message message = new Message();
//            message.what = MESSAGE_COMNE_IN;
//            message.obj = logMessage;
//            handler.SendMessage(message);
//        }



//        private void WriteLogToBuffer(string message)
//        {
//            if (message != null)
//            {
//                buffer.Add(message);
//                currentBufferSize += message.Length;
//                if (currentBufferSize > LOG_BUFFER_SIZE)
//                {
//                    handler.SendMessage(MESSAGE_FLUSH);
//                }
//            }
//        }



//        private string GetCurrentLogFilePath()
//        {
//            if (logFiles.Count == 0)
//            {
//                DirectoryInfo dirInfo = new DirectoryInfo(logDir);
//                FileInfo[] fileInfos = dirInfo.GetFiles();
//                Array.Sort(fileInfos, delegate(FileInfo f1, FileInfo f2)
//                {
//                    long prefix1 = 0, prefix2 = 0;
//                    long.TryParse(f1.Name.Split('.')[0], out prefix1);
//                    long.TryParse(f2.Name.Split('.')[0], out prefix2);
//                    if (prefix1 > prefix2) return 1;
//                    if (prefix1 == prefix2) return 0;
//                    if (prefix1 < prefix2) return -1;
//                    return 0;
//                });
//                foreach (FileInfo fileInfo in fileInfos)
//                {
//                    logFiles.Enqueue(fileInfo.FullName);
//                }
//            }
//            int count = logFiles.Count - LOG_FILE_MAX_COUNTS;
//            for (int i = 0; i < count; i++)
//            {
//                logFiles.Dequeue();
//            }
//            if (logFiles.Count > 0)
//            {
//                FileInfo lastFileInfo = new FileInfo(logFiles.ToArray()[logFiles.Count - 1]);
//                if (lastFileInfo.Length < LOG_FILE_MAX_LENGTH)
//                {
//                    return lastFileInfo.FullName;
//                }
//            }
//            string logFileName = String.Format("{0}.log", TimeUtils.GetCurrentTime(TimeUnit.SECONDS));
//            string logFilePath = logDir + System.IO.Path.DirectorySeparatorChar + logFileName;
//            logFiles.Enqueue(logFilePath);
//            return logFilePath;
//        }

//        private void WriteLogToFile()
//        {
//            FileStream fileStream = null;
//            StreamWriter streamWriter = null;
//            try
//            {
//                string logFile = GetCurrentLogFilePath();
//                fileStream = new FileStream(logFile, FileMode.Append, FileAccess.Write);
//                streamWriter = new StreamWriter(fileStream);
//                foreach (string content in buffer)
//                {
//                    streamWriter.Write(content);
//                }
//                streamWriter.Flush();
//                buffer.Clear();
//                currentBufferSize = 0;
//            }
//            catch (Exception)
//            {
//                //Trace.WriteLine(ex.StackTrace);
//            }
//            finally
//            {
//                if (streamWriter != null) streamWriter.Close();
//                //if (fileStream != null)
//                //{
//                //    fileStream.Close();
//                //}
//            }
//        }
//    }

//    public class Handler
//    {
//        private Queue<Message> messageQueue = new Queue<Message>(20);

//        public void SendMessage(Message message)
//        {
//            messageQueue.Enqueue(message);

//        }

//        public void SendMessage(int what)
//        {
//            Message message = new Message();
//            message.what = what;
//            messageQueue.Enqueue(message);
//        }

//        public HandleMessage OnHandleMessage;

//        public void InternalHandle()
//        {
//            long start = TimeUtils.GetCurrentTime(TimeUnit.SECONDS);
//            while (true)
//            {
//                try
//                {
//                    Message message = messageQueue.Dequeue();
//                    OnHandleMessage(message);
//                }
//                catch (Exception)
//                {
//                    //Trace.WriteLine(ex.StackTrace);
//                }
//                long end = TimeUtils.GetCurrentTime(TimeUnit.SECONDS);
//                if (end - start > 10)
//                {
//                    start = end;
//                    SendMessage(FileLogImpl.MESSAGE_FLUSH);
//                }
//            }
//        }

//    }

//    public delegate void HandleMessage(Message message);

//    public class Message
//    {
//        public int what;
//        public Object obj;
//    }
//}