diff --git a/README.md b/README.md
index 71426c598ff25841594b4ed8cf3860b737796650..7e2fcbc579df64dbcb6ad90f0836b57f23aeb72d 100755
--- a/README.md
+++ b/README.md
@@ -29,10 +29,22 @@ e.g.:
 
 `log.info('this', ['array', 8], 4, {type:'test'})`
 
-will logged as  
+will logged as  (with default format)
 
 __YYYY-MM-DDTHH:ii:ss SERVER  INFO  this ["array",8] 4 {"type": "test"}
 
+### Formatting
+
+You can edit the output using the __format__-Option.
+
+Possible Setting:
+
+- __{timestamp}__: Display the timestamp in ISO format
+- __{hostname}__: Display the hostname
+- __{name}__: Display the Application name
+- __{loglevel}__: Display the Loglevel
+- __{message}__: Display the Message
+
 ### Options
 
 ```json
@@ -43,6 +55,7 @@ __YYYY-MM-DDTHH:ii:ss SERVER  INFO  this ["array",8] 4 {"type": "test"}
   "path": "Path Logfile located",
   "loglevel": "Minimal LogLevel. Default: WARN",
   "delimeter": "How to join multiple outputs. Default: (a single space)",
+  "format": "Format the output. Default: {timestamp}\\t{hostname}\\t{loglevel}\\t{message}",
   "graylog": {
     "active": "true or false",
     "mode": "http or udp, defaults to udp",
diff --git a/examples/formatting.js b/examples/formatting.js
new file mode 100755
index 0000000000000000000000000000000000000000..27b20d465246b2b04c8b1b0ba3cd6ed6f5d2bf9c
--- /dev/null
+++ b/examples/formatting.js
@@ -0,0 +1,29 @@
+const Log = require('../index.js')
+
+let log = new Log({
+  name: 'Sample-Application',
+  hostname: 'test-server',
+  loglevel: 'INFO'
+})
+
+log.info('This is an Information in default formatting')
+
+log = new Log({
+  name: 'Sample-Application',
+  hostname: 'test-server',
+  loglevel: 'INFO',
+  format: '{message}'
+})
+console.log()
+console.log('---- Message Only ----')
+log.info('Only the message')
+
+log = new Log({
+  name: 'Sample-Application',
+  hostname: 'test-server',
+  loglevel: 'INFO',
+  format: '{"timestamp":"{timestamp}", "level":"{loglevel}", "message":"{message}"}'
+})
+console.log()
+console.log('---- As JSON ----')
+log.info('JSON Output')
diff --git a/index.js b/index.js
index aec90c9c18746f57451578e9b68b0727bc8c7343..850df8e88932c238f143ffd008d7c4d82fc6f0fe 100755
--- a/index.js
+++ b/index.js
@@ -13,6 +13,11 @@ function Log (options) {
   } else {
     this.loglevel = 2
   }
+  if (this.options.format) { 
+    this.format = this.options.format
+  } else {
+    this.format = '{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}'
+  }
   if (this.options.delimeter) { 
     this.delimeter = this.options.delimeter
   } else {
@@ -109,9 +114,13 @@ function Log (options) {
     } else {
       msgString = this.objectToString(message[0])
     }
-    
+    let msg = this.format
+    msg = msg.replace('{timestamp}', this.getDate())
+    msg = msg.replace('{hostname}', this.hostname)
+    msg = msg.replace('{name}', this.name)
+    msg = msg.replace('{loglevel}', tag)
+    msg = msg.replace('{message}', msgString)
 
-    let msg = this.getDate() + '\t' + this.hostname + '\t' + this.name + '\t' + tag + '\t' + msgString
     switch (tag) {
       case 'INFO':
         console.info(msg)
diff --git a/index.test.js b/index.test.js
index 588a2a1ff66000f75d757a8b570d2b0d664c7016..7fe7c2bc611dc21a313344cc75992cfa00fc5c48 100755
--- a/index.test.js
+++ b/index.test.js
@@ -27,6 +27,7 @@ describe('@general/log', () => {
       expect(log.delimeter).toBe(' ')
       expect(log.name).toBe('@general/log')
       expect(log.hostname).toBe(hostname)
+      expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}')
     })
     it('should use option hostname', () => {
       let log = new LOG({
@@ -36,6 +37,7 @@ describe('@general/log', () => {
       expect(log.delimeter).toBe(' ')
       expect(log.name).toBe('@general/log')
       expect(log.hostname).toBe('test')
+      expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}')
     })
     it('should use option name', () => {
       let log = new LOG({
@@ -45,6 +47,7 @@ describe('@general/log', () => {
       expect(log.delimeter).toBe(' ')
       expect(log.name).toBe('test')
       expect(log.hostname).toBe(hostname)
+      expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}')
     })
     it('should use option delimeter', () => {
       let log = new LOG({
@@ -54,6 +57,7 @@ describe('@general/log', () => {
       expect(log.delimeter).toBe(';')
       expect(log.name).toBe('@general/log')
       expect(log.hostname).toBe(hostname)
+      expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}')
     })
     it('should use option loglevel', () => {
       let log = new LOG({
@@ -63,10 +67,19 @@ describe('@general/log', () => {
       expect(log.delimeter).toBe(' ')
       expect(log.name).toBe('@general/log')
       expect(log.hostname).toBe(hostname)
+      expect(log.format).toBe('{timestamp}\t{hostname}\t{name}\t{loglevel}\t{message}')
+    })
+    it('should use option format', () => {
+      let log = new LOG({
+        format: '{message}'
+      });
+      expect(log.loglevel).toBe(2)
+      expect(log.delimeter).toBe(' ')
+      expect(log.name).toBe('@general/log')
+      expect(log.hostname).toBe(hostname)
+      expect(log.format).toBe('{message}')
     })
     it.todo('should use option graylog')
-    it.todo('should use option file')
-    it.todo('should use option path')
   })
   describe('log by level', () => {
     it('should log fatal only if level is appropriate', () => {
@@ -270,6 +283,62 @@ describe('@general/log', () => {
       expect(logged).toBe(expected)
     })
   })
+  describe('log formatting', () => {
+    it('should log message only if set', () => {
+      let log = new LOG({
+        format: '{message}',
+        loglevel: 'DEBUG'
+      });
+      let logged = log.debug('test')
+      let expected = 'test'
+      expect(logged).toBe(expected)
+    })
+    it('should log hostname only if set', () => {
+      let log = new LOG({
+        format: '{hostname}',
+        loglevel: 'DEBUG'
+      });
+      let logged = log.debug('test')
+      let expected = hostname
+      expect(logged).toBe(expected)
+    })
+    it('should log name only if set', () => {
+      let log = new LOG({
+        format: '{name}',
+        loglevel: 'DEBUG'
+      });
+      let logged = log.debug('test')
+      let expected = '@general/log'
+      expect(logged).toBe(expected)
+    })
+    it('should log timestamp only if set', () => {
+      let log = new LOG({
+        format: '{timestamp}',
+        loglevel: 'DEBUG'
+      });
+      let logged = log.debug('test')
+      let expected = getDate()
+      expect(logged).toBe(expected)
+    })
+    it('should log loglevel only if set', () => {
+      let log = new LOG({
+        format: '{loglevel}',
+        loglevel: 'DEBUG'
+      });
+      let logged = log.debug('test')
+      let expected = 'DEBUG'
+      expect(logged).toBe(expected)
+    })
+    it('should log json like message if set', () => {
+      let log = new LOG({
+        format: '{"timestamp":"{timestamp}", "level":"{loglevel}", "message":"{message}"}',
+        loglevel: 'DEBUG'
+      });
+      let logged = log.debug('test')
+      let expected = '{"timestamp":"' + getDate() + '", "level":"DEBUG", "message":"test"}'
+      expect(logged).toBe(expected)
+    })
+  })
   describe('log to file', () => {
     it('should create the folder if not exists', () => {
       let logPath = os.tmpdir() + '/log-test' + Math.floor(Math.random() * 1000)
@@ -312,7 +381,6 @@ describe('@general/log', () => {
     it.todo('should log to graylog via udp')
     it.todo('should log to graylog via http')
   })
-  // TODO: formatting
   // TODO: log to loki
   // TODO: add mutation test
 })