使用Python logger类为不同的日志级别生成多个日志

2024-04-13

我在这里浏览了 python 日志记录类的教程,没有看到任何可以让我为同一输出创建不同级别的多个日志的内容。最后我想要三个日志:<timestamp>_DEBUG.log(调试级别)
<timestamp>_INFO.log(信息级别)
<timestamp>_ERROR.log(错误级别)

有没有一种方法可以在一个脚本中为同一输入生成多个日志文件?


因此,在实现 @robert 的建议时,我现在遇到了一个小问题,可能是由于没有完全理解他的代码中所做的事情。

这是我在 scriptRun.py 中的代码

import os
import logging

logger = logging.getLogger("exceptionsLogger")
debugLogFileHandler = logging.FileHandler("Debug.log")
errorLogFileHandler = logging.FileHandler("Error.Log")
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
errorLogFileHandler.setFormatter(formatter)
debugLogFileHandler.setFormatter(formatter)
logger.addHandler(debugLogFileHandler)
logger.addHandler(errorLogFileHandler)

class LevelFilter(logging.Filter):
    def __init__(self, level):
        self.level = level
    def filter(self, record):
        return record.levelno == self.level
debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
errorLogFileHandler.addFilter(LevelFilter(logging.ERROR))

directory = []
for dirpath, dirnames, filenames in os.walk("path\to\scripts"):
    for filename in [f for f in filenames if f.endswith(".py")]:
        directory.append(os.path.join(dirpath, filename))
for entry in directory:
    execfile(entry)
    for lists in x:
        if lists[0] == 2:
            logger.error(lists[1]+"   "+lists[2])
        elif lists[0] == 1:
            logger.debug(lists[1]+"   "+lists[2])

正在运行的示例是:

import sys

def script2Test2():
    print y
def script2Ttest3():
    mundo="hungry"

global x 
x = []

theTests = (test2, test3)

for test in theTests:
    try:
        test()
        x.append([1,test.__name__," OK"])
    except:
        error = str(sys.exc_info()[1])
        x.append([2,test.__name__,error])

现在我的问题是:跑步scriptRun.py当我运行它时不会抛出任何错误,并且error.log and debug.log被创建,但仅error.log填充有条目。

知道为什么吗?

所以我意识到没有记录任何比警告“更低”的内容。即使我移除过滤器并且debugLogFileHandler.setLevel(logging.DEBUG)这似乎并不重要。如果我将实际的日志命令设置为logger.warning或更高,它将打印到日志中。当然,一旦我取消评论debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))我没有收到任何日志活动Debug.log。我很想创建自己的日志级别,但这似乎是一个非常糟糕的主意,以防任何人/任何其他人使用此代码。


好吧,我很愚蠢,忘记设置记录器本身来记录 DEBUG 级别事件。由于默认情况下,日志记录类不会记录低于警告的任何内容,因此它不会记录我发送给它的任何调试信息。

最后感谢@Robert 的过滤器。


创建多个处理程序,每个处理程序对应一个输出文件(INFO.log、DEBUG.log 等)。

向每个处理程序添加一个仅允许特定级别的过滤器。

例如:

import logging

# Set up loggers and handlers.
# ...

class LevelFilter(logging.Filter):
    def __init__(self, level):
        self.level = level

    def filter(self, record):
        return record.levelno == self.level

debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
infoLogFileHandler.addFilter(LevelFilter(logging.INFO))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Python logger类为不同的日志级别生成多个日志 的相关文章

