protected virtual void ProcessLevelLoggerAndChildren(LevelLogger levelLogger, LogLine.LogType[] logTypes, ref StringBuilder sb, int level)
        {
            var children = levelLogger.GetChildren();

            if (children != null)
            {
                var prefix = GetPrefixIndent(level);
                foreach (var child in children)
                {
                    var logLine = child as LogLine;
                    if (logLine != null)
                    {
                        if (logTypes == null || logTypes.Contains(logLine.Type))
                        {
                            sb.AppendLine(String.Format("{0} {1}", prefix, OutputLogLine(logLine)));
                            continue;
                        }
                    }
                    var childLevelLogger = child as LevelLogger;
                    if (childLevelLogger != null)
                    {
                        if (childLevelLogger.HasErrorsOrInfos())
                        {
                            var keys = childLevelLogger.HasKeys() ? GetKeys(childLevelLogger) : "";
                            var name = GetCategoryName(childLevelLogger);
                            if (!String.IsNullOrEmpty(name))
                            {
                                sb.AppendLine(String.Format("{0} {1} {2}", prefix, name, keys));
                            }
                            ProcessLevelLoggerAndChildren(childLevelLogger, logTypes, ref sb, level + 1);
                        }
                    }
                }
            }
        }