# Sequelize logging

1. **<mark>Introduction</mark>**
    
    Sequelize is a popular ORM (Object-Relational Mapping) tool for Node.js, which provides an abstraction over databases like MySQL, PostgreSQL, SQLite, and MSSQL. Sequelize logging refers to the way Sequelize handles and outputs SQL queries and other database-related information during the execution of operations.
    
    **Key Aspects of Sequelize Logging -**  
    i) Default Logging Behavior  
    ii) Customizing Logging  
    iii) Logging Levels  
    iv) Benchmarking Queries  
    Sequelize logging is a powerful feature that, when used properly, can greatly assist in development and debugging. It allows you to see exactly what SQL is being executed, customize how it’s logged, and even measure the performance of your queries.
    
2. **<mark>Default Logging Behavior</mark>**  
    By default, Sequelize logs every SQL query it executes to the console. This is useful during development for debugging and understanding what queries are being generated by your Sequelize models and operations.
    
    ```javascript
    const sequelize = new Sequelize('database', 'username', 'password', {
      dialect: 'mysql',
      logging: console.log,
    });
    ```
    
3. **<mark>Customizing Logging</mark>**  
    You can customize how logging is handled. For example, you can disable logging, redirect it to a custom function, or log it to a file.
    
    ```javascript
    // To Disables logging
    const sequelize = new Sequelize('database', 'username', 'password', {
      dialect: 'mysql',
      logging: false, // Disables logging
    });
    ```
    
    ```javascript
    // To log to a custom function
    const sequelize = new Sequelize('database', 'username', 'password', {
      dialect: 'mysql',
      logging: (msg) => console.log(`Sequelize Log: ${msg}`),
    });
    ```
    
    ```javascript
    // You can also log queries to a file
    const fs = require('fs');
    const sequelize = new Sequelize('database', 'username', 'password', {
      dialect: 'mysql',
      logging: (msg) => fs.appendFileSync('sequelize.log', `${msg}\n`),
    });
    ```
    
4. **<mark>Logging Levels</mark>**
    
    Sequelize doesn’t provide different logging levels like `debug`, `info`, `warn`, `error` natively. However, you can implement your own logic to filter and log messages differently based on their content.
    
5. **<mark>Benchmarking Queries</mark>**  
    Sequelize provides a `benchmark` option that, when enabled, logs the execution time for each query in addition to the SQL itself.
    
    ```javascript
    const sequelize = new Sequelize('database', 'username', 'password', {
      dialect: 'mysql',
      logging: console.log,
      benchmark: true,
    });
    ```
    
    This will output logs like,
    
    ```bash
    Executed (default): SELECT `id`, `name` FROM `users` AS `user`; Elapsed time: 4ms
    ```
    
6. **<mark>Practical Uses</mark>**
    
    i) **Debugging:** Logging helps developers understand what queries are generated by Sequelize, which can be crucial for debugging and optimizing database interactions.
    
    ii) **Performance Monitoring:** By enabling bench-marking, developers can identify slow queries and optimize them.
    
    iii) **Audit Logging:** In production environments, logging can be redirected to a file or logging service to keep track of database interactions over time.
