From b68e48b1cfe44dd35ae05f0d9286fbf7fa032de7 Mon Sep 17 00:00:00 2001 From: William Peebles Date: Tue, 21 Mar 2023 19:17:35 -0400 Subject: [PATCH 1/2] create logging service --- app/log.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/log.py diff --git a/app/log.py b/app/log.py new file mode 100644 index 0000000..e69de29 -- 2.49.1 From c21cb0354608014e7f7429cc727f4fcf93c45cb1 Mon Sep 17 00:00:00 2001 From: William Peebles Date: Tue, 21 Mar 2023 19:18:08 -0400 Subject: [PATCH 2/2] add logging to apps --- app/app.py | 31 +++++++++++++++++++++++++++---- app/create_events.py | 5 ++++- app/log.py | 12 ++++++++++++ 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/app/app.py b/app/app.py index 79351ef..7c459b9 100644 --- a/app/app.py +++ b/app/app.py @@ -7,6 +7,10 @@ from misc import datetime, date, time, currDay, prevDay, ZoneInfo, currVersion, from db import (db, Period, Task, Event, User) from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm) from create_events import createEvents +from log import appLogger + +# init logger +logger = appLogger('app') basedir = os.path.abspath(os.path.dirname(__file__)) @@ -25,10 +29,6 @@ db.init_app(app) migrate = Migrate() migrate.init_app(app, db) -# Schedule creation of events every hour -#with app.app_context(): -# scheduleCreateEvents(app, db, currDay, Period, Event, createEvents) - # Authentication stuff login_manager = LoginManager() @@ -78,6 +78,7 @@ def index(): # Authentication routes @app.route('/login', methods=['GET', 'POST']) def login(): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) form = LoginForm() if form.validate_on_submit(): userName = form.userName.data @@ -87,13 +88,16 @@ def login(): user = User.query.filter_by(userName=userName).first() if not user or not check_password_hash(user.password, password): flash('Credentials incorrect! Please try again') + logger.info(f'User \'{userName}\' logon FAILED (bad password) from {sourceIP}') return redirect(url_for('login')) login_user(user, remember=remember) + logger.info(f'User \'{userName}\' logged in successfully from {sourceIP}') return redirect(url_for('events')) return render_template('login.html', form=form) @app.route('/createaccount', methods=['GET', 'POST']) def createAccount(): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) if signup_enabled == True: form = SignupForm() if form.validate_on_submit(): @@ -105,6 +109,7 @@ def createAccount(): password=generate_password_hash(form.password.data, method='sha256')) db.session.add(new_user) db.session.commit() + logger.info(f'New user \'{new_user.userName}\' created from {sourceIP}') return redirect(url_for('login')) return render_template('createAccount.html', form=form) @@ -113,12 +118,15 @@ def createAccount(): @app.route('/logout') @login_required def logout(): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) + logger.info(f'User \'{current_user.userName}\' logged out from {sourceIP} ') logout_user() return redirect(url_for('index')) @app.route('/settings', methods=('GET', 'POST')) @login_required def settings(): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) user = User.query.get_or_404(current_user.id) form = SettingsForm(obj=user) if form.validate_on_submit(): @@ -127,6 +135,7 @@ def settings(): if form.password.data != '': user.password = generate_password_hash(form.password.data, method='sha256') db.session.commit() + logger.info(f'User \'{current_user.userName}\' settings changed from {sourceIP}') return render_template('settings.html', form=form) # Periods routes @@ -139,6 +148,7 @@ def periods(): @app.route('/period/new', methods=('GET', 'POST')) @login_required def newPeriod(): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) form = PeriodForm() if form.validate_on_submit(): period = Period(periodTime=form.periodTime.data, @@ -146,6 +156,7 @@ def newPeriod(): ) db.session.add(period) db.session.commit() + logger.info(f'New period added by \'{current_user.userName}\' from {sourceIP}') # Run createEvents upon adding new period createEvents(db, currDay, Period, Event) return redirect(f'/period/edit/{period.period}') @@ -155,21 +166,25 @@ def newPeriod(): @app.route('/period/edit/', methods=('GET', 'POST')) @login_required def editPeriod(periodNum): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) period = Period.query.get_or_404(periodNum) form = PeriodForm(obj=period) if form.validate_on_submit(): period.periodTime = form.periodTime.data period.weekendSchedule = form.weekendSchedule.data db.session.commit() + logger.info(f'Period {periodNum} edited by \'{current_user.userName}\' from {sourceIP}') return redirect(f'/period/edit/{periodNum}') return render_template('editPeriod.html', period=period, form=form, datetime=datetime) @app.post('/period/delete/') @login_required def delete_period(periodNum): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) period = Period.query.get_or_404(periodNum) db.session.delete(period) db.session.commit() + logger.info(f'Period {periodNum} deleted by \'{current_user.userName}\' from {sourceIP}') return redirect('/periods') @@ -185,6 +200,7 @@ def events(): @app.route('/event/edit//', methods=('GET', 'POST')) @login_required def editEvent(event_id): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) event = Event.query.get_or_404(event_id) form = EventForm(obj=event) if form.validate_on_submit(): @@ -193,6 +209,7 @@ def editEvent(event_id): else: event.task_id = None db.session.commit() + logger.info(f'Event {event_id} edited by \'{current_user.userName}\' from {sourceIP}') return redirect('/events') return render_template('editEvent.html', event=event, form=form, datetime=datetime) @@ -212,6 +229,7 @@ def task(task_id): @app.route('/task/new', methods=('GET', 'POST')) @login_required def newTask(): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) form = TaskForm() if form.validate_on_submit(): task = Task(title=form.title.data, @@ -219,24 +237,29 @@ def newTask(): created_timestamp=int(time.time())) db.session.add(task) db.session.commit() + logger.info(f'New task added by \'{current_user.userName}\' from {sourceIP}') return redirect(f'/task/{task.id}') return render_template('newtask.html', form=form) @app.route('/task//edit', methods=('GET', 'POST')) @login_required def editTask(task_id): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) task = Task.query.get_or_404(task_id) form = TaskForm(obj=task) if form.validate_on_submit(): task.title=form.title.data task.description=form.description.data db.session.commit() + logger.info(f'Task {task_id} edited by \'{current_user.userName}\' from {sourceIP}') return redirect(f'/task/{task_id}') return render_template('edittask.html', task=task, form=form) @app.post('/task//delete') @login_required def delete_task(task_id): + sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr) task = Task.query.get_or_404(task_id) db.session.delete(task) db.session.commit() + logger.info(f'Task {task_id} deleted by \'{current_user.userName}\' from {sourceIP}') return redirect('/tasks') \ No newline at end of file diff --git a/app/create_events.py b/app/create_events.py index 2033c0d..05b89bf 100644 --- a/app/create_events.py +++ b/app/create_events.py @@ -1,3 +1,6 @@ +from log import appLogger + +logger = appLogger('app') def createEvents(db, currDay, Period, Event): periods = Period.query.all() for period in periods: @@ -10,4 +13,4 @@ def createEvents(db, currDay, Period, Event): db.session.add(event) db.session.commit() - print("createEvents script ran successfully") \ No newline at end of file + logger.info('createEvents script ran successfully') \ No newline at end of file diff --git a/app/log.py b/app/log.py index e69de29..746749a 100644 --- a/app/log.py +++ b/app/log.py @@ -0,0 +1,12 @@ +import logging +import sys + +def appLogger(name): + formatter = logging.Formatter(fmt='%(asctime)s %(levelname)-8s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S') + screen_handler = logging.StreamHandler(stream=sys.stdout) + screen_handler.setFormatter(formatter) + logger = logging.getLogger(name) + logger.setLevel(logging.DEBUG) + logger.addHandler(screen_handler) + return logger \ No newline at end of file -- 2.49.1