add logging to apps

This commit is contained in:
2023-03-21 19:18:08 -04:00
parent b68e48b1cf
commit c21cb03546
3 changed files with 43 additions and 5 deletions

View File

@@ -7,6 +7,10 @@ from misc import datetime, date, time, currDay, prevDay, ZoneInfo, currVersion,
from db import (db, Period, Task, Event, User) from db import (db, Period, Task, Event, User)
from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm) from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm)
from create_events import createEvents from create_events import createEvents
from log import appLogger
# init logger
logger = appLogger('app')
basedir = os.path.abspath(os.path.dirname(__file__)) basedir = os.path.abspath(os.path.dirname(__file__))
@@ -25,10 +29,6 @@ db.init_app(app)
migrate = Migrate() migrate = Migrate()
migrate.init_app(app, db) migrate.init_app(app, db)
# Schedule creation of events every hour
#with app.app_context():
# scheduleCreateEvents(app, db, currDay, Period, Event, createEvents)
# Authentication stuff # Authentication stuff
login_manager = LoginManager() login_manager = LoginManager()
@@ -78,6 +78,7 @@ def index():
# Authentication routes # Authentication routes
@app.route('/login', methods=['GET', 'POST']) @app.route('/login', methods=['GET', 'POST'])
def login(): def login():
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
form = LoginForm() form = LoginForm()
if form.validate_on_submit(): if form.validate_on_submit():
userName = form.userName.data userName = form.userName.data
@@ -87,13 +88,16 @@ def login():
user = User.query.filter_by(userName=userName).first() user = User.query.filter_by(userName=userName).first()
if not user or not check_password_hash(user.password, password): if not user or not check_password_hash(user.password, password):
flash('Credentials incorrect! Please try again') flash('Credentials incorrect! Please try again')
logger.info(f'User \'{userName}\' logon FAILED (bad password) from {sourceIP}')
return redirect(url_for('login')) return redirect(url_for('login'))
login_user(user, remember=remember) login_user(user, remember=remember)
logger.info(f'User \'{userName}\' logged in successfully from {sourceIP}')
return redirect(url_for('events')) return redirect(url_for('events'))
return render_template('login.html', form=form) return render_template('login.html', form=form)
@app.route('/createaccount', methods=['GET', 'POST']) @app.route('/createaccount', methods=['GET', 'POST'])
def createAccount(): def createAccount():
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
if signup_enabled == True: if signup_enabled == True:
form = SignupForm() form = SignupForm()
if form.validate_on_submit(): if form.validate_on_submit():
@@ -105,6 +109,7 @@ def createAccount():
password=generate_password_hash(form.password.data, method='sha256')) password=generate_password_hash(form.password.data, method='sha256'))
db.session.add(new_user) db.session.add(new_user)
db.session.commit() db.session.commit()
logger.info(f'New user \'{new_user.userName}\' created from {sourceIP}')
return redirect(url_for('login')) return redirect(url_for('login'))
return render_template('createAccount.html', form=form) return render_template('createAccount.html', form=form)
@@ -113,12 +118,15 @@ def createAccount():
@app.route('/logout') @app.route('/logout')
@login_required @login_required
def logout(): 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() logout_user()
return redirect(url_for('index')) return redirect(url_for('index'))
@app.route('/settings', methods=('GET', 'POST')) @app.route('/settings', methods=('GET', 'POST'))
@login_required @login_required
def settings(): def settings():
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
user = User.query.get_or_404(current_user.id) user = User.query.get_or_404(current_user.id)
form = SettingsForm(obj=user) form = SettingsForm(obj=user)
if form.validate_on_submit(): if form.validate_on_submit():
@@ -127,6 +135,7 @@ def settings():
if form.password.data != '': if form.password.data != '':
user.password = generate_password_hash(form.password.data, method='sha256') user.password = generate_password_hash(form.password.data, method='sha256')
db.session.commit() db.session.commit()
logger.info(f'User \'{current_user.userName}\' settings changed from {sourceIP}')
return render_template('settings.html', form=form) return render_template('settings.html', form=form)
# Periods routes # Periods routes
@@ -139,6 +148,7 @@ def periods():
@app.route('/period/new', methods=('GET', 'POST')) @app.route('/period/new', methods=('GET', 'POST'))
@login_required @login_required
def newPeriod(): def newPeriod():
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
form = PeriodForm() form = PeriodForm()
if form.validate_on_submit(): if form.validate_on_submit():
period = Period(periodTime=form.periodTime.data, period = Period(periodTime=form.periodTime.data,
@@ -146,6 +156,7 @@ def newPeriod():
) )
db.session.add(period) db.session.add(period)
db.session.commit() db.session.commit()
logger.info(f'New period added by \'{current_user.userName}\' from {sourceIP}')
# Run createEvents upon adding new period # Run createEvents upon adding new period
createEvents(db, currDay, Period, Event) createEvents(db, currDay, Period, Event)
return redirect(f'/period/edit/{period.period}') return redirect(f'/period/edit/{period.period}')
@@ -155,21 +166,25 @@ def newPeriod():
@app.route('/period/edit/<int:periodNum>', methods=('GET', 'POST')) @app.route('/period/edit/<int:periodNum>', methods=('GET', 'POST'))
@login_required @login_required
def editPeriod(periodNum): def editPeriod(periodNum):
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
period = Period.query.get_or_404(periodNum) period = Period.query.get_or_404(periodNum)
form = PeriodForm(obj=period) form = PeriodForm(obj=period)
if form.validate_on_submit(): if form.validate_on_submit():
period.periodTime = form.periodTime.data period.periodTime = form.periodTime.data
period.weekendSchedule = form.weekendSchedule.data period.weekendSchedule = form.weekendSchedule.data
db.session.commit() db.session.commit()
logger.info(f'Period {periodNum} edited by \'{current_user.userName}\' from {sourceIP}')
return redirect(f'/period/edit/{periodNum}') return redirect(f'/period/edit/{periodNum}')
return render_template('editPeriod.html', period=period, form=form, datetime=datetime) return render_template('editPeriod.html', period=period, form=form, datetime=datetime)
@app.post('/period/delete/<int:periodNum>') @app.post('/period/delete/<int:periodNum>')
@login_required @login_required
def delete_period(periodNum): def delete_period(periodNum):
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
period = Period.query.get_or_404(periodNum) period = Period.query.get_or_404(periodNum)
db.session.delete(period) db.session.delete(period)
db.session.commit() db.session.commit()
logger.info(f'Period {periodNum} deleted by \'{current_user.userName}\' from {sourceIP}')
return redirect('/periods') return redirect('/periods')
@@ -185,6 +200,7 @@ def events():
@app.route('/event/edit/<int:event_id>/', methods=('GET', 'POST')) @app.route('/event/edit/<int:event_id>/', methods=('GET', 'POST'))
@login_required @login_required
def editEvent(event_id): def editEvent(event_id):
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
event = Event.query.get_or_404(event_id) event = Event.query.get_or_404(event_id)
form = EventForm(obj=event) form = EventForm(obj=event)
if form.validate_on_submit(): if form.validate_on_submit():
@@ -193,6 +209,7 @@ def editEvent(event_id):
else: else:
event.task_id = None event.task_id = None
db.session.commit() db.session.commit()
logger.info(f'Event {event_id} edited by \'{current_user.userName}\' from {sourceIP}')
return redirect('/events') return redirect('/events')
return render_template('editEvent.html', event=event, form=form, datetime=datetime) 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')) @app.route('/task/new', methods=('GET', 'POST'))
@login_required @login_required
def newTask(): def newTask():
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
form = TaskForm() form = TaskForm()
if form.validate_on_submit(): if form.validate_on_submit():
task = Task(title=form.title.data, task = Task(title=form.title.data,
@@ -219,24 +237,29 @@ def newTask():
created_timestamp=int(time.time())) created_timestamp=int(time.time()))
db.session.add(task) db.session.add(task)
db.session.commit() db.session.commit()
logger.info(f'New task added by \'{current_user.userName}\' from {sourceIP}')
return redirect(f'/task/{task.id}') return redirect(f'/task/{task.id}')
return render_template('newtask.html', form=form) return render_template('newtask.html', form=form)
@app.route('/task/<int:task_id>/edit', methods=('GET', 'POST')) @app.route('/task/<int:task_id>/edit', methods=('GET', 'POST'))
@login_required @login_required
def editTask(task_id): def editTask(task_id):
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
task = Task.query.get_or_404(task_id) task = Task.query.get_or_404(task_id)
form = TaskForm(obj=task) form = TaskForm(obj=task)
if form.validate_on_submit(): if form.validate_on_submit():
task.title=form.title.data task.title=form.title.data
task.description=form.description.data task.description=form.description.data
db.session.commit() db.session.commit()
logger.info(f'Task {task_id} edited by \'{current_user.userName}\' from {sourceIP}')
return redirect(f'/task/{task_id}') return redirect(f'/task/{task_id}')
return render_template('edittask.html', task=task, form=form) return render_template('edittask.html', task=task, form=form)
@app.post('/task/<int:task_id>/delete') @app.post('/task/<int:task_id>/delete')
@login_required @login_required
def delete_task(task_id): def delete_task(task_id):
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
task = Task.query.get_or_404(task_id) task = Task.query.get_or_404(task_id)
db.session.delete(task) db.session.delete(task)
db.session.commit() db.session.commit()
logger.info(f'Task {task_id} deleted by \'{current_user.userName}\' from {sourceIP}')
return redirect('/tasks') return redirect('/tasks')

View File

@@ -1,3 +1,6 @@
from log import appLogger
logger = appLogger('app')
def createEvents(db, currDay, Period, Event): def createEvents(db, currDay, Period, Event):
periods = Period.query.all() periods = Period.query.all()
for period in periods: for period in periods:
@@ -10,4 +13,4 @@ def createEvents(db, currDay, Period, Event):
db.session.add(event) db.session.add(event)
db.session.commit() db.session.commit()
print("createEvents script ran successfully") logger.info('createEvents script ran successfully')

View File

@@ -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