Bagaimana Cara Manage Logs di Aplikasi Flask?

Bagaimana Cara Manage Logs di Aplikasi Flask?

12/13/2025 Web Development By Tech Writers
FlaskLoggingPythonWeb DevelopmentBest PracticesMonitoring

Daftar Isi

Pengenalan Logging di Flask

Logging adalah proses mencatat informasi tentang operasi aplikasi selama runtime. Di Flask, logging membantu Kamu melacak apa yang terjadi di aplikasi web Kamu, dari request HTTP sederhana hingga error yang kompleks. Dengan logging yang baik, Kamu bisa debug masalah, monitor performa, dan memahami perilaku user dengan lebih baik.

Flask menggunakan Python’s built-in logging module, yang sangat powerful dan fleksibel. Kamu bisa mengkonfigurasi logging untuk menangkap berbagai jenis informasi, mulai dari debug messages hingga critical errors.

Mengapa Logging Penting?

Logging memberikan beberapa manfaat krusial untuk development dan maintenance aplikasi Flask:

Debugging yang Efektif: Ketika aplikasi production mengalami masalah, logs adalah sumber informasi pertama yang Kamu periksa. Tanpa logging yang proper, Kamu seperti mencari jarum di tumpukan jerami.

Monitoring Performa: Logs bisa mencatat response time, database queries, dan resource usage, membantu Kamu mengidentifikasi bottleneck dan area yang perlu dioptimasi.

Security Auditing: Track aktivitas mencurigakan, login attempts, dan perubahan data untuk keamanan aplikasi.

Business Intelligence: Analisis pola user behavior, popular features, dan usage statistics dari logs.

Troubleshooting: Ketika user melaporkan masalah, logs membantu Kamu mereproduksi dan menyelesaikan issue dengan cepat.

Tanpa logging yang baik, aplikasi Flask Kamu seperti kapal tanpa radar di malam hari - Kamu tidak tahu apa yang terjadi di dalamnya.

Setup Basic Logging di Flask

Mari mulai dengan setup logging dasar di aplikasi Flask. Python’s logging module sudah built-in, jadi Kamu tidak perlu install package tambahan.

from flask import Flask
import logging

app = Flask(__name__)

# Setup basic logging
logging.basicConfig(level=logging.INFO)

@app.route('/')
def hello():
    app.logger.info('Hello endpoint accessed')
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

Dengan kode di atas, Flask akan mencatat semua log level INFO ke atas ke console. Kamu akan melihat output seperti:

INFO:werkzeug:127.0.0.1 - - [05/Feb/2026 10:00:00] "GET / HTTP/1.1" 200 -
INFO:__main__:Hello endpoint accessed

Baris pertama dari Werkzeug (WSGI utility Flask), baris kedua dari logger aplikasi Kamu.

Level Logging

Python’s logging memiliki beberapa level yang berbeda, masing-masing dengan tujuan spesifik:

  • DEBUG: Informasi detail untuk debugging (level 10)
  • INFO: Informasi umum tentang operasi normal (level 20)
  • WARNING: Indikasi masalah potensial (level 30)
  • ERROR: Error yang tidak menghentikan aplikasi (level 40)
  • CRITICAL: Error serius yang mungkin menghentikan aplikasi (level 50)
@app.route('/user/<int:user_id>')
def get_user(user_id):
    app.logger.debug(f'Fetching user with ID: {user_id}')
    
    # Simulate database operation
    user = {'id': user_id, 'name': 'John Doe'}
    
    app.logger.info(f'User {user_id} retrieved successfully')
    return user

@app.route('/divide/<int:a>/<int:b>')
def divide(a, b):
    try:
        result = a / b
        app.logger.info(f'Division result: {a}/{b} = {result}')
        return str(result)
    except ZeroDivisionError:
        app.logger.error(f'Division by zero attempted: {a}/{b}')
        return 'Error: Division by zero', 400

Gunakan level yang tepat untuk setiap situasi. Terlalu banyak DEBUG di production bisa membuat logs membengkak dan sulit dibaca.

Format Logging

Format logging menentukan bagaimana pesan log ditampilkan. Kamu bisa customize format untuk menyertakan timestamp, level, module name, dan informasi lainnya.

import logging

# Custom format
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

# Setup handler dengan format
handler = logging.StreamHandler()
handler.setFormatter(formatter)

# Setup logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.addHandler(handler)

# Di Flask app
app.logger.addHandler(handler)

Format yang lebih advanced:

