Explorar o código

Clean benchmark implementation

jamming %!s(int64=8) %!d(string=hai) anos
pai
achega
87395f53d3

+ 0 - 5
frameworks/Kotlin/hexagon/.gitignore

@@ -1,5 +0,0 @@
-
-build/
-.gradle/
-
-log/

+ 0 - 32
frameworks/Kotlin/hexagon/benchmark_config.json

@@ -1,32 +0,0 @@
-{
-    "framework" : "hexagon",
-    "tests" : [
-        {
-            "default" : {
-                "json_url" : "/json",
-                "db_url" : "/db",
-                "query_url" : "/query?queries=",
-                "fortune_url" : "/fortune",
-                "update_url" : "/update?queries=",
-                "plaintext_url" : "/plaintext",
-
-                "port" : 9090,
-                "setup_file" : "setup",
-                "approach" : "Realistic",
-                "classification" : "Micro",
-                "database" : "MongoDB",
-                "framework" : "Hexagon",
-                "language" : "Kotlin",
-                "flavor" : "Java8",
-                "orm" : "Raw",
-                "platform" : "Netty",
-                "webserver" : "None",
-                "os" : "Linux",
-                "database_os" : "Linux",
-                "display_name" : "Hexagon",
-                "notes" : "http://there4.co/hexagon",
-                "versus" : "servlet"
-            }
-        }
-    ]
-}

+ 0 - 23
frameworks/Kotlin/hexagon/build.gradle

@@ -1,23 +0,0 @@
-
-buildscript {
-    repositories {
-        jcenter ()
-    }
-
-    dependencies {
-        classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokkaVersion"
-        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
-    }
-}
-
-apply from: "$gradleScripts/hexagon_service.gradle"
-
-mainClassName = "co.there4.hexagon.BenchmarkKt"
-applicationDefaultJvmArgs = [
-    '-Xms64M',
-    '-Xmx64M',
-    '-server',
-    '-XX:+UseNUMA',
-    '-XX:+UseParallelGC',
-    '-XX:+AggressiveOpts'
-]

+ 0 - 11
frameworks/Kotlin/hexagon/gradle.properties

@@ -1,11 +0,0 @@
-
-version=1.0.0
-group=co.there4.hexagon
-description=Hexagon web framework's benchmark
-
-wrapperGradleVersion=3.0
-gradleScripts=https://raw.githubusercontent.com/jaguililla/hexagon/master/gradle
-
-dokkaVersion=0.9.+
-kotlinVersion=1.0.3
-hexagonVersion=0.9.2

+ 41 - 29
frameworks/Kotlin/hexagon/gradlew → frameworks/Kotlin/hexagon/gradle/wrapper

@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
 
 ##############################################################################
 ##
@@ -6,12 +6,30 @@
 ##
 ##############################################################################
 
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
 
 APP_NAME="Gradle"
 APP_BASE_NAME=`basename "$0"`
 
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
 
@@ -30,6 +48,7 @@ die ( ) {
 cygwin=false
 msys=false
 darwin=false
+nonstop=false
 case "`uname`" in
   CYGWIN* )
     cygwin=true
@@ -40,27 +59,12 @@ case "`uname`" in
   MINGW* )
     msys=true
     ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
 esac
 
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+CLASSPATH=$APP_HOME/wrapper.jar
 
 # Determine the Java command to use to start the JVM.
 if [ -n "$JAVA_HOME" ] ; then
@@ -85,7 +89,7 @@ location of your Java installation."
 fi
 
 # Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
     MAX_FD_LIMIT=`ulimit -H -n`
     if [ $? -eq 0 ] ; then
         if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -150,11 +154,19 @@ if $cygwin ; then
     esac
 fi
 
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
+# Escape application args
+save ( ) {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
 }
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
 
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"

+ 5 - 11
frameworks/Kotlin/hexagon/gradlew.bat → frameworks/Kotlin/hexagon/gradle/wrapper.bat

