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:ログログ
コードの実現過程は以下の通りです。

```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ログの実現過程とパッケージの操作は小編集が皆さんに共有した内容です。参考にしていただければ幸いです。どうぞよろしくお願いします。