예제 #1
0
파일: Layout.cs 프로젝트: mikeqian/donetlog
        public string GetFormattedMessage(LogEventInfo ev)
        {
            int size = 0;

            foreach (LayoutAppender app in _layoutAppenders) {
                int ebs = app.GetEstimatedBufferSize(ev);
                size += ebs;
            }

            StringBuilder builder = new StringBuilder(size);

            foreach (LayoutAppender app in _layoutAppenders) {
                app.Append(builder, ev);
            }

            return builder.ToString();
        }
예제 #2
0
 public abstract int GetEstimatedBufferSize(LogEventInfo ev);
예제 #3
0
 public abstract void Append(StringBuilder builder, LogEventInfo ev);
예제 #4
0
        private void WriteToAppenders(LogLevel level, ArrayList appenders, IFormatProvider formatProvider, string message, object[] args)
        {
            if (LogManager.ReloadConfigOnNextLog)
                LogManager.ReloadConfig();

            if (appenders.Count == 0)
                return;

            string formattedMessage;

            if (args == null)
                formattedMessage = message;
            else
                formattedMessage = String.Format(formatProvider, message, args);

            LogEventInfo logMessage = new LogEventInfo(DateTime.Now, level, _loggerName, formattedMessage);
            #if !NETCF
            bool needTrace = false;
            bool needTraceSources = false;

            foreach (Appender app in appenders) {
                int nst = app.NeedsStackTrace();

                if (nst > 1) {
                    needTraceSources = true;
                }
                if (nst > 0) {
                    needTrace = true;
                    break;
                }
            }

            StackTrace stackTrace = null;
            if (needTrace) {
                int firstUserFrame = 0;
                stackTrace = new StackTrace(STACK_TRACE_SKIP_METHODS, needTraceSources);

                for (int i = 0; i < stackTrace.FrameCount; ++i)
                {
                    System.Reflection.MethodBase mb = stackTrace.GetFrame(i).GetMethod();

                    if (!mb.DeclaringType.FullName.StartsWith("NLog."))
                    {
                        firstUserFrame = i;
                        break;
                    }
                    else
                    {
                        // Console.WriteLine("skipping stack frame: " + mb);
                    }
                }
                logMessage.SetStackTrace(stackTrace, firstUserFrame);
            }
            #endif
            foreach (Appender app in appenders) {
                app.Append(logMessage);
            }
        }
예제 #5
0
 public abstract void Append(LogEventInfo ev);
예제 #6
0
 public override void Append(LogEventInfo ev)
 {
     _logs.Add(CompiledLayout.GetFormattedMessage(ev));
 }