Python3+Django+loggingアレコレ

参考：
http://qiita.com/sakamossan/items/a98b949738028ad39a6b
http://docs.python.jp/3.5/library/logging.handlers.html

# バージョン

```
$ python3 --version
Python 3.5.2
```

```
$ django-admin --version
1.10.3
```

# 書き方
## settings.py
```
$ cd test_project
$ cat test_project/settings.py

# Logging
LOGGING_PATH = '/tmp/'

LOGGING = {
    'version': 1,
    'formatters': {
        'all': {
            'format': '\t'.join([
                "time:%(asctime)s",
                "level:%(levelname)s",
                "module:%(module)s",
                "process:%(process)d",
                "thread:%(thread)d",
                "message:%(message)s",
            ])
        },
    },
    'handlers': {
        'file_no_rotation': { # ローテーションなし
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': os.path.join(LOGGING_PATH, 'file_no_rotation.log'),
            'formatter': 'all',
        },
        'file_size_rotation': { # サイズローテート
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOGGING_PATH, 'file_size_rotation.log'),
            'formatter': 'all',
            'maxBytes': 1024 * 1024,
            'backupCount': 10,
        },
        'file_time_rotation': { # 時刻ローテート
            'level': 'DEBUG',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': os.path.join(LOGGING_PATH, 'file_time_rotation.log'),
            'formatter': 'all',
            'when': 'D',
            'interval': 1,
            'backupCount': 30,
        },
        'console': { # 標準出力
            'level': 'DEBUG',
            'class': 'logging.StreamHandler', 
            'formatter': 'all',
    },
    'loggers': {
        'test_1': {
            'handlers': ['file_no_rotation'],
            'level': 'INFO',
        },
　　　　　　　　　　　　　　　　'test_2': {
            'handlers': ['file_size_rotation'],
            'level': 'INFO',
        },
　　　　　　　　　　　　　　　　'test_3': {
            'handlers': ['file_time_rotation'],
            'level': 'INFO',
        },
　　　　　　　　　　　　　　　　'test_4': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    },
}
```

# 出力側
## 前準備
```
$ python3 manage.py startapp test_app
$ cat test_project/urls.py

from django.conf.urls import include
from django.conf.urls import url

urlpatterns = [
    url(r'^test_app/', include('test_app.urls')),
]

$ cat test_app/urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^.*$', views.index, name='index'),
]

$ cat test_app/views.py

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world.")
```

# ログ出してみる
```
$ cat test_app/views.py

from django.http import HttpResponse
import logging

logger_1 = logging.getLogger('test_1')
logger_2 = logging.getLogger('test_2')
logger_3 = logging.getLogger('test_3')
logger_4 = logging.getLogger('test_4')

def index(request):
    logger_1.debug('test_1 debug')
    logger_1.info('test_1 info')
    logger_1.warn('test_1 warn')
    logger_1.error('test_1 error')
    logger_2.debug('test_1 debug')
    logger_2.info('test_1 info')
    logger_2.warn('test_1 warn')
    logger_2.error('test_1 error')
    logger_3.debug('test_1 debug')
    logger_3.info('test_1 info')
    logger_3.warn('test_1 warn')
    logger_3.error('test_1 error')
    logger_4.debug('test_1 debug')
    logger_4.info('test_1 info')
    logger_4.warn('test_1 warn')
    logger_4.error('test_1 error')
    return HttpResponse("Hello, world.")
```

# 確認

1. スタート
`$ python3 manage.py runserver 0.0.0.0:8000`

2. ブラウザからアクセス
http://127.0.0.1:8000/test_app/index

3. ログ確認
※　'level': 'INFO'なので、debugログは表示されない
※　ファイル吐き出し系は、以下
`$ cd /tmp/`
`$ cat file_no_rotation.log`
`$ cat file_size_rotation.log`
`$ cat file_time_rotation.log`