I want to create logs in my log file, logs can be shown on the terminal but not written on the log files. I created a package imp_calc which has templates and other files inside it, accessing it using run.py which accesses the imp_calc package’s modules. My folder structure is as follows:
impurity_calculator_app ├── files ├── templates ├── static ├── imp_calc | ├── __init__.py | ├── models.py | ├── forms.py | └── routes.py ├─ instance ├─ record.log └─ run.py
my init.py file
#__init__.py from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_bcrypt import Bcrypt from flask_login import LoginManager import logging logging.basicConfig(filename='record.log', level=logging.DEBUG) logger = logging.getLogger('imp_calc') logger.setLevel(logging.INFO) app = Flask(__name__) app.debug = True #app.config['SECRET_KEY'] = 'AntheaPharma*01' # Setting up my database app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' app.config['SECRET_KEY'] = '0b843376d6f247b8a5e38df2' #creating a sqlalchemy instance db = SQLAlchemy(app) bcrypt = Bcrypt(app) login_manager = LoginManager(app) login_manager.login_view = "login_page" login_manager.login_message_category = "info" from imp_calc import routes
My Routes Folder through which I want to throw my logs
#routes.py import logging from logging import INFO logger = logging.getLogger('imp_calc') @app.route('/') def home(): app.logger.info('Called hello_world!') return render_template('index.html')
my run.py
#run.py from imp_calc import app if __name__ == '__main__': app.run(debug=False)
Advertisement
Answer
You are using app.logger
inside route. But basicConfig does basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger.
You can use dictConfig to configure loggers / handlers / formatters. Here is an example:
from flask import Flask import logging dictConfig({ 'version': 1, 'loggers': { # root logger '': { 'level': 'INFO', 'handlers': ['console_handler'], }, 'imp_calc': { 'level': 'INFO', 'handlers': ['console_handler'], 'propagate': False, }, # this logger will write logs into file 'debug': { 'level': 'INFO', 'handlers': ['console_handler', 'file_handler'], 'propagate': False, }, }, 'handlers': { 'console_handler': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'stream': 'ext://sys.stdout', 'formatter': 'simple' }, 'file_handler': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', 'filename': 'debug.log', 'maxBytes': 1024, 'backupCount': 3, 'formatter': 'simple', } }, 'formatters': { 'simple': { 'format': '%(pathname)s:%(lineno)d %(name)s %(asctime)s - %(levelname)s - %(message)s', }, }, }) app = Flask(__name__) @app.route('/') def home(): logging.getLogger().info('log from root logger') logging.getLogger('imp_calc').info('log from imp_calc logger') app.logger.info('log from app logger') return 'ok' if __name__ == '__main__': app.run(debug=True, host='localhost')
Open http://localhost:5000/
. You’ll see stdout logs:
../debug.py:87 root 2022-10-17 15:31:09,242 - INFO - log from root logger ../debug.py:88 imp_calc 2022-10-17 15:31:09,243 - INFO - log from imp_calc logger ../debug.py:89 debug 2022-10-17 15:31:09,243 - INFO - log from app logger
Let’s check file logs(cat debug.log
):
../debug.py:89 debug 2022-10-17 15:31:09,243 - INFO - log from app logger
So just use dictConfig
.