diff --git a/conf/taskotron.yaml.example b/conf/taskotron.yaml.example
--- a/conf/taskotron.yaml.example
+++ b/conf/taskotron.yaml.example
@@ -65,6 +65,9 @@
 ## URL of taskotron buildmaster
 #taskotron_master: http://127.0.0.1/taskmaster/
 
+## URL of artifacts base directory
+#artifacts_baseurl: http://127.0.0.1/artifacts/
+
 ## name of step in buildbot that executes the task
 #buildbot_task_step = 'runtask'
 
diff --git a/libtaskotron/check.py b/libtaskotron/check.py
--- a/libtaskotron/check.py
+++ b/libtaskotron/check.py
@@ -19,7 +19,7 @@
 
 # a list of reserved keywords for TAP output, which can't be overridden in
 # keyvals
-RESERVED_KEYS = ('item', 'type', 'outcome', 'summary', 'details', 'checkname')
+RESERVED_KEYS = ('item', 'type', 'outcome', 'summary', 'details', 'checkname', 'artifact')
 
 class CheckDetail(object):
     '''Class encompassing everything related to the outcome of a check run.
@@ -86,14 +86,18 @@
                          the task metadata, but if a single task produces
                          results for multiple checks, this is the way to override
                          the default behavior.
+    :ivar str artifact: path to a file or directory placed in the artifacts directory,
+                        either absolute ``$artifactsdir/report.html`` or relative
+                        ``report.html``. It will represent task output specific for
+                        this particular :attr:``item``.
     '''
 
     outcome_priority = ('PASSED', 'INFO', 'FAILED', 'NEEDS_INSPECTION',
                         'ABORTED', 'CRASHED')
 
 
     def __init__(self, item, report_type=None, outcome=None, summary='',
-                 output=None, keyvals=None, checkname=None):
+                 output=None, keyvals=None, checkname=None, artifact=None):
         # validate input
         if (output is not None and
             not python_utils.sequence(output, basestring, mutable=True)):
@@ -112,6 +116,7 @@
         self.summary = summary
         self.output = output or []
         self.keyvals = keyvals or {}
+        self.artifact = artifact
 
 
     @property
@@ -276,6 +281,7 @@
         outcome: PASSED
         summary: 5 ERRORS, 10 WARNINGS
         type: koji_build
