| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 | using NamedPipeWrapper;using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;using System.IO.Pipes;using System.Linq;using System.Security.AccessControl;using System.Text;namespace InABox.Logging{    public enum LogType    {        Information,        Query,        Update,        Error    }    public static class Logger    {        private static object logfileLock = new object();        private static NamedPipeServer<String> _pipe;        private static String _name = "";        public static String LogFolder = "";        private static String TmpFolder = "";        private static bool _started = false;        private static bool _logtoconsole = false;        private static LogType[] _logtypes = new LogType[] { LogType.Information, LogType.Query, LogType.Update, LogType.Error };        public static void Start(String folder, bool logtoconsole = false, LogType[] logtypes = null)        {            _logtoconsole = logtoconsole;            if (logtypes != null)                _logtypes = logtypes;            LogFolder = folder;            TmpFolder = Path.Combine(LogFolder, "Temp");            if (!Directory.Exists(TmpFolder))                Directory.CreateDirectory(TmpFolder);            String[] files = Directory.GetFiles(TmpFolder);            foreach (var file in files)                File.Delete(file);            _name = System.Diagnostics.Process.GetCurrentProcess().ProcessName;            PipeSecurity sec = new System.IO.Pipes.PipeSecurity();            sec.SetAccessRule(new PipeAccessRule("Everyone", PipeAccessRights.ReadWrite, AccessControlType.Allow));            _pipe = new NamedPipeServer<String>(_name, sec);            _pipe.ClientConnected += delegate (NamedPipeConnection<String, String> conn)            {                conn.PushMessage("Connected to " + _name);            };            _pipe.Start();            _started = true;        }        public static void Send(LogType logtype, String user, String message)        {            if (!_started)                return;            if (!_logtypes.Any(x => x == logtype))                return;            String type = logtype == LogType.Information ? "INFO" : logtype == LogType.Query ? "READ" : logtype == LogType.Update ? "UPDATE" : "ERROR";            String msg = String.Format("{0:HH:mm:ss.fff} {1} {2} {3}",                DateTime.Now,                type?.PadRight(6),                user?.PadRight(12),                message            );            if (_logtoconsole) //System.Environment.UserInteractive)                Console.WriteLine(msg);            if (_pipe != null)                _pipe.PushMessage(msg);            if (!String.IsNullOrEmpty(LogFolder))            {                if ((logtype == LogType.Information) || (logtype == LogType.Error) || (logtype == LogType.Query))                    UpdateLogFile(msg);                else if (logtype == LogType.Update)                    UpdateJournal(message);            }            //if (logtype == LogType.Error)            //{            //    using (EventLog eventLog = new EventLog("Application"))            //    {            //        eventLog.Source = "Application";            //        eventLog.WriteEntry(msg, EventLogEntryType.Error);            //    }            //}        }        private static void UpdateLogFile(string msg)        {            String filename = Path.Combine(LogFolder, String.Format("{0:yyyy-MM-dd}.log", DateTime.Today));            try            {                lock (logfileLock)                {                    using (StreamWriter sw = new StreamWriter(filename, true, Encoding.UTF8, 65536))                    {                        sw.WriteLine(msg);                        sw.Close();                    }                }            }            catch (Exception e)            {                Console.WriteLine("*** Failed to Update Log: " + e.Message);                Console.WriteLine("*** Message: " + msg);            }        }        private static void UpdateJournal(string sql)        {            String filename = Path.Combine(LogFolder, String.Format("{0:yyyy-MM-dd}.sql", DateTime.Today));            try            {                lock (logfileLock)                {                    using (StreamWriter sw = new StreamWriter(filename, true, Encoding.UTF8, 65536))                    {                        sw.WriteLine(sql);                        sw.Close();                    }                }            }            catch (Exception e)            {                Console.WriteLine("*** Failed to Update SQL Journal: " + e.Message);                Console.WriteLine("*** Message: " + sql);            }        }        public static void Dump(String filename, byte[] bytes)        {            if (!_started)                return;            String file = Path.Combine(TmpFolder, String.Format("{0:yyyy-MM-dd HH-mm-ss-fff} {1}", DateTime.Now, filename));            File.WriteAllBytes(file, bytes);        }        //public static void Save(String data, String tag, String suffix)        //{        //    String filename = Path.Combine( TmpFolder, String.Format("{0:yyyy-MM-dd-HH-mm-ss-ffff} {1}.{2}", DateTime.Now,tag,suffix) );        //    try        //    {        //        File.WriteAllText(filename,data);        //    }        //    catch (Exception e)        //    {        //        Console.WriteLine("*** Failed to Save Dumpt File: " + e.Message);        //        Console.WriteLine("*** Message: " + data);        //    }        //}    }}
 |