public LogEntryFormatter()

in juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/resources/LogEntryFormatter.java [75:183]


	public LogEntryFormatter(String format, String dateFormat, boolean useStackTraceHashes) {
		this.df = new SimpleDateFormat(dateFormat);
		if (useStackTraceHashes)
			hashes = new ConcurrentHashMap<>();

		fieldIndexes = new HashMap<>();

		format = format
			.replaceAll("\\{date\\}", "%1\\$s")
			.replaceAll("\\{class\\}", "%2\\$s")
			.replaceAll("\\{method\\}", "%3\\$s")
			.replaceAll("\\{logger\\}", "%4\\$s")
			.replaceAll("\\{level\\}", "%5\\$s")
			.replaceAll("\\{msg\\}", "%6\\$s")
			.replaceAll("\\{threadid\\}", "%7\\$s")
			.replaceAll("\\{exception\\}", "%8\\$s");

		this.format = format;

		// Construct a regular expression to match this log entry.
		int index = 1;
		StringBuilder re = new StringBuilder();
		int S1 = 1; // Looking for %
		int S2 = 2; // Found %, looking for number.
		int S3 = 3; // Found number, looking for $.
		int S4 = 4; // Found $, looking for s.
		int state = 1;
		int i1 = 0;
		for (int i = 0; i < format.length(); i++) {
			char c = format.charAt(i);
			if (state == S1) {
				if (c == '%')
					state = S2;
				else {
					if (! (Character.isLetterOrDigit(c) || Character.isWhitespace(c)))
						re.append('\\');
					re.append(c);
				}
			} else if (state == S2) {
				if (Character.isDigit(c)) {
					i1 = i;
					state = S3;
				} else {
					re.append("\\%").append(c);
					state = S1;
				}
			} else if (state == S3) {
				if (c == '$') {
					state = S4;
				} else {
					re.append("\\%").append(format.substring(i1, i));
					state = S1;
				}
			} else if (state == S4) {
				if (c == 's') {
					int group = Integer.parseInt(format.substring(i1, i-1));
					switch (group) {
						case 1:
							fieldIndexes.put("date", index++);
							re.append("(" + dateFormat.replaceAll("[mHhsSdMy]", "\\\\d").replaceAll("\\.", "\\\\.") + ")");
							break;
						case 2:
							fieldIndexes.put("class", index++);
							re.append("([\\p{javaJavaIdentifierPart}\\.]+)");
							break;
						case 3:
							fieldIndexes.put("method", index++);
							re.append("([\\p{javaJavaIdentifierPart}\\.]+)");
							break;
						case 4:
							fieldIndexes.put("logger", index++);
							re.append("([\\w\\d\\.\\_]+)");
							break;
						case 5:
							fieldIndexes.put("level", index++);
							re.append("(SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST)");
							break;
						case 6:
							fieldIndexes.put("msg", index++);
							re.append("(.*)");
							break;
						case 7:
							fieldIndexes.put("threadid", index++);
							re.append("(\\\\d+)");
							break;
						case 8:
							fieldIndexes.put("exception", index++);
							re.append("(.*)");
							break;
						default: // Fall through.
					}
				} else {
					re.append("\\%").append(format.substring(i1, i));
				}
				state = S1;
			}
		}

		// The log parser
		String sre = re.toString();
		if (sre.endsWith("\\%n"))
			sre = sre.substring(0, sre.length()-3);

		// Replace instances of %n.
		sre = sre.replaceAll("\\\\%n", "\\\\n");

		rePattern = Pattern.compile(sre);
		fieldIndexes = mapFrom(fieldIndexes);
	}