当前位置: 首页 > 面试题库 >

如何将日志消息同时写入日志文件和控制台?

武彭薄
2023-03-14
问题内容

此代码是否同时写入日志文件和控制台?

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

问题答案:

不,它不会同时写入两者。print()只会写入控制台。关于原始代码的简短说明。我想您在message某处定义,但是代码仍然不正确。您需要aopen语句中使用引号,例如:

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函数创建一个特定于其调用函数的logger对象。

该功能f1()DEBUG级别消息及更高级别的消息记录到一个文件中f1.log,同时将ERROR级别消息及更高级别的消息写入控制台,每种消息的格式不同。

f2()但是,该功能不记录任何内容到控制台,而仅将WARNING级别消息记录到其日志文件中f2.log。运行此脚本一次,将在控制台上产生以下输出:

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


 类似资料:
  • 我在我的项目中使用log4j。我想有标准输出、调试记录器和最终报告记录器。调试记录器几乎写调试/信息级别的消息。报告将是不同的记录器,只写信息消息。我尝试了不同的方法,阅读了很多示例,我仍然无法解决这个问题。要么我丢失了我的标准输出,要么我将所有调试写入两个记录器。 我的密码在这里 } 任何提示都将不胜感激

  • 问题内容: 我正在尝试使用Go写入日志文件。 我尝试了几种方法,但都失败了。这是我尝试过的: 日志文件被创建,但是没有任何打印或附加到该文件。为什么? 问题答案: 过去的工作方式一定不同,但这对我有用: 基于Go文档,不能用于,因为它会打开文件“供阅读:” 打开命名文件以供读取。如果成功,则可以使用返回文件上的方法进行读取;关联的文件描述符具有mode 。如果有错误,它将是类型。 编辑 检查后移至

  • 我正在从事一个Spring Hibernate项目,其中包含Spring AMQP RabbitMQ消息传递实现。rabbitmq配置位于一个单独的xml中,该xml被导入到根应用程序上下文中。rabbitmq侦听器接收器每秒轮询一次队列。重要的日志消息被大量的调试级轮询消息隐藏在日志文件中。 有没有办法将轮询日志分离到另一个文件中,或者阻止它污染日志? 我使用log4j进行日志记录;配置如下。

  • 我正在使用Popen调用一个外壳脚本,它连续地将其stdout和stderr写入日志文件。有没有办法同时连续输出日志文件(到屏幕),或者让外壳脚本同时写入日志文件和stdout? 我主要想在Python中做这样的事情: 同样,这将stderr/stdout管道连接到tee,tee将其写入stdout和我的日志文件。 我知道如何用Python将stdout和stderr写入日志文件。我被困的地方是如

  • 我正在我的Spring Boot应用程序中使用Logback。 null