A logging package for tracing function calls with error handling and email notification
Project description
TrackingLog
TrackingLog is a comprehensive Python logging package designed for tracing function calls with advanced features including error handling, profiling, task management, and email notifications. It provides decorators and managers for comprehensive application monitoring and debugging.
🚀 Features
- Function & Class Logging: Decorators for automatic entry/exit logging
- Profiling Integration: Line-level and function-level performance profiling
- Task Management: Structured task lifecycle management with resume capabilities
- Error Handling: Comprehensive error tracking and logging
- Email Notifications: Built-in email notification system
- Print Capture: Redirect print statements to log files
- Resource Monitoring: CPU and memory usage tracking
- Cache Management: Automatic log cleanup and rotation
- Flexible Configuration: Centralized configuration management
📦 Installation
pip install trackinglog
Dependencies
numpy>=2.0.1pandas>=2.2.2line_profiler>=4.1.3
🔧 Quick Start
Basic Setup
import trackinglog
# Basic setup with default configuration
trackinglog.logger.setup()
@trackinglog.logger.get_log('my_logger')
def my_function(log=None):
log.info("This function does something important.")
return "Function completed"
result = my_function()
Custom Task Setup
import trackinglog
# Custom setup with specific task name and path
trackinglog.logger.setup(
task_name="My_Project",
root_folder_path='./my_logs'
)
@trackinglog.logger.get_log('custom_logger', verbose=1, enable_profiling="function")
def compute_data(x, y, log=None):
log.info(f"Computing {x} + {y}")
result = x + y
log.info(f"Result: {result}")
return result
result = compute_data(5, 3)
📚 Usage Examples
Function Decorator
import trackinglog
trackinglog.logger.setup(task_name="FunctionExample")
# Basic function logging
@trackinglog.logger.get_log('function_logger', verbose=1)
def process_data(data, log=None):
log.info(f"Processing {len(data)} items")
processed = [x * 2 for x in data]
log.info("Processing completed")
return processed
# Function with line-level profiling
@trackinglog.logger.get_log('profiled_func', verbose=1, enable_profiling="line")
def intensive_computation(n, log=None):
log.info(f"Starting computation for {n} iterations")
result = sum(i**2 for i in range(n))
log.info(f"Computation result: {result}")
return result
result = process_data([1, 2, 3, 4, 5])
profiled_result = intensive_computation(1000)
Class Decorator
import trackinglog
trackinglog.logger.setup(task_name="ClassExample")
@trackinglog.logger.get_log('class_logger', verbose=1, print2log=True)
class DataProcessor:
def __init__(self, name):
self.name = name
self.log.info(f"DataProcessor '{name}' initialized")
def process(self, data):
self.log.info(f"Processing data with {len(data)} items")
print(f"Processing {self.name}") # This will be captured in logs
return [x * 2 for x in data]
def get_stats(self):
self.log.info("Generating statistics")
# Access folder structure
print(f"Results folder: {self.log.folder.result}")
return {"processed": True}
processor = DataProcessor("MyProcessor")
result = processor.process([1, 2, 3])
stats = processor.get_stats()
Inline Logging
import trackinglog
trackinglog.logger.setup(task_name="InlineExample")
def regular_function(x, y):
# Get logger inside function
log = trackinglog.logger.get_logger('inline_logger')
log.info(f"Function called with {x}, {y}")
result = x * y
log.info(f"Calculation result: {result}")
return result
result = regular_function(6, 7)
⚙️ Configuration
Comprehensive Setup
import trackinglog
trackinglog.logger.setup(
task_name="ComprehensiveExample",
root_folder_path='./task_logs',
task_config={
"task_num_limit": 5,
"task_expiration_date": 7, # Keep tasks for 7 days
"resume_task": False, # Create new task
"new_task": None
},
log_config={
'root_log_path': "./logs",
'_cache_log_path': "./logs/cache",
'cache_log_num_limit': 10,
'_cache_log_day_limit': 7
},
email_credential={
'username': "your_email@example.com",
'password': "your_password",
'root_emails_folder': "./logs/emails"
},
lock_config={
"lock_folder_path": "./logs/locks"
}
)
Configuration Parameters
| Parameter | Description | Default |
|---|---|---|
task_name |
Name for the current task | "Default_Task" |
root_folder_path |
Root directory for all task files | "./cache/__trackinglog__" |
task_config |
Task management settings | See below |
log_config |
Logging configuration | See below |
email_credential |
Email notification settings | None |
lock_config |
File locking configuration | None |
Task Config Options
task_config = {
"task_num_limit": 500, # Maximum number of tasks to keep
"task_expiration_date": 30, # Days to keep tasks
"task_folder_format": "%y%m%d_000001", # Task folder naming format
"resume_task": None, # None: auto, True: resume latest, False: new task
"new_task": None # None: auto, True: force new, False: resume only
}
Log Config Options
log_config = {
'root_log_path': "./logs", # Main log directory
'_cache_log_path': "./logs/cache", # Cache log directory
'cache_log_num_limit': 50, # Max cache log files
'_cache_log_day_limit': 30 # Days to keep cache logs
}
🏗️ Task Management
TrackingLog creates a structured folder hierarchy for each task:
task_folder/
├── root/ # Main task directory
├── temp/ # Temporary files
├── cache/ # Cache files
├── var/ # Variable data
├── result/ # Task results
└── __config/ # Task configuration and status
Task Status Management
import trackinglog
from datetime import datetime
trackinglog.logger.setup(task_name="StatusExample")
# Get folder configuration
folder_config = trackinglog.logger.config.task_config._folder_path_config
# Set task as in progress
progress_config = {
"step": 1,
"description": "Processing data",
"timestamp": datetime.now().isoformat()
}
folder_config.inprogress(progress_config)
# Mark as finished
finish_config = {
"step": 2,
"description": "Task completed successfully",
"result": "All operations completed",
"timestamp": datetime.now().isoformat()
}
folder_config.finish(finish_config)
# Check status
print(f"Task status: {folder_config.status}")
print(f"Task config: {folder_config.config}")
Task Resume
import trackinglog
# Create new task
trackinglog.logger.setup(
task_name="ResumeExample",
task_config={"resume_task": False} # Force new task
)
# Later, resume the latest task
trackinglog.logger.setup(
task_name="ResumeExample",
task_config={"resume_task": "LATEST"} # Resume latest task
)
🔍 Profiling
Function-Level Profiling
@trackinglog.logger.get_log('profiler', enable_profiling="function")
def compute_heavy(n, log=None):
total = 0
for i in range(n):
total += i ** 2
return total
Line-Level Profiling
@trackinglog.logger.get_log('line_profiler', enable_profiling="line")
def detailed_analysis(data, log=None):
# Each line will be profiled
processed = []
for item in data:
result = item * 2 + 1
processed.append(result)
return processed
📧 Email Notifications
import trackinglog
# Setup with email credentials
trackinglog.logger.setup(
task_name="EmailExample",
email_credential={
'username': "your_email@example.com",
'password': "your_app_password",
'root_emails_folder': "./emails"
}
)
# Email notifications will be sent for errors and task completion
🚨 Error Handling
import trackinglog
trackinglog.logger.setup(task_name="ErrorExample")
@trackinglog.logger.get_log('error_logger', verbose=1)
def risky_function(should_fail=False, log=None):
log.info("Function started")
if should_fail:
log.error("About to raise an error")
raise ValueError("This is a test error")
log.info("Function completed successfully")
return "Success"
# Successful execution
try:
result = risky_function(should_fail=False)
print(f"Result: {result}")
except Exception as e:
print(f"Error: {e}")
# Error case - will be logged automatically
try:
result = risky_function(should_fail=True)
except Exception as e:
print(f"Caught error: {e}")
# Manually mark task as failed
folder_config = trackinglog.logger.config.task_config._folder_path_config
folder_config.fail({"error": str(e), "timestamp": "2024-01-01T12:00:00"})
🎯 Multiple Loggers
import trackinglog
trackinglog.logger.setup(task_name="MultiLoggerExample")
# Create different loggers for different components
auth_logger = trackinglog.logger.get_logger('auth_system')
db_logger = trackinglog.logger.get_logger('database')
api_logger = trackinglog.logger.get_logger('api_handler')
# Use them independently
auth_logger.info("User authentication started")
db_logger.info("Database connection established")
api_logger.info("API request received")
# Or use with decorators
@trackinglog.logger.get_log('auth_decorator', verbose=1)
def authenticate_user(username, log=None):
log.info(f"Authenticating user: {username}")
return f"User {username} authenticated"
@trackinglog.logger.get_log('db_decorator', verbose=1)
def query_database(query, log=None):
log.info(f"Executing query: {query}")
return "Query results"
📖 API Reference
LogManager Methods
setup(**config): Configure the logging systemget_log(name, verbose=0, enable_profiling=None, print2log=False): Decorator for functions/classesget_logger(name): Get logger instance for inline usage
Decorator Parameters
name: Logger name (string)verbose: Logging verbosity level (0, 1, 2)enable_profiling: Profiling mode ("function", "line", or None)print2log: Capture print statements in logs (boolean)
Task Status Methods
folder_config.inprogress(config): Mark task as in progressfolder_config.finish(config): Mark task as finishedfolder_config.fail(config): Mark task as failedfolder_config.status: Get current task statusfolder_config.config: Get current task configuration
📋 Version History
- 0.1.9.1: Default task name and root folder path, usage without setup, increased task limit to 500
- 0.1.9: Optimized log logic and bug fixes
- 0.1.8.6: Enhanced resume task mechanism with True option for latest task
- 0.1.8.5: New resume task mechanism with boolean controls
- 0.1.8.4: Enhanced task status management (finish, inprogress, fail)
- 0.1.8.3: Enhanced task manager with finish tokens
- 0.1.8: Embedded task manager and optimized cache logic
- 0.1.7: Added error handling message mechanism
- 0.1.6.2: Bug fixes
- 0.1.6: Updated to Parameter config, added inline log usage
- 0.1.5: Added cache log cleaner
- 0.1.4: Formatted logging with indentation, print to log feature
- 0.1.3: Added profiler, error handling, class name logging, resource tracking
- 0.1.2: Added error handling, verbose option, function name logging
- 0.1.1: Created decorators and setup check
- 0.1.0: Package draft created
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
📄 License
This project is licensed under the MIT License.
🔗 Links
- GitHub: https://github.com/shiyi-yinghao/trackinglog
- PyPI: https://pypi.org/project/trackinglog/
- Author: Yinghao Li (shiyi.yinghao@gmail.com)
🆘 Support
If you encounter any issues or have questions, please open an issue on the GitHub repository.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file trackinglog-0.2.0.1.tar.gz.
File metadata
- Download URL: trackinglog-0.2.0.1.tar.gz
- Upload date:
- Size: 22.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07bbdac0449204b5980d95067f56e45e5215ac99bfc40ec4df603b00dc6ad21b
|
|
| MD5 |
4fdce9fdf1d7adfd4969e5fd1037f61e
|
|
| BLAKE2b-256 |
2f01471bf382227b9407a7aca393a4bb3ac4bb093ed8b0b7b41c502b7786f98a
|
File details
Details for the file trackinglog-0.2.0.1-py3-none-any.whl.
File metadata
- Download URL: trackinglog-0.2.0.1-py3-none-any.whl
- Upload date:
- Size: 25.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7dab03c0808b25d3d4aa5df138afd1dfb85a87316f01a33d37af5d38a7f8cb73
|
|
| MD5 |
c644a9e741ec1ad0ac7a339f96b834f8
|
|
| BLAKE2b-256 |
3ba4b3962f05bba9f32b5448427875d1be684c13961e3e75e1aa73e4b4a8df12
|