initial commit
This commit is contained in:
commit
c352531f0c
36
.gitignore
vendored
Normal file
36
.gitignore
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
*.py[cod]
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Packages
|
||||
*.egg
|
||||
*.egg-info
|
||||
dist
|
||||
build
|
||||
eggs
|
||||
parts
|
||||
bin
|
||||
var
|
||||
sdist
|
||||
develop-eggs
|
||||
.installed.cfg
|
||||
lib
|
||||
lib64
|
||||
__pycache__
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
.coverage
|
||||
.tox
|
||||
nosetests.xml
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
|
||||
# Mr Developer
|
||||
.mr.developer.cfg
|
||||
.project
|
||||
.pydevproject
|
3
MANIFEST
Normal file
3
MANIFEST
Normal file
@ -0,0 +1,3 @@
|
||||
# file GENERATED by distutils, do NOT edit
|
||||
setup.py
|
||||
sanelogging/__init__.py
|
50
README.md
Normal file
50
README.md
Normal file
@ -0,0 +1,50 @@
|
||||
# sanelogging
|
||||
|
||||
## Sane defaults for python logging
|
||||
|
||||
The python stdlib `logging` module is useful, flexible, and configurable.
|
||||
|
||||
However, the maintainers reasonably have determined that python is an
|
||||
application runtime and not an application. The default configuration
|
||||
for the `logging` is not very useful, and this results in boilerplate.
|
||||
|
||||
This is an opinionated module for the 90% case where you just want sane
|
||||
defaults. (In effect, moving the boilerplate into PyPI.)
|
||||
|
||||
# Other Stuff
|
||||
|
||||
There are some convenience methods added, such as `panic` and `die` (c.f.
|
||||
golang and perl).
|
||||
|
||||
`notice` is additionally aliased to `info`, for those who forget that python
|
||||
doesn't have a notice level (i.e. me).
|
||||
|
||||
If you set the environment variable `LOG_TO_SYSLOG`, it will print out your
|
||||
log messages on paper and mail them to you.
|
||||
|
||||
# Usage
|
||||
|
||||
```
|
||||
from sanelogging import log
|
||||
|
||||
log.info("starting up!")
|
||||
|
||||
log.error("something went wrong.")
|
||||
|
||||
log.die("bailing out") # script exits
|
||||
|
||||
```
|
||||
|
||||
Author
|
||||
======
|
||||
|
||||
Jeffrey Paul <(sneak@sneak.berlin)[mailto:sneak@sneak.berlin]>
|
||||
|
||||
(https://sneak.berlin)[https://sneak.berlin]
|
||||
|
||||
(@sneakdotberlin)[https://twitter.com/sneakdotberlin]
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
This code is released into the public domain.
|
65
sanelogging/__init__.py
Normal file
65
sanelogging/__init__.py
Normal file
@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env python
|
||||
#234567891123456789212345678931234567894123456789512345678961234567897123456789
|
||||
# encoding: utf-8
|
||||
|
||||
import colorlog
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
|
||||
# get root logger
|
||||
log = logging.getLogger()
|
||||
log.setLevel(logging.DEBUG)
|
||||
|
||||
# console handler gets all log entries
|
||||
ch = logging.StreamHandler() # defaults to sys.stderr
|
||||
|
||||
log.addHandler(ch)
|
||||
|
||||
formatstr = '%(asctime)s [%(levelname)-.4s] %(message)s'
|
||||
colorFormatter = colorlog.ColoredFormatter(
|
||||
'%(log_color)s' + formatstr
|
||||
)
|
||||
|
||||
formatter = logging.Formatter(
|
||||
formatstr
|
||||
)
|
||||
|
||||
|
||||
log.notice = log.info
|
||||
|
||||
|
||||
if sys.stdout.isatty():
|
||||
ch.setFormatter(colorFormatter)
|
||||
else:
|
||||
ch.setFormatter(formatter)
|
||||
|
||||
# log to syslog if env var is setup
|
||||
if os.environ.get('LOG_TO_SYSLOG',False):
|
||||
|
||||
# default to UDP if no socket found
|
||||
address = ('localhost', 514)
|
||||
|
||||
from logging.handlers import SysLogHandler
|
||||
|
||||
locations = [
|
||||
"/var/run/syslog", # osx
|
||||
"/dev/log", # linux
|
||||
"/var/run/log" # freebsd
|
||||
]
|
||||
|
||||
for p in locations:
|
||||
if os.path.exists(p):
|
||||
address = p
|
||||
|
||||
slh = SysLogHandler(address=address)
|
||||
syslogFormatter = logging.Formatter('%(message)s')
|
||||
slh.setFormatter(syslogFormatter)
|
||||
log.addHandler(slh)
|
||||
|
||||
def panic(msg):
|
||||
log.critical(msg)
|
||||
sys.exit(1)
|
||||
|
||||
log.panic = panic
|
||||
log.die = panic
|
16
setup.py
Normal file
16
setup.py
Normal file
@ -0,0 +1,16 @@
|
||||
from distutils.core import setup
|
||||
|
||||
setup(
|
||||
name='sanelogging',
|
||||
version='1.0.0',
|
||||
author='Jeffrey Paul',
|
||||
author_email='sneak@datavibe.net',
|
||||
packages=['sanelogging'],
|
||||
url='http://pypi.python.org/pypi/sanelogging/',
|
||||
license='LICENSE.txt',
|
||||
description='Python logging for humans',
|
||||
long_description=open('README.md').read(),
|
||||
install_requires=[
|
||||
"colorlog",
|
||||
],
|
||||
)
|
Loading…
Reference in New Issue
Block a user