@SuppressWarnings("unchecked")
	public static Collection<Writer>[][] createWriters(final List<String> tags, final Level minimumLevel, final boolean writingThread) {
		Collection<Writer>[][] matrix = new Collection[tags.size() + 2][Level.values().length - 1];
		ServiceLoader<Writer> loader = new ServiceLoader<Writer>(Writer.class, Map.class);

		Map<String, String> writerProperties = Configuration.getSiblings("writer");

		if (writerProperties.isEmpty()) {
			writerProperties = Collections.singletonMap("writer", RuntimeProvider.getDefaultWriter());
		}

		for (Entry<String, String> entry : writerProperties.entrySet()) {
			Map<String, String> configuration = Configuration.getChildren(entry.getKey());

			String tag = configuration.get("tag");
			Level level = parse(configuration.get("level"), minimumLevel);
			if (level.ordinal() < minimumLevel.ordinal()) {
				level = minimumLevel;
			}

			configuration.remove("tag");
			configuration.remove("level");

			configuration.put("writingthread", Boolean.toString(writingThread));

			Writer writer = loader.create(entry.getValue(), configuration);
			if (writer != null) {
				if (tag == null || tag.isEmpty()) {
					for (int tagIndex = 0; tagIndex < matrix.length; ++tagIndex) {
						addWriter(writer, matrix, tagIndex, level);
					}
				} else if (tag.equals("-")) {
					addWriter(writer, matrix, 0, level);
				} else {
					addWriter(writer, matrix, tags.indexOf(tag) + 1, level);
				}
			}
		}

		for (int tagIndex = 0; tagIndex < matrix.length; ++tagIndex) {
			for (int levelIndex = 0; levelIndex < matrix[tagIndex].length; ++levelIndex) {
				if (matrix[tagIndex][levelIndex] == null) {
					matrix[tagIndex][levelIndex] = Collections.emptyList();
				}
			}
		}

		return matrix;
	}
@ SuppressWarnings ( "unchecked" ) public static Collection < Writer > [ ] [ ] createWriters ( final List < String > tags , final Level minimumLevel , final boolean writingThread ) { Collection < Writer > [ ] [ ] matrix = new Collection [ tags . size ( ) + 2 ] [ Level . values ( ) . length - 1 ] ; ServiceLoader < Writer > loader = new ServiceLoader < Writer > ( Writer . class , Map . class ) ; Map < String , String > writerProperties = Configuration . getSiblings ( "writer" ) ; if ( writerProperties . isEmpty ( ) ) { writerProperties = Collections . singletonMap ( "writer" , RuntimeProvider . getDefaultWriter ( ) ) ; } for ( Entry < String , String > entry : writerProperties . entrySet ( ) ) { Map < String , String > configuration = Configuration . getChildren ( entry . getKey ( ) ) ; String tag = configuration . get ( "tag" ) ; Level level = parse ( configuration . get ( "level" ) , minimumLevel ) ; if ( level . ordinal ( ) < minimumLevel . ordinal ( ) ) { level = minimumLevel ; } configuration . remove ( "tag" ) ; configuration . remove ( "level" ) ; configuration . put ( "writingthread" , Boolean . toString ( writingThread ) ) ; Writer writer = loader . create ( entry . getValue ( ) , configuration ) ; if ( writer != null ) { if ( tag == null || tag . isEmpty ( ) ) { for ( int tagIndex = 0 ; tagIndex < matrix . length ; ++ tagIndex ) { addWriter ( writer , matrix , tagIndex , level ) ; } } else if ( tag . equals ( "-" ) ) { addWriter ( writer , matrix , 0 , level ) ; } else { addWriter ( writer , matrix , tags . indexOf ( tag ) + 1 , level ) ; } } } for ( int tagIndex = 0 ; tagIndex < matrix . length ; ++ tagIndex ) { for ( int levelIndex = 0 ; levelIndex < matrix [ tagIndex ] . length ; ++ levelIndex ) { if ( matrix [ tagIndex ] [ levelIndex ] == null ) { matrix [ tagIndex ] [ levelIndex ] = Collections . emptyList ( ) ; } } } return matrix ; }
Creates a two-dimensional matrix with all configured writers. The first dimension represents the tags. It starts
with untagged writers, following with all tagged writers and ending with writers that accepts all kind of log
entries. The total number of entries is the number of defined tags plus two. The second dimension represents the
severity level. It starts with {@link Level#TRACE} and ends with {@link Level#ERROR}.

@param tags
Order of defined tags
@param minimumLevel
Minimum global severity level
@param writingThread
Defines whether {@link WritingThread} is enabled
@return Matrix with all created writers