+        artifact: xchat-0.5-1.fc20.x86_64.log
         ...
     '''
 
@@ -316,6 +322,8 @@
         data = {}
         data['outcome'] = detail.outcome
         data['item'] = detail.item
+        if detail.artifact:
+            data['artifact'] = detail.artifact
         if detail.report_type:
             data['type'] = detail.report_type
         if detail.summary:
@@ -360,6 +368,7 @@
         y = test.yaml or {}
         item = y.get('item', None)
         report_type = y.get('type', None)
+        artifact = y.get('artifact', None)
         outcome = 'PASSED' if test.result == 'ok' else 'FAILED'
         outcome = y.get('outcome', outcome)
         summary = y.get('summary', '')
@@ -373,7 +382,7 @@
         other_keys = set(y.keys()) - set(RESERVED_KEYS)
         keyvals = dict([(k,y[k]) for k in other_keys])
 
-        cd = CheckDetail(item, report_type, outcome, summary, output, checkname=checkname)
+        cd = CheckDetail(item, report_type, outcome, summary, output, checkname=checkname, artifact=artifact)
 
         cd.keyvals = keyvals
         check_details.append(cd)
diff --git a/libtaskotron/config_defaults.py b/libtaskotron/config_defaults.py
--- a/libtaskotron/config_defaults.py
+++ b/libtaskotron/config_defaults.py
@@ -56,6 +56,7 @@
     execdb_server = 'http://127.0.0.1/execdb/'                              #:
     resultsdb_server = 'http://127.0.0.1/resultsdb/api/v1.0/'               #:
     taskotron_master = 'http://127.0.0.1/taskmaster/'                       #:
+    artifacts_baseurl = 'http://127.0.0.1/artifacts/'                       #:
     buildbot_task_step = 'runtask'                                          #:
     download_cache_enabled = True                                           #:
 
diff --git a/libtaskotron/directives/resultsdb_directive.py b/libtaskotron/directives/resultsdb_directive.py
--- a/libtaskotron/directives/resultsdb_directive.py
+++ b/libtaskotron/directives/resultsdb_directive.py
@@ -74,6 +74,8 @@
      'summary': 'RPMLINT PASSED for xchat-tcl-2.8.8-21.fc20.x86_64.rpm'}>
 """
 
+import os
+
 from libtaskotron.directives import BaseDirective
 
 from libtaskotron import check
@@ -96,6 +98,7 @@
         self.masterurl = conf.taskotron_master
         self.task_stepname = conf.buildbot_task_step
         self.execdb_server = "%s/jobs" % conf.execdb_server
+        self.artifacts_baseurl = conf.artifacts_baseurl
 
         if self.resultsdb is None:
             self.resultsdb = resultsdb_api.ResultsDBapi(conf.resultsdb_server)
@@ -155,6 +158,28 @@
         """
         return self.resultsdb.update_job(jobid, status='COMPLETED')
 
+    def get_artifact_path(self, artifactsdir, artifact):
+        """Return the relative path of :attr str artifact: inside the
+        :attr str artifactsdir:.
+        :returns: relative path to the artifact file or None, if the file
+                  does not exist, or is outside the artifactsdir.
+        """
+        artifactsdir = os.path.realpath(artifactsdir)
+        if os.path.isabs(artifact):
+            artifact_path = artifact
+        else:
+            artifact_path = os.path.join(artifactsdir, artifact)
+        artifact_path = os.path.realpath(artifact_path)
+
+        if not os.path.exists(artifact_path):
+            log.warn('Artifact %r does not exist, ignoring' % artifact_path)
+            return None
+        elif not artifact_path.startswith(artifactsdir):
+            log.warn('Artifact %r is placed outside of artifacts directory %r, ignoring' % (artifact_path, artifactsdir))
+            return None
+
+        return os.path.relpath(artifact_path, start=artifactsdir)
+
     def process(self, input_data, env_data):
         #TODO: Replace with proper location and adjust exc. text
         # we're creating the jobid in the directive for now, so adjust the check
@@ -201,14 +226,25 @@
         for detail in check_details:
             checkname = detail.checkname or env_data['checkname']
             self.ensure_testcase_exists(checkname)
-
+            result_log_url = log_url
+            if detail.artifact:
+                artifact_path = self.get_artifact_path(
+                    env_data['artifactsdir'],
+                    detail.artifact
+                    )
+                if artifact_path:
+                    result_log_url = "%s/all/%s/%s" % (
+                        self.artifacts_baseurl,
+                        env_data['uuid'],
+                        artifact_path,
+                        )
             try:
                 result = self.resultsdb.create_result(
                         job_id = job_data['id'],
                         testcase_name = checkname,
                         outcome = detail.outcome,
                         summary = detail.summary or None,
-                        log_url = log_url,
+                        log_url=result_log_url,
                         item = detail.item,
                         type = detail.report_type,
                         **detail.keyvals)
diff --git a/testing/test_check.py b/testing/test_check.py
--- a/testing/test_check.py
+++ b/testing/test_check.py
@@ -33,12 +33,13 @@
         '''Test instance creation with non-empty parameters'''
         cd = check.CheckDetail(item='foo-1.2-3.fc20', outcome='FAILED',
                                summary='untested', output=['line1', 'line2'],
-                               checkname='testcheck')
+                               checkname='testcheck', artifact='logfile.log')
         assert cd.item == 'foo-1.2-3.fc20'
         assert cd.outcome == 'FAILED'
         assert cd.summary == 'untested'
         assert cd.output == ['line1', 'line2']
         assert cd.checkname == 'testcheck'
+        assert cd.artifact == 'logfile.log'
 
     def test_init_raise(self):
         '''Test instance creation that raises an error - invalid parameters'''
@@ -194,13 +195,15 @@
 xchat.x86_64: W: no-manual-page-for-binary xchat'''
     keyvals = {"foo": "bar", "moo": 11}
     checkname = 'testcheck'
+    artifact = 'logfile.log'
 
     def setup_method(self, method):
         self.cd = check.CheckDetail(item=self.item, outcome=self.outcome,
                                     summary=self.summary,
                                     report_type=self.report_type,
                                     keyvals=self.keyvals,
-                                    checkname=self.checkname)
+                                    checkname=self.checkname,
+                                    artifact=self.artifact)
         self.cd.output.append(self.output)
 
     def _tap_to_yaml(self, rendered_tap):
@@ -373,6 +376,7 @@
 xchat.x86_64: W: no-manual-page-for-binary xchat'''
     keyvals = {"foo": "bar", "moo": 11}
     checkname = 'testcheck'
+    artifact = 'logfile.log'
 
     tap_output = """
 TAP version 13
@@ -386,6 +390,7 @@
             xchat.x86_64: W: no-manual-page-for-binary xchat
     item: xchat-0.5-1.fc20
     outcome: PASSED
+    artifact: logfile.log
     summary: 5 ERRORS, 10 WARNINGS
     type: koji_build
     foo: bar
@@ -398,7 +403,8 @@
                                     summary=self.summary,
                                     report_type=self.report_type,
                                     keyvals=self.keyvals,
-                                    checkname=self.checkname)
+                                    checkname=self.checkname,
+                                    artifact=self.artifact)
         self.cd.output.append(self.output)
 
     def test_import(self):
@@ -415,6 +421,7 @@
         assert cd.output == self.cd.output
         assert cd.keyvals == self.keyvals
         assert cd.checkname == self.checkname
+        assert cd.artifact == self.artifact
 
     def test_import_exported(self):
         tap_output = check.export_TAP(self.cd)
@@ -432,6 +439,7 @@
         assert cd.output == self.cd.output
         assert cd.keyvals == self.keyvals
         assert cd.checkname == self.checkname
+        assert cd.artifact == self.artifact
 
 
     def test_invalid_tap(self):
@@ -477,6 +485,8 @@
         assert not cd.report_type
         assert not cd.output
         assert not cd.keyvals
+        assert not cd.artifact
+
 
     def test_empty_yaml(self):
         tap_output = '''