@@ -8,14 +8,14 @@
 @rem Set local scope for the variables with windows NT shell
 if "%OS%"=="Windows_NT" setlocal
 
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
 set DIRNAME=%~dp0
 if "%DIRNAME%" == "" set DIRNAME=.
 set APP_BASE_NAME=%~n0
 set APP_HOME=%DIRNAME%
 
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
 @rem Find java.exe
 if defined JAVA_HOME goto findJavaFromJavaHome
 
@@ -46,10 +46,9 @@ echo location of your Java installation.
 goto fail
 
 :init
-@rem Get command-line arguments, handling Windowz variants
+@rem Get command-line arguments, handling Windows variants
 
 if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
 
 :win9xME_args
 @rem Slurp the command line arguments.
@@ -60,16 +59,11 @@ set _SKIP=2
 if "x%~1" == "x" goto execute
 
 set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
 
 :execute
 @rem Setup the command line
 
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+set CLASSPATH=%APP_HOME%\wrapper.jar
 
 @rem Execute Gradle
 "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

BIN=BIN
frameworks/Kotlin/hexagon/gradle/wrapper.jar


+ 2 - 2
frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties → frameworks/Kotlin/hexagon/gradle/wrapper.properties

@@ -1,6 +1,6 @@
-#Mon Aug 01 16:02:25 CEST 2016
+#Fri Dec 09 22:10:54 CET 2016
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-all.zip

BIN=BIN
frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar


+ 0 - 55
frameworks/Kotlin/hexagon/readme.md

