Created
          April 22, 2017 07:14 
        
      - 
            
      
        
      
    Star
      
          
          (115)
      
  
You must be signed in to star a gist 
- 
              
      
        
      
    Fork
      
          
          (31)
      
  
You must be signed in to fork a gist 
- 
      
- 
        Save kingspp/9451566a5555fb022215ca2b7b802f19 to your computer and use it in GitHub Desktop. 
    Python Comprehensive Logging using YAML Configuration
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | import os | |
| import yaml | |
| import logging.config | |
| import logging | |
| import coloredlogs | |
| def setup_logging(default_path='logging.yaml', default_level=logging.INFO, env_key='LOG_CFG'): | |
| """ | |
| | **@author:** Prathyush SP | |
| | Logging Setup | |
| """ | |
| path = default_path | |
| value = os.getenv(env_key, None) | |
| if value: | |
| path = value | |
| if os.path.exists(path): | |
| with open(path, 'rt') as f: | |
| try: | |
| config = yaml.safe_load(f.read()) | |
| logging.config.dictConfig(config) | |
| coloredlogs.install() | |
| except Exception as e: | |
| print(e) | |
| print('Error in Logging Configuration. Using default configs') | |
| logging.basicConfig(level=default_level) | |
| coloredlogs.install(level=default_level) | |
| else: | |
| logging.basicConfig(level=default_level) | |
| coloredlogs.install(level=default_level) | |
| print('Failed to load configuration file. Using default configs') | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | version: 1 | |
| disable_existing_loggers: true | |
| formatters: | |
| standard: | |
| format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s" | |
| error: | |
| format: "%(levelname)s <PID %(process)d:%(processName)s> %(name)s.%(funcName)s(): %(message)s" | |
| handlers: | |
| console: | |
| class: logging.StreamHandler | |
| level: DEBUG | |
| formatter: standard | |
| stream: ext://sys.stdout | |
| info_file_handler: | |
| class: logging.handlers.RotatingFileHandler | |
| level: INFO | |
| formatter: standard | |
| filename: /tmp/info.log | |
| maxBytes: 10485760 # 10MB | |
| backupCount: 20 | |
| encoding: utf8 | |
| error_file_handler: | |
| class: logging.handlers.RotatingFileHandler | |
| level: ERROR | |
| formatter: error | |
| filename: /tmp/errors.log | |
| maxBytes: 10485760 # 10MB | |
| backupCount: 20 | |
| encoding: utf8 | |
| debug_file_handler: | |
| class: logging.handlers.RotatingFileHandler | |
| level: DEBUG | |
| formatter: standard | |
| filename: /tmp/debug.log | |
| maxBytes: 10485760 # 10MB | |
| backupCount: 20 | |
| encoding: utf8 | |
| critical_file_handler: | |
| class: logging.handlers.RotatingFileHandler | |
| level: CRITICAL | |
| formatter: standard | |
| filename: /tmp/critical.log | |
| maxBytes: 10485760 # 10MB | |
| backupCount: 20 | |
| encoding: utf8 | |
| warn_file_handler: | |
| class: logging.handlers.RotatingFileHandler | |
| level: WARN | |
| formatter: standard | |
| filename: /tmp/warn.log | |
| maxBytes: 10485760 # 10MB | |
| backupCount: 20 | |
| encoding: utf8 | |
| root: | |
| level: NOTSET | |
| handlers: [console] | |
| propogate: yes | |
| loggers: | |
| <module>: | |
| level: INFO | |
| handlers: [console, info_file_handler, error_file_handler, critical_file_handler, debug_file_handler, warn_file_handler] | |
| propogate: no | |
| <module.x>: | |
| level: DEBUG | |
| handlers: [info_file_handler, error_file_handler, critical_file_handler, debug_file_handler, warn_file_handler] | |
| propogate: yes | 
version: 1
disable_existing_loggers: no
formatters:
  standard:
    format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
  error:
    format: "%(asctime)s - %(name)s - %(levelname)s <PID %(process)d:%(processName)s> %(name)s.%(funcName)s(): %(message)s"
handlers:
  info_file_handler:
    class: logging.handlers.RotatingFileHandler
    level: INFO
    formatter: standard
    filename: logs/info.log
    maxBytes: 10485760 # 10MB
    backupCount: 20
    encoding: utf8
  warn_file_handler:
    class: logging.handlers.RotatingFileHandler
    level: WARN
    formatter: standard
    filename: logs/warn.log
    maxBytes: 10485760 # 10MB
    backupCount: 20
    encoding: utf8
  error_file_handler:
    class: logging.handlers.RotatingFileHandler
    level: ERROR
    formatter: error
    filename: logs/errors.log
    maxBytes: 10485760 # 10MB
    backupCount: 20
    encoding: utf8
  critical_file_handler:
    class: logging.handlers.RotatingFileHandler
    level: CRITICAL
    formatter: standard
    filename: logs/critical.log
    maxBytes: 10485760 # 10MB
    backupCount: 20
    encoding: utf8
  debug_file_handler:
    class: logging.handlers.RotatingFileHandler
    level: DEBUG
    formatter: standard
    filename: logs/debug.log
    maxBytes: 10485760 # 10MB
    backupCount: 20
    encoding: utf8
  root_file_handler:
    class: logging.handlers.RotatingFileHandler
    level: DEBUG
    formatter: standard
    filename: logs/logs.log
    maxBytes: 10485760 # 10MB
    backupCount: 20
    encoding: utf8
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: standard
    stream: ext://sys.stdout
  error_console:
    class: logging.StreamHandler
    level: ERROR
    formatter: error
    stream: ext://sys.stderr
root:
  level: DEBUG
  handlers: [console, error_console, root_file_handler]
  propagate: yes
loggers:
  main:
    level: DEBUG
    handlers: [info_file_handler, warn_file_handler, error_file_handler, critical_file_handler, debug_file_handler]
    propagate: no
  werkzeug:
    level: DEBUG
    handlers: [info_file_handler, warn_file_handler, error_file_handler, critical_file_handler, debug_file_handler]
    propagate: yes
  api.app_server:
    level: DEBUG
    handlers: [info_file_handler, warn_file_handler, error_file_handler, critical_file_handler, debug_file_handler]
    propagate: yesCan you please give an example of how to write yaml file for aiologger?
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment
  
            
i have the same issue of "missing the DEBUG" level. I have tried many many different ways
more importantly, here is my yaml file:
so at "root" level, i should have DEBUG as starting point.
and I was trying to achieve that
for the main, module1, module1.x the logger will have different handlers. but those handlers do not seem kick in at all. in fact all that matters seems to be what i put in at "root" level. the logs are produced on console and for the Info.log file.
p.s., i have played around the propagte, disable_existing_loggers, and see no effects.
pps, i have done this logging_setup ONLY at the main level. as suggested from other stackoverflow sites; to avoid not loading the logging.config.dictConfig() multiple times at different module levels. (which is what Icmtcf has done in the previous post)