A、Node.jsのログ
1、原生
Node.jsのネイティブメソッドは、わずか4非常に簡単です:
// 输出到 stdout
console.log()
console.info() = console.log()
// 输出到 stderr
console.warn()
console.error() = console.warn()
(私が見る前にブログ:ログのPM2機能によりPM2公式ドキュメントの研究ノート-ないプライムXiaojiang Xiaojiang -ブログパークが)、ログのプロジェクトに基づいて達成することができます。(現時点では、私はまた、これを使用しました)
2、サードパーティのライブラリ
デバッグ:シンプル、急行は便利であり
log4js:デバッグパーウィンストン、より複雑な
ウィンストン:強力なコミュニティのサポート異なるログモジュールを持っています
バニヤン:より複雑なログ処理に適した、しかしカスタマイズするには、ユーザーが必要な
私は、より具体的には書かれ方よりも、ライブラリを使用していません。
3、思考
良いログ(システム)、好ましくは以下の条件を満足します。
1、押すことの重要性分類:例えば、ポイントのためにFATAL
、ERROR
、WARN
、INFO
およびDEBUG
グレード。
2は、押すことができ、関連する機能の分類を:たとえば:
stat
:システムパフォーマンス統計のログは、アプリケーションが定期的に収集、パフォーマンス情報は、簡単には、アプリケーションの現在の状態を照会するだろうvisit
:HTTPは、要求、関連するすべてのログを見つけ、唯一のrequestIdが含まれます、関連する各要求をログに記録しますbiz
:主に統計データを使用するためのビジネス関連のデータロギング、
3、好ましくは均一にログ形式、JSON、を容易にELK
解析処理。
Elasticsearch + Logstash + Kibana(ELK)は、オープンソースのログ管理プログラムです。
4、など、コンソール、ファイルなどの複数の出力タイプをサポート。
5、フィルタリングルールのサポート
図6は、中央集中型のコレクションを配布しました。アプリケーションは、一般的に配布されますが、ログは配布できません。
7、アラーム機能。ERROR / FATALレベルのログ、電子メール、SMSアラートの場合。
8、いつでもオンまたはオフにするには、キー
9、読みやすい、例えば、染色する能力を持っています
10、スプリットログ、定期的なバックアップをサポート
11、シーンを再現することができ、再予約サイトの可能性が、重要な(例えばシオマネキEtherealの削減など)。
二、Pythonのログ
1、原生
(1)はじめに
1、Pythonのログは、次のとおりです。
ロガーレコーダー:これは、ログの全体のために、私たちの目標が動作可能です。ログはロガーに出力しなければなりません、もちろん、デフォルトルートロガーのロギングロギングは、インポート後にあります。
ハンドラプロセッサに:(生成されたログ)を適切な宛先に送信されたログ・レコード。
フィルタのフィルタ:粒子サイズのよりよい制御を提供し、それがどのログ出力を決定してもよいです。
フォーマッタフォーマッタ:最終出力ログのレイアウトを指定します。
注意:
ロガーは、ハンドラは、多くのハンドラ/フィルター/フォーマッタを含むことができ、多くのハンドラ/フィルターを含めることができます。
でない場合は
logger = logging.getLogger(name)
ロガーを作成し、デフォルトロガーを使用し、呼ばれますroot
。ロガーは、デフォルトのハンドラは、コンソール(標準出力)に印刷ログを持っています。
%M:%S.デフォルトの時間フォーマット%Y-%M-%D%Hフォーマッタ
2、Pythonのログレベルに分かれています。
レベル | ときに使用します |
---|---|
デバッグ | 通常、問題をデバッグする際の詳細な情報は、対象としています。 |
INFO | 期待通りに物事が働くことを証明。 |
警告 | (このような「フルディスク」など)いくつかの事故や問題が近い将来に起こるであろうがあったことを示しています。または適切にソフトウェアの仕事インチ |
エラー | より深刻な問題のためには、ソフトウェアは、機能の一部を実行することはできません。 |
CRITICAL | ソフトウェアを実行し続けることができないことを示す重大なエラー、。 |
注意:
ロガーとハンドラは、ハンドラ最優先のログレベルを指定することができます。。
デフォルトのログレベルはWARNINGです。(即ち、警告のみ上記出力)
(2)使用
- 1、デフォルトの設定を使用していません。
- 図2に示すように、明示的に記録ロガー、フォーマッタプロセッサ、およびフォーマッタハンドラ、および関連する設定を作成します。
- 図3に示すように、使用して、簡単な方法で構成された
basicConfig()
直接配置された機能を、 - 図4に示すように、使用して、構成ファイルを介して構成
fileConfig()
設定ファイルを読み出す機能と、 - 図5に示すように、使用して、辞書を配置することにより構成されている
dictConfig()
機能のリード設定情報を、 - 図6に示すように、使用して、ネットワークによって構成されている
listen()
ネットワーク構成の機能を。
1、デフォルトの設定
import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warn message')
logging.error('error message')
logging.critical('critical message')
上述したように、デフォルトのログレベルはWARNING、コンソール(stdout)に出力されます。
出力:
フォーマット日志级别 :logger实例名称 :日志消息内容
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message
2、明示的に作成
import logging
# 记录器
logger = logging.getLogger("logger")
# 处理器 - 常用的有两个
handler1 = logging.StreamHandler()
handler2 = logging.FileHandler(filename="test.log")
# 指定 Level
handler1.setLevel(logging.WARNING)
handler2.setLevel(logging.DEBUG)
# logger.setLevel(logging.DEBUG)
# 格式化器
fmt = "%(asctime)-15s %(levelname)s %(filename)s %(lineno)d %(process)d %(message)s"
datefmt = "%a %d %b %Y %H:%M:%S"
formatter = logging.Formatter(fmt, datefmt)
handler1.setFormatter(formatter)
handler2.setFormatter(formatter)
# logger.setFormatter(formatter) 注意:这样不行!
# 过滤器
class NoParsingFilter(logging.Filter):
def filter(self, record):
return not record.getMessage().startswith('This is an')
handler1.addFilter(NoParsingFilter())
handler2.addFilter(NoParsingFilter())
# logger.addFilter(NoParsingFilter())
# 处理器 -- 绑定 -> 记录器
logger.addHandler(handler1)
logger.addHandler(handler2)
# exec
logger.debug('This is a customer debug message')
logger.info('This is an customer info message')
logger.warning('This is a customer warning message')
logger.error('This is an customer error message')
logger.critical('This is a customer critical message')
フォーマットフォーマット:
フォーマット | 説明 |
---|---|
%(levelno)■ | ログレベル値を印刷 |
%(levelname)■ | ログレベルの名前を印刷 |
%(パス名)の | 現在実行中のプログラムの印刷パス |
%(ファイル名)の | 現在実行中のプログラムの名前を印刷 |
%(FUNCNAME)■ | 現在の印刷ログ機能 |
%(LINENO)D | ログの現在の行番号を印刷 |
%(いるasctime)■ | 印刷ログ時刻 |
%(スレッド)からd | 印刷スレッドID |
%(のthreadName)■ | 印刷スレッド名 |
%(プロセス)D | 印刷プロセスID |
%(メッセージ)の | 印刷ログ情報 |
出力:
Sun 17 Nov 2019 23:01:22 WARNING test.py 35 70560 This is a customer warning message
Sun 17 Nov 2019 23:01:22 CRITICAL test.py 37 70560 This is a customer critical message
3、にbasicConfig()の設定
あなたはすぐにロガーを作成することができます。
import logging
logging.basicConfig(filename="test.log", filemode="w", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%d-%M-%Y %H:%M:%S", level=logging.DEBUG)
logging.debug('debug message')
logging.info('info message')
logging.warning('warn message')
logging.error('error message')
logging.critical('critical message')
basicConfigの設定項目は以下の通り:
キーワード | 説明 |
---|---|
ファイル名 | 代わりにStreamHandlerのを使用するのでは、指定したファイル名を使用して、のFileHandlerを作成します。 |
ファイルモード | あなたは、ファイル名を指定した場合、(ファイルモードを指定しない場合、デフォルトは「A」である)は、ファイルのオープンモードを指定します。 |
フォーマット | フォーマット文字列で指定されたハンドラを使用してください。 |
datefmt | 任意の指定された日付/時刻形式を使用します。 |
レベル | ルートロガーのレベルを示します。 |
ストリーム | 使用して、StreamHandlerのを初期化する流れに指定しました。このパラメータは、2がある場合は、「ストリーム」が無視され、「ファイル名」と互換性がありません。 |
出力:
17-03-2019 23:03:58 root:DEBUG:debug message
17-03-2019 23:03:58 root:INFO:info message
17-03-2019 23:03:58 root:WARNING:warn message
17-03-2019 23:03:58 root:ERROR:error message
17-03-2019 23:03:58 root:CRITICAL:critical message
4,5,6書き込まれます。
(3)その他
エラーログスタック情報を記録する方法1、
a = 5
b = 0
try:
c = a / b
except Exception as e:
# 这种写法记录不到错误栈信息
# logging.error("Exception occurred")
# 下面三种方式三选一
# logging.exception("Exception occurred")
# logging.error("Exception occurred", exc_info=True)
# logging.log(level=logging.ERROR, msg="Exception occurred", exc_info=True)