diff --git a/jwql/website/apps/jwql/templates/base.html b/jwql/website/apps/jwql/templates/base.html
index eb1f569d2..e444fc446 100644
--- a/jwql/website/apps/jwql/templates/base.html
+++ b/jwql/website/apps/jwql/templates/base.html
@@ -84,6 +84,10 @@
API(current)
+
+
+
+ View Logs(current)
diff --git a/jwql/website/apps/jwql/templates/log_view.html b/jwql/website/apps/jwql/templates/log_view.html
new file mode 100644
index 000000000..7418cb2a7
--- /dev/null
+++ b/jwql/website/apps/jwql/templates/log_view.html
@@ -0,0 +1,73 @@
+{% extends "base.html" %}
+
+{% block preamble %}
+
+ Monitor Log Viewer - JWQL
+
+{% endblock %}
+
+{% block content %}
+
+
+ Explore JWQL monitoring logs through the web browser.
+
+
+ This page allows users to load monitoring logs into the web browsers. This feature
+ obtains logs from all JWQL servers (ops, dev, and test).
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/jwql/website/apps/jwql/urls.py b/jwql/website/apps/jwql/urls.py
index 55296914e..247f718d8 100644
--- a/jwql/website/apps/jwql/urls.py
+++ b/jwql/website/apps/jwql/urls.py
@@ -79,6 +79,7 @@
path('edb/', views.engineering_database, name='edb'),
path('jwqldb/', views.jwqldb_table_viewer, name='jwqldb'),
path('jwqldb/', views.jwqldb_table_viewer, name='jwqldb_table_viewer'),
+ path('log_view/', views.log_view, name='log_view'),
path('query_submit/', views.query_submit, name='query_submit'),
re_path(r'^(?P({}))/$'.format(instruments), views.instrument, name='instrument'),
re_path(r'^(?P({}))/archive/$'.format(instruments), views.archived_proposals, name='archive'),
diff --git a/jwql/website/apps/jwql/views.py b/jwql/website/apps/jwql/views.py
index 637f00a39..268c3b3ba 100644
--- a/jwql/website/apps/jwql/views.py
+++ b/jwql/website/apps/jwql/views.py
@@ -44,6 +44,7 @@
from collections import defaultdict
from copy import deepcopy
import csv
+import glob
import logging
import os
import operator
@@ -53,6 +54,7 @@
from django.http import HttpResponse, JsonResponse
from django.shortcuts import redirect, render
import numpy as np
+import socket
from jwql.database.database_interface import load_connection
from jwql.utils import anomaly_query_config, monitor_utils
@@ -746,6 +748,50 @@ def jwqldb_table_viewer(request, tablename_param=None):
return render(request, template, context)
+def log_view(request):
+ """Access JWQL monitoring logs from the web app.
+
+ Parameters
+ ----------
+ request : HttpRequest object
+ Incoming request from the webpage
+
+ Returns
+ -------
+ HttpResponse object
+ Outgoing response sent to the webpage
+ """
+
+ template = 'log_view.html'
+ log_path = get_config()['log_dir']
+ log_name = request.POST.get('log_submit', None)
+
+ hostname = socket.gethostname()
+
+ if 'dljwql' in hostname:
+ server = 'dev'
+ elif 'tljwql' in hostname:
+ server = 'test'
+ else:
+ server = 'ops'
+
+ full_log_paths = sorted(glob.glob(os.path.join(log_path, server, '*', '*')), reverse=True)
+ full_log_paths = [log for log in full_log_paths if not os.path.basename(log).startswith('.')]
+ log_dictionary = {os.path.basename(path): path for path in full_log_paths}
+
+ if log_name:
+ with open(log_dictionary[log_name]) as f:
+ log_text = f.read()
+ else:
+ log_text = None
+
+ context = {'inst': '',
+ 'all_logs': log_dictionary,
+ 'log_text': log_text,
+ 'log_name': log_name}
+
+ return render(request, template, context)
+
def not_found(request, *kwargs):
"""Generate a ``not_found`` page