summaryrefslogtreecommitdiffstats
path: root/java/com/google/gerrit/sshd/SshLogLayout.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/google/gerrit/sshd/SshLogLayout.java')
-rw-r--r--java/com/google/gerrit/sshd/SshLogLayout.java137
1 files changed, 137 insertions, 0 deletions
diff --git a/java/com/google/gerrit/sshd/SshLogLayout.java b/java/com/google/gerrit/sshd/SshLogLayout.java
new file mode 100644
index 0000000000..442ec52cb2
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshLogLayout.java
@@ -0,0 +1,137 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.sshd;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.TimeZone;
+import org.apache.log4j.Layout;
+import org.apache.log4j.spi.LoggingEvent;
+import org.eclipse.jgit.util.QuotedString;
+
+public final class SshLogLayout extends Layout {
+
+ private static final String P_SESSION = "session";
+ private static final String P_USER_NAME = "userName";
+ private static final String P_ACCOUNT_ID = "accountId";
+ private static final String P_WAIT = "queueWaitTime";
+ private static final String P_EXEC = "executionTime";
+ private static final String P_STATUS = "status";
+ private static final String P_AGENT = "agent";
+
+ private final Calendar calendar;
+ private long lastTimeMillis;
+ private final char[] lastTimeString = new char[20];
+ private final SimpleDateFormat tzFormat;
+ private char[] timeZone;
+
+ public SshLogLayout() {
+ final TimeZone tz = TimeZone.getDefault();
+ calendar = Calendar.getInstance(tz);
+
+ tzFormat = new SimpleDateFormat("Z");
+ tzFormat.setTimeZone(tz);
+ }
+
+ @Override
+ public String format(LoggingEvent event) {
+ final StringBuffer buf = new StringBuffer(128);
+
+ buf.append('[');
+ formatDate(event.getTimeStamp(), buf);
+ buf.append(']');
+
+ req(P_SESSION, buf, event);
+ req(P_USER_NAME, buf, event);
+ req(P_ACCOUNT_ID, buf, event);
+
+ buf.append(' ');
+ buf.append(event.getMessage());
+
+ opt(P_WAIT, buf, event);
+ opt(P_EXEC, buf, event);
+ opt(P_STATUS, buf, event);
+ opt(P_AGENT, buf, event);
+
+ buf.append('\n');
+ return buf.toString();
+ }
+
+ private void formatDate(long now, StringBuffer sbuf) {
+ final int millis = (int) (now % 1000);
+ final long rounded = now - millis;
+ if (rounded != lastTimeMillis) {
+ synchronized (calendar) {
+ final int start = sbuf.length();
+ calendar.setTimeInMillis(rounded);
+ sbuf.append(calendar.get(Calendar.YEAR));
+ sbuf.append('-');
+ sbuf.append(toTwoDigits(calendar.get(Calendar.MONTH) + 1));
+ sbuf.append('-');
+ sbuf.append(toTwoDigits(calendar.get(Calendar.DAY_OF_MONTH)));
+ sbuf.append(' ');
+ sbuf.append(toTwoDigits(calendar.get(Calendar.HOUR_OF_DAY)));
+ sbuf.append(':');
+ sbuf.append(toTwoDigits(calendar.get(Calendar.MINUTE)));
+ sbuf.append(':');
+ sbuf.append(toTwoDigits(calendar.get(Calendar.SECOND)));
+ sbuf.append(',');
+ sbuf.getChars(start, sbuf.length(), lastTimeString, 0);
+ lastTimeMillis = rounded;
+ timeZone = tzFormat.format(calendar.getTime()).toCharArray();
+ }
+ } else {
+ sbuf.append(lastTimeString);
+ }
+ sbuf.append(String.format("%03d", millis));
+ sbuf.append(' ');
+ sbuf.append(timeZone);
+ }
+
+ private String toTwoDigits(int input) {
+ return String.format("%02d", input);
+ }
+
+ private void req(String key, StringBuffer buf, LoggingEvent event) {
+ Object val = event.getMDC(key);
+ buf.append(' ');
+ if (val != null) {
+ String s = val.toString();
+ if (0 <= s.indexOf(' ')) {
+ buf.append(QuotedString.BOURNE.quote(s));
+ } else {
+ buf.append(val);
+ }
+ } else {
+ buf.append('-');
+ }
+ }
+
+ private void opt(String key, StringBuffer buf, LoggingEvent event) {
+ Object val = event.getMDC(key);
+ if (val != null) {
+ buf.append(' ');
+ buf.append(val);
+ }
+ }
+
+ @Override
+ public boolean ignoresThrowable() {
+ return true;
+ }
+
+ @Override
+ public void activateOptions() {}
+}