formatter = logging.Formatter(
    '%(asctime)s [%(levelname)s] %(name)s:%(lineno)d - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)

Ini akan menghasilkan output seperti:

2025-12-13 10:30:15 [INFO] app:45 - User login successful

Channel dan Handlers

Channel atau handlers menentukan dimana logs dikirim. Python logging mendukung berbagai handlers:

Console Handler (StreamHandler)

Default handler yang output ke console/terminal:

import sys
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG)
app.logger.addHandler(console_handler)

File Handler

Menyimpan logs ke file:

file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.WARNING)
file_handler.setFormatter(formatter)
app.logger.addHandler(file_handler)

Rotating File Handler

Otomatis rotate file ketika ukuran tertentu tercapai:

from logging.handlers import RotatingFileHandler

rotating_handler = RotatingFileHandler(
    'app.log', 
    maxBytes=1024*1024,  # 1MB
    backupCount=5
)
app.logger.addHandler(rotating_handler)

Timed Rotating File Handler

Rotate berdasarkan waktu (daily, weekly, dll):

from logging.handlers import TimedRotatingFileHandler

time_handler = TimedRotatingFileHandler(
    'app.log',
    when='midnight',  # Rotate setiap tengah malam
    interval=1,
    backupCount=30
)
app.logger.addHandler(time_handler)

Database Handler (Custom)

Untuk menyimpan logs ke database:

import sqlite3

class DatabaseHandler(logging.Handler):
    def emit(self, record):
        conn = sqlite3.connect('logs.db')
        cursor = conn.cursor()
        cursor.execute(
            'INSERT INTO logs (level, message, timestamp) VALUES (?, ?, ?)',
            (record.levelname, record.getMessage(), record.created)
        )
        conn.commit()
        conn.close()

db_handler = DatabaseHandler()
app.logger.addHandler(db_handler)

Email Handler (SMTPHandler)

Kirim log error via email:

import logging.handlers

email_handler = logging.handlers.SMTPHandler(
    mailhost=('smtp.gmail.com', 587),
    fromaddr='[email protected]',
    toaddrs=['[email protected]'],
    subject='Application Error',
    credentials=('username', 'password'),
    secure=()
)
email_handler.setLevel(logging.ERROR)
app.logger.addHandler(email_handler)

Tips untuk Manage Logs

1. Struktur Log Messages

Buat log messages yang konsisten dan informatif:

# Buruk
app.logger.info('User login')

# Baik
app.logger.info(f'User {user_id} logged in from IP {request.remote_addr}')

2. Context Information

Sertakan context yang relevan:

@app.before_request
def log_request_info():
    app.logger.info(f'Request: {request.method} {request.url} - User Agent: {request.headers.get("User-Agent")}')

@app.after_request
def log_response_info(response):
    app.logger.info(f'Response: {response.status_code} - Size: {len(response.get_data())} bytes')
    return response

3. Log Rotation

Implementasikan log rotation untuk mencegah file log membengkak:

from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler(
    'app.log',
    maxBytes=10*1024*1024,  # 10MB
    backupCount=10
)

4. Different Log Levels untuk Different Environments

import os

if os.environ.get('FLASK_ENV') == 'development':
    app.logger.setLevel(logging.DEBUG)
else:
    app.logger.setLevel(logging.WARNING)

5. Structured Logging

Gunakan structured logging untuk logs yang mudah di-parse:

import json

class StructuredFormatter(logging.Formatter):
    def format(self, record):
        log_entry = {
            'timestamp': self.formatTime(record),
            'level': record.levelname,
            'message': record.getMessage(),
            'module': record.module,
            'function': record.funcName,
            'line': record.lineno
        }
        return json.dumps(log_entry)

# Setup structured logging
structured_handler = logging.FileHandler('structured.log')
structured_handler.setFormatter(StructuredFormatter())
app.logger.addHandler(structured_handler)

Alternatif Library

Selain built-in logging Python, ada beberapa library alternatif yang bisa meningkatkan kemampuan logging Kamu:

Rich

Library untuk terminal output yang cantik dengan colors dan formatting:

from rich.logging import RichHandler
import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(message)s",
    handlers=[RichHandler(rich_tracebacks=True)]
)

app.logger.info("This will be displayed with colors!")

Rich memberikan syntax highlighting, progress bars, dan table formatting untuk logs.

Loguru

Simplified logging library dengan API yang lebih user-friendly:

from loguru import logger

