예제 #1
0
        public BufferedLogRoute(string kind, LogPriority minimalPriority, LogInfoOptions infoOptions, int bufferSize) : base(kind, minimalPriority)
        {
            this.LogInfoOptions = infoOptions;
            this.BufferSize     = Math.Max(bufferSize, 1);

            MasterBuffer = new FastStreamBuffer(false, this.BufferSize);
        }
예제 #2
0
        public static string GetMultilineText(string src, LogInfoOptions opt, int paddingLenForNextLines = 1)
        {
            if ((opt.NewLineForString?.IndexOf("\n") ?? -1) == -1)
            {
                paddingLenForNextLines = 0;
            }

            string pad = Str.MakeCharArray(' ', paddingLenForNextLines);

            string[]      lines = src._GetLines();
            StringBuilder sb    = new StringBuilder();

            int num = 0;

            foreach (string line in lines)
            {
                if (line._IsFilled())
                {
                    string line2 = line.TrimEnd();
                    if (num >= 1)
                    {
                        sb.Append(opt.NewLineForString);
                        sb.Append(pad);
                    }
                    sb.Append(line2);
                    num++;
                }
            }

            return(sb.ToString());
        }
예제 #3
0
        public static string GetTextFromData(object?data, LogInfoOptions opt)
        {
            if (data == null)
            {
                return("null");
            }
            if (data is string str)
            {
                return(str);
            }

            return(data._GetObjectDump("", opt.ObjectPrintSeparator, true));
        }
예제 #4
0
        public LoggerLogRoute(string kind, LogPriority minimalPriority, string prefix, string dir, LogSwitchType switchType, LogInfoOptions infoOptions,
                              long?autoDeleteTotalMaxSize = null) : base(kind, minimalPriority)
        {
            if (minimalPriority == LogPriority.None)
            {
                return;
            }

            Log = new Logger(dir, kind, prefix, LocalLogRouter.UniqueLogProcessId,
                             switchType: switchType,
                             infoOptions: infoOptions,
                             maxLogSize: CoresConfig.Logger.DefaultMaxLogSize,
                             autoDeleteTotalMinSize: autoDeleteTotalMaxSize ?? CoresConfig.Logger.DefaultAutoDeleteTotalMinSize);

            AddDirectDisposeLink(Log);
        }
예제 #5
0
        public Logger(string dir, string kind, string prefix, int uniqueProcessId, LogSwitchType switchType, LogInfoOptions infoOptions,
                      long maxLogSize             = 0, string extension = DefaultExtension,
                      long?autoDeleteTotalMinSize = null,
                      bool keepFileHandleWhenIdle = true)
            : base()
        {
            this.UniqueProcessId        = uniqueProcessId;
            this.DirName                = dir._NonNullTrim();
            this.Kind                   = kind._NonNullTrim()._FilledOrDefault(LogKind.Default);
            this.Prefix                 = prefix._NonNullTrim()._FilledOrDefault("log")._ReplaceStr("\\", "_").Replace("/", "_");
            this.SwitchType             = switchType;
            this.Extension              = extension._FilledOrDefault(DefaultExtension);
            this.KeepFileHandleWhenIdle = keepFileHandleWhenIdle;
            if (this.MaxLogSize <= 0)
            {
                this.MaxLogSize = CoresConfig.Logger.DefaultMaxLogSize;
            }
            this.MaxLogSize = Math.Max(maxLogSize, BufferCacheMaxSize * 10L);
            if (this.Extension.StartsWith(".") == false)
            {
                this.Extension = "." + this.Extension;
            }

            this.InfoOptions = infoOptions._CloneDeep();
            this.InfoOptions.Normalize(this.Kind);


            if (autoDeleteTotalMinSize != null && autoDeleteTotalMinSize.Value != long.MaxValue)
            {
                autoDeleteTotalMinSize = autoDeleteTotalMinSize._FilledOrDefault(CoresConfig.Logger.DefaultAutoDeleteTotalMinSize.Value);
                this.Eraser            = new OldFileEraser(autoDeleteTotalMinSize ?? 0, dir._SingleArray(), extension, CoresConfig.Logger.EraserIntervalMsecs);
            }

            LogTask = LogThreadAsync()._LeakCheck();
        }
예제 #6
0
        public void WriteRecordToBuffer(LogInfoOptions opt, MemoryBuffer <byte> b)
        {
            if (opt.WriteAsJsonFormat && Dbg.IsJsonSupported)
            {
                // JSON text
                LogJsonData jc = new LogJsonData();

                if (opt.WithTimeStamp)
                {
                    jc.TimeStamp = this.TimeStamp;
                }

                if (opt.WithGuid)
                {
                    jc.Guid = this.Guid;
                }

                if (opt.WithMachineName)
                {
                    jc.MachineName = opt.MachineName;
                }

                if (opt.WithAppName)
                {
                    jc.AppName = opt.AppName;
                }

                if (opt.WithKind)
                {
                    jc.Kind = opt.Kind;
                }

                if (opt.WithPriority)
                {
                    jc.Priority = this.Priority.ToString();
                }

                if (opt.WithTag)
                {
                    jc.Tag = this.Tag._FilledOrDefault(LogTag.None);
                }

                if (opt.WithTypeName)
                {
                    jc.TypeName = this.Data?.GetType().Name ?? "null";
                }

                jc.Data = this.Data;

                string jsonText = jc._GetObjectDump(jsonIfPossible: true);

                b.Write(jsonText._GetBytes_UTF8());
                b.Write(CrLfByte);
            }
            else
            {
                // Normal text
                StringBuilder sb = new StringBuilder();

                // Timestamp
                if (opt.WithTimeStamp)
                {
                    sb.Append(this.TimeStamp._ToDtStr(true, DtStrOption.All, false));
                    sb.Append(" ");
                }

                // Additional strings
                List <string?> additionalList = new List <string?>();

                if (opt.WithGuid)
                {
                    additionalList.Add(this.Guid);
                }

                if (opt.WithMachineName)
                {
                    additionalList.Add(opt.MachineName);
                }

                if (opt.WithAppName)
                {
                    additionalList.Add(opt.AppName);
                }

                if (opt.WithKind)
                {
                    additionalList.Add(opt.Kind);
                }

                if (opt.WithPriority)
                {
                    additionalList.Add(this.Priority.ToString());
                }

                if (opt.WithTag)
                {
                    additionalList.Add(this.Tag._FilledOrDefault(LogTag.None));
                }

                if (opt.WithTypeName)
                {
                    additionalList.Add(this.Data?.GetType().Name ?? "null");
                }

                string additionalStr = Str.CombineStringArray(" ", additionalList.ToArray());
                if (additionalStr._IsFilled())
                {
                    sb.Append("[");
                    sb.Append(additionalStr);
                    sb.Append("] ");
                }

                // Log text
                string logText = GetMultilineText(GetTextFromData(this.Data, opt), opt);
                sb.Append(logText);
                sb.Append("\r\n");

                b.Write(sb.ToString()._GetBytes_UTF8());
            }
        }