Skip to content

Commit

Permalink
Merge pull request #7 from blink-zero/fix_logging
Browse files Browse the repository at this point in the history
Fixed up logging in 'Logs', modularized logging setup
  • Loading branch information
blink-zero committed Jun 19, 2024
2 parents 973ccc6 + 10989db commit 44a2729
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 86 deletions.
12 changes: 1 addition & 11 deletions apps/auth/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,7 @@
from flask_login import login_user, logout_user, login_required, current_user
from apps.auth import blueprint
from apps.models import User
import json

def log_json(level, message, **kwargs):
log_entry = {
"level": level,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user": session.get('username', 'anonymous'),
"message": message,
**kwargs
}
logging.getLogger('json_logger').info(json.dumps(log_entry))
from apps.utils.logging import log_json

@blueprint.route('/', methods=['GET', 'POST'])
@blueprint.route('/login', methods=['GET', 'POST'])
Expand Down
27 changes: 1 addition & 26 deletions apps/home/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,32 +35,7 @@
import uuid

from apps.models.vm_image_model import VmImageModel

# Configure logging to use JSON format
logging.basicConfig(level=logging.INFO, format='%(message)s')
logger = logging.getLogger()

# Configure separate file handlers for JSON logs and console logs
json_handler = logging.FileHandler('logs/app_json.log')
json_handler.setLevel(logging.INFO)
json_handler.setFormatter(logging.Formatter('%(message)s'))
json_logger = logging.getLogger('json_logger')
json_logger.addHandler(json_handler)

console_handler = logging.FileHandler('logs/app.log')
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S'))
logger.addHandler(console_handler)

def log_json(level, message, **kwargs):
log_entry = {
"level": level,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user": session.get('username', 'anonymous'),
"message": message,
**kwargs
}
logging.getLogger('json_logger').info(json.dumps(log_entry))
from apps.utils.logging import log_json

def admin_required(func):
@wraps(func)
Expand Down
11 changes: 1 addition & 10 deletions apps/home/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import ansible_runner
import yaml
import json
from apps.utils.logging import log_json


def model_to_dict(instance):
Expand Down Expand Up @@ -194,16 +195,6 @@ def set_environment_variables(config):
for var_name, var_value in config.items():
os.environ[var_name.upper()] = var_value

def log_json(level, message, **kwargs):
log_entry = {
"level": level,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user": session.get('username', 'anonymous'),
"message": message,
**kwargs
}
logging.getLogger('json_logger').info(json.dumps(log_entry))

def create_yaml_file_from_designation(designation):
yaml_file_path = 'apps/plugins/ansible-deploy-vm/vars/other.yml'

Expand Down
11 changes: 1 addition & 10 deletions apps/settings/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from flask import flash, send_from_directory
from werkzeug.utils import secure_filename
import zipfile
from apps.utils.logging import log_json

def allowed_file(filename):
ALLOWED_EXTENSIONS = {'zip'}
Expand All @@ -39,16 +40,6 @@ def decorated_view(*args, **kwargs):
return func(*args, **kwargs)
return decorated_view

def log_json(level, message, **kwargs):
log_entry = {
"level": level,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user": session.get('username', 'anonymous'),
"message": message,
**kwargs
}
logging.getLogger('json_logger').info(json.dumps(log_entry))

@blueprint.route('/settings')
@login_required
@admin_required
Expand Down
28 changes: 28 additions & 0 deletions apps/utils/logging.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import json
from datetime import datetime
import logging
from flask import session

# Custom JSON encoder for logging
class CustomJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, bytes):
return obj.decode('utf-8')
return super().default(obj)

# Custom JSON log formatter
class JSONFormatter(logging.Formatter):
def format(self, record):
log_record = {
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"level": record.levelname,
"message": record.msg,
"user": getattr(record, 'user', 'anonymous'),
**getattr(record, 'extra', {})
}
return json.dumps(log_record, cls=CustomJSONEncoder)

def log_json(level, message, **kwargs):
json_logger = logging.getLogger('json_logger')
extra_info = {"extra": kwargs, "user": session.get('username', 'anonymous')}
json_logger.log(getattr(logging, level), message, extra=extra_info)
30 changes: 1 addition & 29 deletions run.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from apps.models import User, Group, DefaultVmSettingsModel, ConfigModel, NonDomainModel, DomainModel
from apps import create_app, db
from werkzeug.security import generate_password_hash
from apps.utils.logging import log_json, JSONFormatter

# Initialize directories
required_dirs = [
Expand Down Expand Up @@ -131,18 +132,6 @@ def inject_host_status():
# Set up logging
log_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# Custom JSON log formatter
class JSONFormatter(logging.Formatter):
def format(self, record):
log_record = {
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"level": record.levelname,
"message": record.getMessage(),
"user": getattr(record, 'user', 'anonymous'),
**getattr(record, 'extra', {})
}
return json.dumps(log_record)

# Handler for app.log (standard logs)
file_handler = TimedRotatingFileHandler('logs/app.log', when='midnight', interval=1, backupCount=30)
file_handler.suffix = "%Y-%m-%d_%H-%M-%S"
Expand All @@ -163,23 +152,6 @@ def format(self, record):
json_logger.setLevel(logging.INFO)
json_logger.addHandler(json_file_handler)

# Custom JSON encoder for logging
class CustomJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, bytes):
return obj.decode('utf-8')
return super().default(obj)

def log_json(level, message, **kwargs):
log_entry = {
"level": level,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user": session.get('username', 'anonymous'),
"message": message,
**kwargs
}
json_logger.info(json.dumps(log_entry, cls=CustomJSONEncoder))

# Clean up old log files
log_directory = 'logs'
log_retention_days = 30
Expand Down

0 comments on commit 44a2729

Please sign in to comment.