Introduce README.md with a project introduction
Allow people to discover the Audit trail plugin and have more
insights of what it is and what are the benefits provided.
Change-Id: Iee2493392c4a41bb09c20767384c5f735c2ba269
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d4c4c19
--- /dev/null
+++ b/README.md
@@ -0,0 +1,105 @@
+# Audit plugin for Gerrit
+
+Plug into the Gerrit Code Review audit extension and format and forward all
+the events to an [SLF4J appender](https://www.slf4j.org), the same logging
+system used internally for the generation of all logs..
+
+## How to configure logging?
+
+Audit events are by default stored into the Gerrit error_log under the appender
+`com.googlesource.gerrit.plugins.auditsl4j.LoggerAudit`. However, it is possible
+to generate a separate audit file and having the audit records formatted into
+CSV or JSON.
+
+For more details, see the [configuration guide](src/main/resources/Documentation/config.md)
+in the plugin.
+
+## Why auditing events on Gerrit?
+
+Audits leave an immutable trace of what happened on Gerrit and allows to answer
+the question "who did what and when?".
+
+When aggregated by time, project or user, can give an overall figure on how much
+the system is utilized and allow to make a better planning of the hardware resources allocation
+and planning the downtimes to reduce the impact on the people and projects.
+
+## Is this a duplicate of Gerrit stream events?
+
+Gerrit stream events are triggered on Git-related operations and reviews, but do
+not cover most of the actions that happen on Gerrit and do not include all the system
+information that is typically needed for audit-trail purposes.
+
+Furthermore, stream events are designed to be consumed in near-real-time while audits,
+are typically archived and consumed off-line.
+
+## What the audit events look like?
+
+The format of Gerrit audits changes across the different releases because they reflect
+the internal representation of the Java objects in memory.
+
+They share an overall basic structure:
+
+- type: Audit java class
+- event: Audit event
+ - session_id: unique identifier of the user's session
+ - who: user that generated the event
+ - account_id: user unique id
+ - access_path: how the user accessed the system
+ - when: epoch time-stamp of the event
+ - what: action performed
+ - result: result of the action
+ - time_at_start: epoch time-stamp of when the action started
+ - elapsed: how long the action lasted (msec)
+ - uuid: audit event UUID
+
+Example audit of a login from a Git client over SSH:
+```json
+{
+ "type": "SshAuditEvent",
+ "event": {
+ "session_id": "0261c43e",
+ "who": {
+ "account_id": {
+ "id": 1011575
+ },
+ "access_path": "GIT",
+ "last_login_external_id_property_key": {}
+ },
+ "when": 1539561891898,
+ "what": "LOGOUT",
+ "params": {},
+ "result": "0",
+ "time_at_start": 1539561891898,
+ "elapsed": 0,
+ "uuid": {
+ "uuid": "audit:f135cb10-59be-4087-a9e0-571680b93a59"
+ }
+ }
+}
+```
+
+Example audit of a Gerrit changes query over SSH:
+```json
+{
+ "type": "SshAuditEvent",
+ "event": {
+ "session_id": "22688824",
+ "who": {
+ "account_id": {
+ "id": 1011203
+ },
+ "access_path": "SSH_COMMAND",
+ "last_login_external_id_property_key": {}
+ },
+ "when": 1539561891503,
+ "what": "gerrit.query.--format.json.--current-patch-set.project:mycompany/myproject commit:798b22fcf3614e8575e0ef23019a9706b8acebcc NOT is:draft",
+ "params": {},
+ "result": "0",
+ "time_at_start": 1539561891503,
+ "elapsed": 3,
+ "uuid": {
+ "uuid": "audit:171a9b6f-327a-40a2-9b66-c47a39eba68c"
+ }
+ }
+}
+```