随机推荐

  • Oracle 主键:NUMBER 与 NUMBER(7,0)

    指定 PK 的精度有什么好处吗 鉴于记录可能永远不会超过几千条 7 0 是否足够 不指定精度有什么危险吗 NUMBER 7 0 只是限制了值域 它们的内部表示没有不同 CREATE TABLE t pk col1 NUMBER 7 0 NO
  • 访问数据库表单 ActiveX 控件错误

    我正在使用一个带有日期选择器控件的表单 当打开表单并单击日期选择器控件 MSCOMCT2 OCX 时 我收到以下无用的错误 您输入的表达式 Change 作为偶数属性设置 产生以下错误 加载 ActiveX 时出错 控制您的一份表格或报告
  • save_and_open_page 不适用于水豚 2.0?

    我刚刚将水豚更新到 2 0 并且所有 save and open page 调用都返回一个没有样式的 html 页面 它在页面顶部正确地提供了样式表链接 当我恢复到水豚 1 3 时 样式再次起作用 有人知道如何解决这个问题 和 或问题是什么
  • Android底层读取大于2GB的SD卡

    我的 Android 应用程序尝试通过访问实际设备 在我的例子中为 dev block vold 179 1 来读取 SD 卡的物理扇区 当然这是在有root权限的手机上 我可以将设备打开为FileInputStream 并从中读取数据 但
  • 获取我的 Facebook 页面上粉丝的用户列表 GRAPH API

    如何获取我的 Facebook 页面上粉丝的用户列表 遗憾的是 目前无法获取您的 Facebook 页面的粉丝列表 目前尚不清楚这是设计使然还是错误 This 脸书错误报告 http bugs developers facebook net
  • 流畅的 NHibernate 将 IList 作为值映射到单列

    我有这门课 public class MyEntity public virtual int Id get set public virtual IList
  • 在nodejs服务器的内存中存储

    似乎有很多有前途的软件包 但没有明确建议哪个是最快的 可扩展的 哪个是内存效率更高的 npm 安装memoizee https www npmjs com package memoizee npm 安装内存缓存 https www npmj
  • 在 iPhone/Android 中始终显示滚动条 [重复]

    这个问题在这里已经有答案了 有没有办法让滚动条在移动浏览器中始终可见 默认情况下 仅当发生触摸 滑动时 可滚动页面的滚动才可见 如何使滚动条始终可见 在你的 css 样式上尝试一下这个 webkit scrollbar webkit app
  • 在php中获取XML文件内容作为字符串

    我想将 xml 文件的内容显示为本身 我不想解析它 而是只是读取它的内容并显示它 I tried content file get contents test xml But the content其中有 xml 当我var dump co
  • 如果mysql数据类型是默认值为“0000-00-00 00:00”的时间戳,如何检查是否为空?

    我想找出最好的返回方式true or false如果 mysql 数据类型是TIMESTAMP为 null 返回日期0000 00 00 00 00 我尝试过这样的事情 if mycolumn 0000 00 00 00 00 echo n
  • ArrayList 是如何工作的?

    ArrayList内部使用什么数据结构 内部有一个ArrayList使用一个Object 当您将项目添加到ArrayList 列表检查后备阵列是否还有剩余空间 如果有空间 新项目将添加到下一个空白处 如果没有空间 则会创建一个更大的新数组
  • Kubectl 与 minikube - 重新启动集群时出错:kubeadm.yaml

    我安装了 kubernetes minikube install MacOs 10 12 6 但在尝试启动 minikube 时 我不断收到错误 minikube start Starting local Kubernetes v1 10
  • Django Rest 框架:如何在 ModelViewSet 中关闭/打开分页

    我在用着Django REST 框架 https github com encode django rest framework tree master with djangorestframework csv https github c
  • 非分组表的 UITableView 节标题高度

    问候 我知道UI表格视图 节标题高度仅用于分组表 但无论如何我都会问 如果有某种方法可以做到这一点并不明显 有没有办法更改节标题高度 以及字体 大小 NON 分组表 希望 是 或至少是 也许 但担心这可能是 否 伙计们 努力吧 Yes 使用
  • 如何将材质的 TreeView 的折叠/展开图标更改为右侧?

    我正在尝试使用 Reactjs 中的材料来实现一棵树 但是 根据我的设计 折叠和展开的按钮应该位于右侧 另外 在添加图标时出现错误TreeItem像这样
  • CursorAdapter 中光标的更改

    我正在努力改变Cursor in CursorAdapter这边走 Cursor newCursor compiledStatement getCursor startManagingCursor newCursor adapter cha
  • 使用包含 Excel VBA 内的 DataContract 的 wcf 服务

    你读了标题并呻吟了 没关系 我也这么做了 但我们按照要求去做 对吧 我需要构建一个可以通过 Excel 中的名字进行访问的服务 2003 年 但我假设任何版本的 Excel 都应该支持此功能 目前 我想做的就是将电子表格将数据发布到从远程计
  • Typescript 异步/等待和角度 $q 服务

    新的 TypeScript 异步 等待功能使用 ES6 Promise AngularJS 使用 q服务承诺与界面略有不同 有没有办法使用 TypeScript 异步 等待功能 q服务承诺 你可以让它像这样工作 angular module
  • 将 time_t 转换为刻度

    我有一个将刻度转换为 time t 格式的函数 long ticks DateTime Now Ticks long tt GetTimeTSecondsFrom ticks long GetTimeTSecondsFrom long ti
  • 使用Python logger类为不同的日志级别生成多个日志

    我在这里浏览了 python 日志记录类的教程 没有看到任何可以让我为同一输出创建不同级别的多个日志的内容 最后我想要三个日志