logging#
import logging
logger = logging.getLogger(__name__)
logger.error("ERROR!")
# logging.basicConfig でログレベル・フォーマットを変更。
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s: %(message)s",
datefmt='%Y-%m-%d %H:%M:%S'
)
logger.error("This script occured error !")
LogRecord 属性#
LogRecord 属性 はレコードからのデータをフォーマット文字列に統合するのに使える。
- 属性名: asctime, フォーマット:
%(asctime)s
- 人間が読める書式で表したもの。デフォルトでは "20022-07-08 16:49:45,896" 形式
基本的な使いかた#
Python logging モジュールを使うことで、プログラムの実行中に出力されるログを管理できます。ログには、情報、デバッグ、警告、エラー、クリティカルなメッセージなどが含まれます。
基本的な使い方は以下のとおりです。
- ロガーを作成する
Info
__name__
は現在のモジュールの名前を示します。
- ログレベルを設定する
デフォルトのログレベルは WARNING です。 ログレベルには、以下のようなものがあります。
- CRITICAL : 致命的なエラー
- ERROR : エラー
- WARNING : 警告
- INFO : 情報
- DEBUG : デバッグ情報
-
NOTSET : ログレベルを指定しない
-
ハンドラを追加する
stream_handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
上記の例では、 StreamHandler を使って、ログを標準出力に出力しています。 setFormatter メソッドを使って、ログの出力形式を指定しています。
- ログを出力する
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
各ログレベルに対応するメソッドを呼び出すことで、ログを出力できます。出力されるログの形式は、 formatter で指定したものになります。
ファイルとコンソール両方に出力#
Python logging モジュールを使って、同時にファイルとコンソールにログを出力するには、 FileHandler と StreamHandler を両方使用する必要があります。以下はその例です。
import logging
# ロガーを作成する
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# ログファイルとコンソールに出力するハンドラを作成する
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)
# フォーマッタを作成する
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)
# ロガーにハンドラを追加する
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
# ログを出力する
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
上記の例では、FileHandler と StreamHandler を作成し、それぞれファイルとコンソールにログを出力するように設定しています。 setLevel メソッドで、それぞれのハンドラのログレベルを設定しています。また、setFormatter メソッドで、ログの出力形式を指定しています。
最後に、各ログレベルに対応するメソッドを呼び出すことで、ログを出力しています。
注意点として、ファイルハンドラで指定するファイル名は存在しない場合は新規作成されますが、存在する場合は上書きされます。 したがって、追記したい場合は FileHandler の引数 mode を 'a' に設定する必要があります。もしくは異なるファイル名で新規に作成します。
ini ファイル#
以下は、ファイルとコンソールにログを出力する設定ファイルの例です。
[loggers]
keys=root
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=simpleFormatter
args=('example.log', 'a', 1000000, 3)
[formatter_simpleFormatter]
format=%(asctime)s [%(levelname)s] %(message)s
datefmt=%Y-%m-%d %H:%M:%S
上記の設定ファイルでは、consoleHandler と fileHandler という2つのハンドラを定義し、それぞれコンソールとファイルにログを出力するように設定しています。 また、simpleFormatter というフォーマッタを定義しています。
handler_consoleHandler では、StreamHandler を使用してコンソールにログを出力するように設定しています。
args には、コンソール出力に使用するストリームを指定しています。
handler_fileHandler では、RotatingFileHandler を使用してファイルにログを出力するように設定しています。
ファイル名は 'example.log' で、ログの最大サイズは 1000000 バイト、バックアップファイルの数は最大で 3 つとなるように設定しています。 args には、ファイル名とオプションの引数を指定しています。
最後に、formatter_simpleFormatter でログの出力形式を指定しています。
この設定ファイルを使用するには、以下のように logging.config モジュールを使用して設定を読み込み、ロガーを作成する必要があります。
import logging.config
logging.config.fileConfig('logging.conf')
logger = logging.getLogger(__name__)
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
上記の例では、fileConfig() メソッドを使用して、設定ファイルを読み込んでいます。getLogger() メソッドを使用して、ロガーを作成し、ログを出力しています。
辞書型#
辞書型でログの設定を行う場合は、以下のように dictConfig() メソッドを使用して、辞書を引数にしてロギング設定を行います。
import logging.config
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'simpleFormatter'
},
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'DEBUG',
'formatter': 'simpleFormatter',
'filename': 'example.log',
'maxBytes': 1000000,
'backupCount': 3,
'encoding': 'utf-8'
},
},
'loggers': {
'': {
'handlers': ['console', 'file'],
'level': 'DEBUG',
'propagate': True
}
},
'formatters': {
'simpleFormatter': {
'format': '%(asctime)s [%(levelname)s] %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S'
}
}
}
logging.config.dictConfig(LOGGING)
logger = logging.getLogger(__name__)
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
上記の例では、LOGGING という辞書を使用して、ロギングの設定を行っています。handlers には、console と file という2つのハンドラを定義しています。 class でハンドラの種類を指定し、level でログレベル、formatter でフォーマッタ、その他のオプションを指定しています。
loggers には、ルートロガーを指定しています。'' でルートロガーを指定し、handlers で使用するハンドラを指定し、level でログレベルを指定しています。 propagate は True に設定することで、ルートロガーから派生したロガーにもログが伝播されるようになります。
formatters には、使用するフォーマッタを指定しています。
最後に、dictConfig() メソッドを使用して、辞書で指定したログ設定を読み込みます。 そして、getLogger() メソッドを使用して、ロガーを作成し、ログを出力しています。
YAML ファイル#
Pythonのloggingモジュールでは、YAML形式の設定ファイルを直接使用することはできません。 しかし、PyYAMLというライブラリを使用することで、YAML形式の設定ファイルを読み込んで辞書型に変換し、 その辞書型を dictConfig() メソッドで使用することができます。
以下は、YAML形式の設定ファイルを読み込んで、辞書型に変換し、その辞書型を dictConfig() メソッドで使用する例です。
import yaml
import logging.config
with open('logging.yaml', 'r') as f:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)
logger = logging.getLogger(__name__)
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
上記の例では、yaml モジュールを使用して、YAML形式の設定ファイル logging.yaml を読み込んでいます。 safe_load() メソッドを使用することで、安全にYAML形式の設定ファイルを読み込むことができます。
次に、読み込んだYAML形式の設定ファイルを辞書型に変換し、dictConfig() メソッドでログ設定を行います。 そして、getLogger() メソッドを使用して、ロガーを作成し、ログを出力しています。
以下は、logging.yaml ファイルの例です。
version: 1
disable_existing_loggers: False
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: simpleFormatter
file:
class: logging.handlers.RotatingFileHandler
level: DEBUG
formatter: simpleFormatter
filename: example.log
maxBytes: 1000000
backupCount: 3
encoding: utf-8
loggers:
'':
handlers: ['console', 'file']
level: DEBUG
propagate: True
formatters:
simpleFormatter:
format: '%(asctime)s [%(levelname)s] %(message)s'
datefmt: '%Y-%m-%d %H:%M:%S'
JSON 形式#
Pythonのloggingモジュールでは、JSON形式の設定ファイルを直接使用することはできません。 しかし、json モジュールを使用することで、JSON形式の設定ファイルを読み込んで辞書型に変換し、 その辞書型を dictConfig() メソッドで使用することができます。
以下は、JSON形式の設定ファイルを読み込んで、辞書型に変換し、その辞書型を dictConfig() メソッドで使用する例です。
import json
import logging.config
with open('logging.json', 'r') as f:
config = json.load(f)
logging.config.dictConfig(config)
logger = logging.getLogger(__name__)
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
上記の例では、json モジュールを使用して、JSON形式の設定ファイル logging.json を読み込んでいます。
次に、読み込んだJSON形式の設定ファイルを辞書型に変換し、dictConfig() メソッドでログ設定を行います。 そして、getLogger() メソッドを使用して、ロガーを作成し、ログを出力しています。
以下は、logging.json ファイルの例です。
{
"version": 1,
"disable_existing_loggers": false,
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "INFO",
"formatter": "simpleFormatter"
},
"file": {
"class": "logging.handlers.RotatingFileHandler",
"level": "DEBUG",
"formatter": "simpleFormatter",
"filename": "example.log",
"maxBytes": 1000000,
"backupCount": 3,
"encoding": "utf-8"
}
},
"loggers": {
"": {
"handlers": ["console", "file"],
"level": "DEBUG",
"propagate": true
}
},
"formatters": {
"simpleFormatter": {
"format": "%(asctime)s [%(levelname)s] %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S"
}
}
}
辞書型と同じような構造になっており、ロギングの設定が記述されています。 JSON形式の設定ファイルを使用することで、設定をより簡潔に記述することができます。