0

このコードは、ログファイルとコンソールの両方に同時に書き込みますか?

logFile = open("logfile.log",a)
print >>logFile,message
logFile.close()
4

2 に答える 2

26

いいえ、両方に書き込むことはありません。print()コンソールにのみ書き込みます。元のコードに関する簡単なメモ。どこかで定義していると思いますmessageが、コードはまだ正しくありません。a次のように、openステートメント内のを引用符で囲む必要があります。

open("logfile.log", "a")

私はあなたがファイルに追加するつもりだったと思うので。それ以外の場合、コードは、定義された変数ではないためNameError、をスローします。a

ただし、他の人が言っているように、ロギングモジュールの使用を強く検討する必要があります。これは、コンソールとログファイルの両方に書き込む方法の簡単な例です。コードはここここから部分的に派生しています:

import inspect
import logging

def function_logger(file_level, console_level = None):
    function_name = inspect.stack()[1][3]
    logger = logging.getLogger(function_name)
    logger.setLevel(logging.DEBUG) #By default, logs all messages

    if console_level != None:
        ch = logging.StreamHandler() #StreamHandler logs to console
        ch.setLevel(console_level)
        ch_format = logging.Formatter('%(asctime)s - %(message)s')
        ch.setFormatter(ch_format)
        logger.addHandler(ch)

    fh = logging.FileHandler("{0}.log".format(function_name))
    fh.setLevel(file_level)
    fh_format = logging.Formatter('%(asctime)s - %(lineno)d - %(levelname)-8s - %(message)s')
    fh.setFormatter(fh_format)
    logger.addHandler(fh)

    return logger

def f1():
    f1_logger = function_logger(logging.DEBUG, logging.ERROR)
    f1_logger.debug('debug message')
    f1_logger.info('info message')
    f1_logger.warn('warn message')
    f1_logger.error('error message')
    f1_logger.critical('critical message')

def f2():
    f2_logger = function_logger(logging.WARNING)
    f2_logger.debug('debug message')
    f2_logger.info('info message')
    f2_logger.warn('warn message')
    f2_logger.error('error message')
    f2_logger.critical('critical message')

def main():
    f1()
    f2()
    logging.shutdown()

main()

ロガーオブジェクトは複数のハンドラーを持つことができるため、異なる場所に書き込む複数のハンドラーを作成できます。私のコードでは、function_logger関数はそれが呼び出された関数に固有のロガーオブジェクトを作成します。

この関数は、レベルメッセージ以上をファイルにf1()記録し、レベルメッセージ以上をコンソールに書き込みます。フォーマットはそれぞれ異なります。DEBUGf1.logERROR

ただし、この関数f2()はコンソールに何も記録せず、WARNINGレベルメッセージのみをログファイルに記録しますf2.log。このスクリプトを1回実行すると、コンソールに次の出力が表示されます。

2012-07-20 10:46:38,950 - f1  - error message
2012-07-20 10:46:38,953 - f1  - critical message

そして、この出力はそれぞれf1.logとになります。f2.log

f1.log

2012-07-20 10:46:38,950 - 26 - DEBUG    - debug message
2012-07-20 10:46:38,950 - 27 - INFO     - info message
2012-07-20 10:46:38,950 - 28 - WARNING  - warn message
2012-07-20 10:46:38,950 - 29 - ERROR    - error message
2012-07-20 10:46:38,953 - 30 - CRITICAL - critical message

f2.log

2012-07-20 10:46:38,960 - 36 - WARNING  - warn message
2012-07-20 10:46:38,960 - 37 - ERROR    - error message
2012-07-20 10:46:38,960 - 38 - CRITICAL - critical message
于 2012-07-20T14:12:08.140 に答える
0

いいえ。ファイルにのみ書き込みます。loggingモジュールを使用する必要があります。http://docs.python.org/library/logging.htmlを参照してください

于 2012-07-20T07:02:21.013 に答える