python 3の中のlogging記録ログの実現過程とパッケージ化の操作
作用:
主に情報を記録して、位置を決めて問題を調べるのに便利です。
python loggingモジュール公式サイト:
https://docs.python.org/zh-cn/3.7/library/logging.html#formatter-object
三つの位置づけ問題方法:
print
デバッグ:コードを書いたらデバッグする必要がないので、ロゴを導入しました。
loging.debug()Cは一般的にテスト環境で使用されます。
logger:生産環境に問題がある場合、loggerの位置決め問題を確認できます。
ステップ:
1.初期化ログコレクタ
2.ログ収集器のレベルを設定する-デフォルトはwarningです。
3.初期化ログプロセッサ-ログを書くペンとして理解できます。
4.ログプロセッサレベルの設定
5.ハンドルを追加する
6.ログの書式設定
7.ログプロセッサを追加
8.異なるレベルのログを設定する
ここは引用です
ログコレクタレベル
1.NOSET 0は書いてないのに等しい、無駄話
2.DEBUG 10プログラムのデバッグバッグ時に使用する
3.INFO 20プログラムが正常に動作している時に使用する
4.WARNING 30警告、プログラムが予定通りに実行されていない場合に使用する
5.ERROE 40プログラムエラー
6.CRITICAL 50重大問題
どのようにレベルを定義しますか?自分で決めたのはtry:except:ログログ
コードの実現過程は以下の通りです。
debugに設定した場合は、それ以上のレベルしか印刷できません。
warningを設定すると、warning.errorだけが印刷されます。
管理しないレベルは何ですか?ここでレベルを設定します。
二つの中で一番高いものを選んでください。(ログコレクタ)がwarningであれば、(ログプロセッサ)
debugです。warningを基準として、二つとも設置します。このように複数のhandlerを追加できます。
問題2:実用化
モジュールで直接的に実装すると、外部で実装されると、複数のログファイルの生成が容易になります。
問題3:ログフォーマットの設定、python loging公式サイト、検索に必要なもの。
https://docs.python.org/zh-cn/3.7/library/logging.html#formatter-object
クラスとしてカプセル化
最近は、pythonプログラムをrsyslogsに書き込み、rsyslogsを設定するファイルを通じて、彼を指定ファイルに保存します。
まず、logingが提供する常用モジュールを見に来ました。
logger:loggerは主にログメッセージを設定して送信します。logging.get Logger(name)から一つのloggerオブジェクトに戻ります。
nameを指定しないでデフォルトはrootです。
ここで適当な名前が取れます。
同じnameは同じloggerオブジェクトに戻ります。Formaterメソッドで%sでログにこのnameをプリントアウトします。たとえば:
%(name)sロギングの名前
%sテキスト形式のログレベル
%sユーザが出力するメッセージ
%s文字列形式の現在時刻です。標準書式は「2003-07-08 16:49:45,896」です。コンマの後ろはミリ秒です。
%(levelno)sデジタル形式のログレベル
%sがログ出力関数のモジュールのフルパス名を呼び出しました。ないかもしれません。
%sログ出力関数のモジュールのファイル名を呼び出します。
%(module)s呼出ログ出力関数のモジュール名
%(funcName)s呼出ログ出力関数の関数名
%dログ出力関数の文があるコードラインを呼び出します。
%(created)f現在時間は、UNIX標準の表示時間の浮動小数点で表します。
%(relativeCreated)dがログ情報を出力する場合、ロギング作成以来のミリ秒数
%(thread)dスレッドID。ないかもしれません
%sスレッド名。ないかもしれません
%プロセスID。ないかもしれません
上のこれらのモジュールから私の欲しい機能が実現できます。
ログをall.logファイルに書き込む-----ソースコード:
以上のpython 3の中のloggingログの実現過程とパッケージの操作は小編集が皆さんに共有した内容です。参考にしていただければ幸いです。どうぞよろしくお願いします。
主に情報を記録して、位置を決めて問題を調べるのに便利です。
python loggingモジュール公式サイト:
https://docs.python.org/zh-cn/3.7/library/logging.html#formatter-object
三つの位置づけ問題方法:
デバッグ:コードを書いたらデバッグする必要がないので、ロゴを導入しました。
loging.debug()Cは一般的にテスト環境で使用されます。
logger:生産環境に問題がある場合、loggerの位置決め問題を確認できます。
ステップ:
1.初期化ログコレクタ
2.ログ収集器のレベルを設定する-デフォルトはwarningです。
3.初期化ログプロセッサ-ログを書くペンとして理解できます。
4.ログプロセッサレベルの設定
5.ハンドルを追加する
6.ログの書式設定
7.ログプロセッサを追加
8.異なるレベルのログを設定する
ここは引用です
ログコレクタレベル
1.NOSET 0は書いてないのに等しい、無駄話
2.DEBUG 10プログラムのデバッグバッグ時に使用する
3.INFO 20プログラムが正常に動作している時に使用する
4.WARNING 30警告、プログラムが予定通りに実行されていない場合に使用する
5.ERROE 40プログラムエラー
6.CRITICAL 50重大問題
どのようにレベルを定義しますか?自分で決めたのはtry:except:ログログ
コードの実現過程は以下の通りです。
```python
import logging # , 。
logger = logging.getLogger(" ") #
logger.setLevel("DEBUG") #
handler = logging.FileHandler(" ") # - ( , )
handler.setLevel("warning") # warning
console_handler = logging.StreamHandler() #
console_handler.setLevel("DEBUG")
logger.addHandler(handler) # handler
logger.addHandler(console_handler)
# , ( - - - - )
fmt = logging.Formatter("%(filename)s-%(lineno)s-%(name)s-%(levelname)s-%(massage)s")
handler.setFormat(fmt) # -
# logger --
logging.info("")
logging.debug("")
logging.waring("")
logging.error("")
logging.critical("")
問題1:レベル設定debugに設定した場合は、それ以上のレベルしか印刷できません。
warningを設定すると、warning.errorだけが印刷されます。
管理しないレベルは何ですか?ここでレベルを設定します。
二つの中で一番高いものを選んでください。(ログコレクタ)がwarningであれば、(ログプロセッサ)
debugです。warningを基準として、二つとも設置します。このように複数のhandlerを追加できます。
問題2:実用化
モジュールで直接的に実装すると、外部で実装されると、複数のログファイルの生成が容易になります。
問題3:ログフォーマットの設定、python loging公式サイト、検索に必要なもの。
https://docs.python.org/zh-cn/3.7/library/logging.html#formatter-object
クラスとしてカプセル化
import logging
class LoggerHandler(logging.Logger):
def __init__(self,
name="root",
level="DEBUG",
file=None,
format="%(filename)s:%(lineno)d:%(name)s:%(levelname)s:%(message)s"
):
#
logger = logging.getLogger(name)
#
logger.setLevel(level) # Logger
# format,
fmt = logging.Formatter(format)
#
# file , stream_handler, ,
if file:
file_handler = logging.FileHandler(file)
# handler
file_handler.setLevel(level)
# handler
logger.addHandler(file_handler)
#
file_handler.setFormatter(fmt)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(level)
logger.addHandler(stream_handler)
stream_handler.setFormatter(fmt)
self.logger = logger
def debug(self, msg):
return self.logger.debug(msg)
def info(self,msg):
return self.logger.info(msg)
def warning(self,msg):
return self.logger.warning(msg)
def error(self,msg):
return self.logger.error(msg)
def critical(self,msg):
return self.logger.critical(msg)
# , logger ( ), logger
# name,file ( , )
logger = LoggerHandler(config.logger_name,config.level,config.logger_file)
# logger = LoggerHandler("python21",file="demo.txt")
if __name__ == '__main__':
logger = LoggerHandler()
logger.debug("world")
# .py:40:root:DEBUG:world - 59 , logger -- logging.Logger
再パッケージ-ロゴを継承した後、どの行に直接印刷するかを確認しました。ソースを確認できます。
import logging
class LoggerHandler(logging.Logger):
def __init__(self,
name="root",
level="DEBUG",
file=None,
format="%(filename)s:%(lineno)d:%(name)s:%(levelname)s:%(message)s"
):
# logger(name) logger name
super().__init__(name)
#
# logger.setLevel(level)
self.setLevel(level) # Logger
# format,
fmt = logging.Formatter(format)
#
# file , stream_handler, ,
if file:
file_handler = logging.FileHandler(file)
# handler
file_handler.setLevel(level)
# handler
self.addHandler(file_handler)
#
file_handler.setFormatter(fmt)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(level)
self.addHandler(stream_handler)
stream_handler.setFormatter(fmt)
# , logger ( ), logger
# name,file ( , )
logger = LoggerHandler(config.logger_name,config.level,config.logger_file)
# logger = LoggerHandler("python21",file="demo.txt")
if __name__ == '__main__':
logger = LoggerHandler()
logger.debug("world")
# --- .py:44:root:DEBUG:world
知識を補充します:python 3はloggingを使って包んで、日記をシステムのrsyslogsの中で書きます。最近は、pythonプログラムをrsyslogsに書き込み、rsyslogsを設定するファイルを通じて、彼を指定ファイルに保存します。
まず、logingが提供する常用モジュールを見に来ました。
logger:loggerは主にログメッセージを設定して送信します。logging.get Logger(name)から一つのloggerオブジェクトに戻ります。
nameを指定しないでデフォルトはrootです。
ここで適当な名前が取れます。
同じnameは同じloggerオブジェクトに戻ります。Formaterメソッドで%sでログにこのnameをプリントアウトします。たとえば:
log = logging.getLogger('mylog')
log_format = logging.Formatter(
'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s')
# :
#Aug 2 12:44:41 [localhost] hhl-mylog-server[7409]-DEBUG: debug message
handler: , ,socket 。 addHandler handler, 。 rsyslog , SysLogHandler(),
from logging.handlers import SysLogHandler
、 rsyslog facility: , kernel,mail,system , local0-local7 。 local5。 log , centos7 /dev/log。 :
log_hdlr=SysLogHandler(facility=SysLogHandler.LOG_LOCAL5, address='/dev/log')
rsyslog (/etc/rsyslog.conf):
local5.* /var/log/all.log
# local5 all.log
handlerでログ情報をフィルタリングしたいなら、こうしてもいいです。
log_hdlr.setLevel(logging.ERROR)
# error
formatter: , , :
log_format = logging.Formatter(
'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s')
#
#Aug 2 12:44:41 [localhost] hhl-mylog-server[7409]-DEBUG: debug message
formaterで呼び出し可能なパラメータはありますか?%(name)sロギングの名前
%sテキスト形式のログレベル
%sユーザが出力するメッセージ
%s文字列形式の現在時刻です。標準書式は「2003-07-08 16:49:45,896」です。コンマの後ろはミリ秒です。
%(levelno)sデジタル形式のログレベル
%sがログ出力関数のモジュールのフルパス名を呼び出しました。ないかもしれません。
%sログ出力関数のモジュールのファイル名を呼び出します。
%(module)s呼出ログ出力関数のモジュール名
%(funcName)s呼出ログ出力関数の関数名
%dログ出力関数の文があるコードラインを呼び出します。
%(created)f現在時間は、UNIX標準の表示時間の浮動小数点で表します。
%(relativeCreated)dがログ情報を出力する場合、ロギング作成以来のミリ秒数
%(thread)dスレッドID。ないかもしれません
%sスレッド名。ないかもしれません
%プロセスID。ないかもしれません
上のこれらのモジュールから私の欲しい機能が実現できます。
ログをall.logファイルに書き込む-----ソースコード:
import logging
from logging.handlers import SysLogHandler
log = logging.getLogger('mylog')
log.setLevel(logging.DEBUG)
log_hdlr=SysLogHandler(facility=SysLogHandler.LOG_LOCAL5, address='/dev/log')
log_format = logging.Formatter(
'hhl-%(name)s-server[%(process)d]-%(levelname)s: %(message)s')
log_hdlr.setFormatter(log_format)
log_hdlr.setLevel(logging.ERROR)# error
log.addHandler(log_hdlr)
log.debug('debug message test')# debug
log.error('error message test')# error
# error
一部のところで間違っているかもしれませんが、ご指摘をお願いします。以上のpython 3の中のloggingログの実現過程とパッケージの操作は小編集が皆さんに共有した内容です。参考にしていただければ幸いです。どうぞよろしくお願いします。