@@ -497,3 +507,4 @@
         assert not cd.keyvals
         assert not cd.output
         assert not cd.checkname
+        assert not cd.artifact
diff --git a/testing/test_resultsdb_directive.py b/testing/test_resultsdb_directive.py
--- a/testing/test_resultsdb_directive.py
+++ b/testing/test_resultsdb_directive.py
@@ -5,6 +5,7 @@
 
 """Unit tests for libtaskotron/directives/resultsdb_directive.py"""
 
+import os
 import pytest
 from copy import deepcopy
 from dingus import Dingus, exception_raiser
@@ -43,6 +44,7 @@
                 'checkname': 'test_resultsdb_report',
                 'jobid': 'all/123',
                 'uuid': 'c25237a4-b6b3-11e4-b98a-3c970e018701',
+                'artifactsdir': '/some/directory/',
                 }
 
         self.ref_jobid = 1234
@@ -161,6 +163,69 @@
         for key in self.cd.keyvals.keys():
             assert call_data[key] == self.cd.keyvals[key]
 
+    def test_get_artifact_path(self, monkeypatch):
+        artifactsdir = '/path/to/artifacts'
+        rel_artifact = 'some/relative/file.log'
+        abs_artifact = os.path.join(artifactsdir, rel_artifact)
+
+        monkeypatch.setattr(resultsdb_directive.os.path, 'exists', lambda x: True)
+        assert self.test_rdb.get_artifact_path(artifactsdir, rel_artifact) == rel_artifact
+        assert self.test_rdb.get_artifact_path(artifactsdir, abs_artifact) == rel_artifact
+
+    def test_get_artifact_path_errors(self, monkeypatch):
+        artifactsdir = '/path/to/artifacts'
+        artifact = '/some/absolute/file.log'
+
+        # if file does not exist None is expected
+        monkeypatch.setattr(resultsdb_directive.os.path, 'exists', lambda x: False)
+        assert self.test_rdb.get_artifact_path(artifactsdir, artifact) is None
+
+        # if file exists, but is out of the artifactsdir, None is expected
+        monkeypatch.setattr(resultsdb_directive.os.path, 'exists', lambda x: True)
+        assert self.test_rdb.get_artifact_path(artifactsdir, artifact) is None
+
+    def test_report_artifact_in_log_url(self, monkeypatch):
+        """Checks whether artifact is correctly mapped to log_url"""
+        cd = check.CheckDetail(
+            item='foo_bar',
+            report_type=check.ReportType.KOJI_BUILD,
+            outcome='NEEDS_INSPECTION',
+            summary='foo_bar summary',
+            output=["foo\nbar"],
+            keyvals={"foo": "moo1", "bar": "moo2"},
+            artifact='digest/logs/logfile.log'
+            )
+        monkeypatch.setattr(self.test_rdb, 'get_artifact_path', lambda *x: 'digest/logs/logfile.log')
+
+        tap = check.export_TAP(cd)
+        ref_input = {'results': tap}
+
+        self.test_rdb.process(ref_input, self.ref_envdata)
+
+        # Given the input data, the resultsdb should be called once, and only
+        #   once, calling "create_result".
+        # This assert failing either means that more calls were added in the
+        #   source code, or that a bug is present, and "create_result" is
+        #   called multiple times.
+        # we expect rdb to be called 4 times: create job, update to RUNNING,
+        # check for testcase, report result and complete job
+
+        assert len(self.stub_rdb.calls()) == 5
+
+        # Select the first call of "create_result" method.
+        # This could be written as self.stub_rdb.calls()[0] at the moment, but
+        #   this is more future-proof, and accidental addition of resultsdb
+        #   calls is handled by the previous assert.
+        call = [call for call in self.stub_rdb.calls() if call[0] == 'create_result'][0]
+        # Select the keyword arguments of that call
+        call_data = call[2]
+
+        # the log url depends on the env_data, so construct it here
+        ref_log_url = '%s/all/%s/%s' %\
+                      (self.conf.artifacts_baseurl, self.ref_envdata['uuid'], cd.artifact)
+
+        assert call_data['log_url'] == ref_log_url
+
     def test_create_job(self):
         # make sure that the proper API calls are made to create a resultsdb job
         test_jobdata = self.test_rdb.create_resultsdb_job(self.ref_envdata['checkname'],