# Ganti default logger
logger.remove()
logger.add("app.log", rotation="1 day", retention="30 days")
logger.add(lambda msg: print(msg, end=""), colorize=True)

# Di Flask
@app.route('/')
def index():
    logger.info("Home page accessed")
    return "Hello"

Loguru menyediakan automatic rotation, compression, dan filtering yang powerful.

Sentry

Platform monitoring untuk error tracking dan performance monitoring:

import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration

sentry_sdk.init(
    dsn="your_sentry_dsn",
    integrations=[FlaskIntegration()],
    traces_sample_rate=1.0
)

# Sekarang semua error otomatis dikirim ke Sentry
@app.route('/error')
def error():
    1/0  # This will be captured by Sentry

Sentry memberikan dashboard untuk monitoring errors, performance issues, dan user feedback.

ELK Stack (Elasticsearch, Logstash, Kibana)

Untuk large-scale logging dan analytics:

import logging
from pythonjsonlogger import jsonlogger

# Setup JSON logging untuk Logstash
handler = logging.StreamHandler()
formatter = jsonlogger.JsonFormatter(
    '%(asctime)s %(name)s %(levelname)s %(message)s'
)
handler.setFormatter(formatter)
app.logger.addHandler(handler)

ELK stack memungkinkan centralized logging, search, dan visualization.

Graylog

Alternative open-source untuk log management:

import logging
from graypy import GELFUDPHandler

handler = GELFUDPHandler('localhost', 12201)
app.logger.addHandler(handler)

Graylog menyediakan interface web untuk search dan analyze logs.

Best Practices

Praktik Terbaik untuk Logging di Flask:

  1. Jangan Log Sensitive Information: Hindari logging password, API keys, atau PII (Personally Identifiable Information).

  2. Gunakan Appropriate Log Levels: DEBUG untuk development, INFO untuk operasi normal, WARNING untuk issues potensial, ERROR untuk failures.

  3. Consistent Formatting: Gunakan format yang konsisten across aplikasi.

  4. Log Rotation: Implementasikan rotation untuk mencegah disk space issues.

  5. Structured Logging: Gunakan JSON format untuk logs yang akan di-process oleh tools lain.

  6. Performance Consideration: Logging bisa slow down aplikasi jika terlalu verbose. Gunakan async logging jika perlu.

  7. Centralized Logging: Untuk multiple instances, gunakan centralized log aggregation.

  8. Monitoring Alerts: Setup alerts untuk critical errors atau unusual patterns.

  9. Log Retention Policy: Tentukan berapa lama logs disimpan berdasarkan compliance dan storage constraints.

  10. Testing Logging: Pastikan logging configuration tested di semua environments.

Troubleshooting

Logs Tidak Muncul

Problem: Log messages tidak tampil.

Solusi:

  • Check log level: Pastikan level handler >= level logger
  • Verify handler attached: print(app.logger.handlers)
  • Check format: Pastikan formatter tidak corrupt

File Permission Issues

Problem: Tidak bisa write ke log file.

Solusi:

  • Check file permissions: chmod 644 app.log
  • Verify directory permissions
  • Use absolute path jika relative path bermasalah

Performance Issues

Problem: Logging memperlambat aplikasi.

Solusi:

  • Reduce log verbosity di production
  • Use async logging: logging.handlers.QueueHandler
  • Buffer logs: logging.handlers.BufferingHandler

Log Rotation Tidak Bekerja

Problem: Log files tidak di-rotate.

Solusi:

  • Check file size vs maxBytes
  • Verify backupCount setting
  • Check disk space

FAQ

Q: Apakah logging mempengaruhi performance aplikasi? A: Ya, tapi impact bisa diminimalisir dengan konfigurasi yang tepat. Gunakan level yang sesuai dan hindari logging di hot paths.

Q: Berapa lama logs harus disimpan? A: Tergantung kebutuhan bisnis dan regulasi. Biasanya 30-90 hari untuk operational logs, lebih lama untuk audit logs.

Q: Bisakah logging ke multiple destinations sekaligus? A: Ya, Kamu bisa attach multiple handlers ke satu logger.

Q: Apa bedanya logging dan print statements? A: Logging lebih powerful dengan levels, formatting, dan handlers. Print statements hanya output ke stdout.

Q: Bagaimana cara test logging configuration? A: Buat unit tests yang check apakah log messages di-generate dengan benar pada berbagai scenarios.

Resources

Artikel Terkait:


Sudah implement logging di Flask app Kamu? Share tips dan tricks Kamu di comment! 💬