@@ -1,55 +0,0 @@
-
-# Hexagon Benchmarking Test
-
-This is the Hexagon portion of a [benchmarking test suite](../) comparing a variety of web
-development platforms. The test utilizes Hexagon routes, serialization and database access.
-
-
-## Local setup
-
-    tar -Jxvf db.txz && \
-    mongorestore dump/ && \
-    rm -rf dump
-
-
-## Tests
-
-* [Hexagon application](/src/main/java/co/there4/hexagon/Benchmark.kt)
-
-
-## Infrastructure Software Versions
-
-* [Hexagon 0.3.2](http://there4.co/hexagon)
-
-
-## Test URLs
-
-* JSON Encoding Test: http://localhost:5050/json
-* Data-Store/Database Mapping Test: http://localhost:5050/db?queries=5 
-* Plain Text Test: http://localhost:5050/plaintext 
-* Fortunes: http://localhost:5050/fortune 
-* Database updates: http://localhost:5050/update
-
-## Run on OpenShift
-
-https://blog.openshift.com/run-gradle-builds-on-openshift/
-
-
-## Copy to TFB
-
-    rm -f db.txz
-    
-## Run inside vagrant
-
-    toolset/run-tests.py --install server --mode verify --test hexagon
-    
-## Clear
-    
-
-## TODO
-
-* Remove `benchmark_config` optional parameters. Check:
-  //frameworkbenchmarks.readthedocs.io/en/latest/Codebase/Framework-Files/#benchmark-config-file
-
-* Document common commands to test the framework inside Vagrant's development machine
-

+ 0 - 6
frameworks/Kotlin/hexagon/setup.sh

@@ -1,6 +0,0 @@
-#!/bin/bash
-
-fw_depends java
-
-./gradlew
-nohup build/hexagon/bin/hexagon &

+ 0 - 8
frameworks/Kotlin/hexagon/source_code

@@ -1,8 +0,0 @@
-./hexagon/src/main/kotlin/co/there4/hexagon/Benchmark.kt
-./hexagon/src/main/resources/templates/fortunes.html
-./hexagon/src/main/resources/service.properties
-./hexagon/src/main/resources/logback.xml
-./hexagon/src/test/kotlin/co/there4/hexagon/BenchmarkTest.kt
-./hexagon/src/test/resources/logback-test.xml
-./hexagon/build.gradle
-./hexagon/gradle.properties

+ 0 - 103
frameworks/Kotlin/hexagon/src/main/kotlin/co/there4/hexagon/Benchmark.kt

@@ -1,103 +0,0 @@
-package co.there4.hexagon
-
-import co.there4.hexagon.repository.*
-import co.there4.hexagon.serialization.serialize
-import co.there4.hexagon.settings.SettingsManager.setting
-import co.there4.hexagon.web.*
-
-import java.lang.System.getenv
-import java.net.InetAddress.getByName as address
-import java.time.LocalDateTime.now
-import java.util.concurrent.ThreadLocalRandom
-
-import kotlin.reflect.KProperty1
-
-internal data class Message(val message: String = "Hello, World!")
-internal data class Fortune(val _id: Int, val message: String)
-internal data class World(val _id: Int, val id: Int, val randomNumber: Int)
-
-private val DB_ROWS = 10000
-private val CONTENT_TYPE_JSON = "application/json"
-private val QUERIES_PARAM = "queries"
-
-private val DB_HOST = getenv("DBHOST") ?: "localhost"
-private val DB = setting<String>("database") ?: "hello_world"
-private val WORLD: String = setting<String>("worldCollection") ?: "world"
-private val FORTUNE: String = setting<String>("fortuneCollection") ?: "fortune"
-
-private val database = mongoDatabase("mongodb://$DB_HOST/$DB")
-private val worldRepository = repository(WORLD, World::_id)
-private val fortuneRepository = repository(FORTUNE, Fortune::_id)
-
-private inline fun <reified T : Any> repository(name: String, key: KProperty1<T, Int>) =
-    MongoIdRepository(T::class, mongoCollection(name, database), key)
-
-private fun rnd() = ThreadLocalRandom.current().nextInt(DB_ROWS) + 1
-
-private fun Exchange.hasQueryCount() = request[QUERIES_PARAM] == null
-
-private fun Exchange.getDb() {
-    val worlds = (1..getQueries()).map { worldRepository.find(rnd()) }.filterNotNull()
-
-    response.contentType = CONTENT_TYPE_JSON
-    ok(if (hasQueryCount()) worlds[0].serialize() else worlds.serialize())
-}
-
-private fun Exchange.getFortunes() {
-    val fortune = Fortune(0, "Additional fortune added at request time.")
-    val fortunes = fortuneRepository.findObjects().toList() + fortune
-
-    template("fortunes.html", mapOf("fortunes" to fortunes.sortedBy { it.message }))
-}
-
-private fun Exchange.getUpdates() {
-    val worlds = (1..getQueries()).map {
-        val id = rnd()
-        val newWorld = World(id, id, rnd())
-        worldRepository.replaceObject(newWorld)
-        newWorld
-    }
-
-    response.contentType = CONTENT_TYPE_JSON
-    ok(if (hasQueryCount()) worlds[0].serialize() else worlds.serialize())
-}
-
-private fun Exchange.getQueries() =
-    try {
-        val queries = request[QUERIES_PARAM]?.toInt() ?: 1
-        when {
-            queries < 1 -> 1
-            queries > 500 -> 500
-            else -> queries
-        }
-    }
-    catch (ex: NumberFormatException) {
-        1
-    }
-
-private fun Exchange.getPlaintext() {
-    response.contentType = "text/plain"
-    ok("Hello, World!")
-}
-
-private fun Exchange.getJson() {
-    response.contentType = CONTENT_TYPE_JSON
-    ok(Message().serialize())
-}
-
-fun main(args: Array<String>) {
-    before {
-        response.addHeader("Server", "Servlet/3.1")
-        response.addHeader("Transfer-Encoding", "chunked")
-        response.addHeader("Date", httpDate(now()))
-    }
-
-    get("/json") { getJson() }
-    get("/db") { getDb() }
-    get("/query") { getDb() }
-    get("/fortune") { getFortunes() }
-    get("/update") { getUpdates() }
-    get("/plaintext") { getPlaintext() }
-
-    run()
-}

+ 0 - 32
frameworks/Kotlin/hexagon/src/main/resources/logback.xml

@@ -1,32 +0,0 @@
-<!--
- | Logback configuration for tests
- !-->
-<configuration>
-  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
-    <encoder>
-      <Pattern>
-        %d{HH:mm:ss.SSS} %highlight(%-5p) %magenta([%-15.15thread]) %-30logger{30} %cyan(%X{jvmId}) | %m%n
-      </Pattern>
-    </encoder>
-  </appender>
-
-  <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-      <FileNamePattern>log/%d{yyyy-MM-dd}.log</FileNamePattern>
-      <MaxHistory>5</MaxHistory>
-    </rollingPolicy>
-    <encoder>
-      <Pattern>%d{HH:mm:ss.SSS} %-5p [%-15.15thread] %-30logger{30} %X{jvmId} | %m%n</Pattern>
-    </encoder>
-  </appender>
-
-  <root>
-    <level value="off" />
-    <appender-ref ref="console" />
-    <appender-ref ref="file" />
-  </root>
-
-  <logger name="co.there4.hexagon">
-    <level value="off" />
-  </logger>
-</configuration>

+ 0 - 7
frameworks/Kotlin/hexagon/src/main/resources/service.yaml

@@ -1,7 +0,0 @@
-
-bindPort : 9090
-bindAddress : 0.0.0.0
-
-database : hello_world
-worldCollection : world
-fortuneCollection : fortune

+ 0 - 21
frameworks/Kotlin/hexagon/src/main/resources/templates/fortunes.html

@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<head>
-  <title>Fortunes</title>
-</head>
-<body>
-<table>
-  <tr>
-    <th>id</th>
-    <th>message</th>
-  </tr>
-  {% for fortune in fortunes %}
-  <tr>
-    <td>{{ fortune._id }}</td>
-    <td>{{ fortune.message }}</td>
-  </tr>
-  {% endfor %}
-</table>
-</body>
-</html>

+ 0 - 134
frameworks/Kotlin/hexagon/src/test/kotlin/co/there4/hexagon/BenchmarkTest.kt

@@ -1,134 +0,0 @@
-package co.there4.hexagon
-
-import co.there4.hexagon.serialization.parse
-import co.there4.hexagon.web.Client
-import org.asynchttpclient.Response
-import org.testng.annotations.BeforeClass
-import org.testng.annotations.Test
-
-internal const val THREADS = 4
-internal const val TIMES = 4
-
-@Test (threadPoolSize = THREADS, invocationCount = TIMES)
-class BenchmarkTest {
-    private val client = Client("http://localhost:9090")
-
-    @BeforeClass fun warmup() {
-        main(arrayOf())
-
-        val warmupRounds = if (THREADS > 1) 2 else 0
-        (1 ..warmupRounds).forEach {
-            json ()
-            plaintext ()
-            no_query_parameter ()
-            empty_query_parameter ()
-            text_query_parameter ()
-            zero_queries ()
-            one_thousand_queries ()
-            one_query ()
-            ten_queries ()
-            one_hundred_queries ()
-            five_hundred_queries ()
-            fortunes ()
-            no_updates_parameter ()
-            empty_updates_parameter ()
-            text_updates_parameter ()
-            zero_updates ()
-            one_thousand_updates ()
-            one_update ()
-            ten_updates ()
-            one_hundred_updates ()
-            five_hundred_updates ()
-        }
-    }
-
-    fun json () {
-        val response = client.get ("/json")
-        val content = response.responseBody
-
-        checkResponse (response, "application/json")
-        assert ("Hello, World!" == content.parse(Message::class).message)
-    }
-
-    fun plaintext () {
-        val response = client.get ("/plaintext")
-        val content = response.responseBody
-
-        checkResponse (response, "text/plain")
-        assert ("Hello, World!" == content)
-    }
-
-    fun no_query_parameter () {
-        val response = client.get ("/db")
-        val body = response.responseBody
-
-        checkResponse (response, "application/json")
-        val bodyMap = body.parse(Map::class)
-        assert(bodyMap.containsKey (World::_id.name))
-        assert(bodyMap.containsKey (World::randomNumber.name))
-    }
-
-    fun fortunes () {
-        val response = client.get ("/fortune")
-        val content = response.responseBody
-        val contentType = response.headers ["Content-Type"]
-
-        assert (response.headers ["Server"] != null)
-        assert (response.headers ["Date"] != null)
-        assert (content.contains ("&lt;script&gt;alert(&quot;This should not be displayed"))
-        assert (content.contains ("フレームワークのベンチマーク"))
-        assert (contentType.toLowerCase ().contains ("text/html"))
-    }
-
-    fun no_updates_parameter () {
-        val response = client.get ("/update")
-        val body = response.responseBody
-
-        checkResponse (response, "application/json")
-        val bodyMap = body.parse(Map::class)
-        assert(bodyMap.containsKey (World::_id.name))
-        assert(bodyMap.containsKey (World::randomNumber.name))
-    }
-
-    fun empty_query_parameter () = checkDbRequest ("/query?queries", 1)
-    fun text_query_parameter () = checkDbRequest ("/query?queries=text", 1)
-    fun zero_queries () = checkDbRequest ("/query?queries=0", 1)
-    fun one_thousand_queries () = checkDbRequest ("/query?queries=1000", 500)
-    fun one_query () = checkDbRequest ("/query?queries=1", 1)
-    fun ten_queries () = checkDbRequest ("/query?queries=10", 10)
-    fun one_hundred_queries () = checkDbRequest ("/query?queries=100", 100)
-    fun five_hundred_queries () = checkDbRequest ("/query?queries=500", 500)
-
-    fun empty_updates_parameter () = checkDbRequest ("/update?queries", 1)
-    fun text_updates_parameter () = checkDbRequest ("/update?queries=text", 1)
-    fun zero_updates () = checkDbRequest ("/update?queries=0", 1)
-    fun one_thousand_updates () = checkDbRequest ("/update?queries=1000", 500)
-    fun one_update () = checkDbRequest ("/update?queries=1", 1)
-    fun ten_updates () = checkDbRequest ("/update?queries=10", 10)
-    fun one_hundred_updates () = checkDbRequest ("/update?queries=100", 100)
-    fun five_hundred_updates () = checkDbRequest ("/update?queries=500", 500)
-
-    private fun checkDbRequest (path: String, itemsCount: Int) {
-        val response = client.get (path)
-        val content = response.responseBody
-
-        checkResponse (response, "application/json")
-        checkResultItems (content, itemsCount)
-    }
-
-    private fun checkResponse (res: Response, contentType: String) {
-        assert(res.headers ["Server"] != null)
-        assert(res.headers ["Transfer-Encoding"] != null)
-        assert(res.headers ["Content-Type"].contains (contentType))
-    }
-
-    private fun checkResultItems (result: String, size: Int) {
-        val resultsList = result.parse(List::class)
-        assert (size == resultsList.size)
-
-        (1..size).forEach {
-            val r = resultsList[it - 1] as Map<*, *>
-            assert (r.containsKey (World::_id.name) && r.containsKey (World::randomNumber.name))
-        }
-    }
-}

+ 0 - 32
frameworks/Kotlin/hexagon/src/test/resources/logback-test.xml

@@ -1,32 +0,0 @@
-<!--
- | Logback configuration for tests
- !-->
-<configuration>
-  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
-    <encoder>
-      <Pattern>
-        %d{HH:mm:ss.SSS} %highlight(%-5p) %magenta([%-15.15thread]) %-30logger{30} %cyan(%X{jvmId}) | %m%n
-      </Pattern>
-    </encoder>
-  </appender>
-
-  <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-      <FileNamePattern>log/%d{yyyy-MM-dd}.log</FileNamePattern>
-      <MaxHistory>5</MaxHistory>
-    </rollingPolicy>
-    <encoder>
-      <Pattern>%d{HH:mm:ss.SSS} %-5p [%-15.15thread] %-30logger{30} %X{jvmId} | %m%n</Pattern>
-    </encoder>
-  </appender>
-
-  <root>
-    <level value="off" />
-    <appender-ref ref="console" />
-    <appender-ref ref="file" />
-  </root>
-
-  <logger name="co.there4.hexagon">
-    <level value="off" />
-  </logger>
-</configuration>