- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
到目前为止,我只对文件进行简单的日志记录,如果我记录多行字符串,那么结果如下所示:
发出日志:
logging.info('foo\nbar')
日志文件:
2018-03-05 10:51:53 root.main +16: INFO [28302] foo
酒吧
到目前为止,所有不包含“INFO”或“DEBUG”的行都会报告给运算符(operator)。
这意味着 bar
行被报告。这是误报。
环境:Linux。
如何在 Python 中设置日志记录以将 INFO foo\nbar
保留在一个字符串中并忽略整个字符串,因为它只是“INFO”?
注意:是的,您可以在解释器中过滤日志记录。不幸的是,这不是问题所在。这个问题是不同的。首先发生日志记录。然后解析日志。
这是一个重现它的脚本:
import sys
import logging
def set_up_logging(level=logging.INFO):
root_logger = logging.getLogger()
root_logger.setLevel(level)
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(
logging.Formatter('%(asctime)s %(name)s: %(levelname)-8s [%(process)d] %(message)s', '%Y-%m-%d %H:%M:%S'))
root_logger.addHandler(handler)
def main():
set_up_logging()
logging.info('foo\nbar')
if __name__ == '__main__':
main()
再想一想,我觉得真正的问题是:哪种日志记录格式可行?仅仅删除跨越多行的消息中的换行符会使一些输出难以被人眼阅读。另一方面,当前 logging.info() 与日志文件中的一行之间的 1:1 关系很容易阅读。 ...我不确定
最佳答案
我通常有一个自定义日志记录的类,但您可以使用自定义 logging.Formatter
实现您想要的:
import logging
class NewLineFormatter(logging.Formatter):
def __init__(self, fmt, datefmt=None):
"""
Init given the log line format and date format
"""
logging.Formatter.__init__(self, fmt, datefmt)
def format(self, record):
"""
Override format function
"""
msg = logging.Formatter.format(self, record)
if record.message != "":
parts = msg.split(record.message)
msg = msg.replace('\n', '\n' + parts[0])
return msg
上面的 format()
函数拆分行并在每行中复制时间戳/日志前导码(在每个 \n
之后)
现在您需要将格式化程序附加到根记录器。如果您构建自己的日志记录设置/结构,您实际上可以将它附加到任何 handler
:
# Basic config as usual
logging.basicConfig(level=logging.DEBUG)
# Some globals/consts
DATEFORMAT = '%d-%m-%Y %H:%M:%S'
LOGFORMAT = '%(asctime)s %(process)s %(levelname)-8s %(filename)15s-%(lineno)-4s: %(message)s'
# Create a new formatter
formatter = NewLineFormatter(LOGFORMAT, datefmt=DATEFORMAT)
# Attach the formatter on the root logger
lg = logging.getLogger()
# This is a bit of a hack... might be a better way to do this
lg.handlers[0].setFormatter(formatter)
# test root logger
lg.debug("Hello\nWorld")
# test module logger + JSON
lg = logging.getLogger("mylogger")
lg.debug('{\n "a": "Hello",\n "b": "World2"\n}')
上面给你:
05-03-2018 08:37:34 13065 DEBUG test_logger.py-47 : Hello
05-03-2018 08:37:34 13065 DEBUG test_logger.py-47 : World
05-03-2018 08:37:34 13065 DEBUG test_logger.py-51 : {
05-03-2018 08:37:34 13065 DEBUG test_logger.py-51 : "a": "Hello",
05-03-2018 08:37:34 13065 DEBUG test_logger.py-51 : "b": "World2"
05-03-2018 08:37:34 13065 DEBUG test_logger.py-51 : }
请注意,我正在访问根记录器的 .handlers[0]
,这有点麻烦,但我找不到解决这个问题的方法...另外,请注意格式化JSON 打印:)
关于Python:设置日志记录,允许多行字符串:logging.info ('foo\nbar' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49049044/
以下代码中的 alert(`${info} : ${pokemondetails[info]}\n`) 的含义是什么?有人可以用更简单的形式向我解释一下吗? let checkname = funct
C-x C-f blah.info 以基本模式打开文件。我使用了 apropos 并发现了 Info-mode,我认为它可能会从基本模式更改为 Info 模式,但这会引发 lisp 错误。 如何在 e
我想在另一个 Info.plist 键 (NSContactsUsageDescription) 的值中使用“Bundle 显示名称”(CFBundleDisplayName) 的值。 我尝试了以下方
我正在使用 Python 3.6.4。我第一次遇到 logger.setLevel(logging.INFO) 被忽略的问题,然后遇到了 this answer ,这让我感到困惑并引发了这个问题。 鉴
我是python新手 如果 logging.info() 足以进行日志记录,为什么我们必须使用 getLogger() 方法实例化一个记录器? 最佳答案 在没有名称的情况下调用 getLogger()
下面是来自源代码的示例代码:https://docs.python.org/3/howto/logging.html import logging logging.basicConfig(filena
我在网上阅读的所有内容都在谈论 Info.plist。当我创建项目时,XCode 为我创建了一个 [应用程序名称]-Info.plist 文件,它似乎与我在网上看到的示例 Info.plist 具有相
我定义了一个记录器实例如下: private static final Logger LOGGER = Logger.getLogger(Main.class.getName()); 我有一个要记录的
我的应用程序因 Info.plist 文件中缺少用途字符串而被拒绝(特别是对于 NSMicrophoneUsageDescription 用法)。 这取决于 react-native-permissi
我正在 Windows 下使用 Python 3.4.2。就我而言, import logging logger = logging.getLogger('logger') logger.setLev
我的背景主要是使用 C 和 C++ 进行 Windows 编程。最近我也有机会使用一些嵌入式 Linux 系统,但我对此还是个新手。 现在我正在为 Openwrt 开发一个实用程序,它需要对正常操作期
所以我只是按照此处所述运行了 INFO 命令 http://redis.io/commands/info 但它只给我默认部分——比如 cpu 信息和其他 当我尝试添加 [section] 参数时 -
我正在尝试了解 QEMU 内存管理(使用 i386 guest ,没有 KVM)。 QEMU 监视器允许列出 CPU 寄存器信息( info registers )、USB 设备( info usb
我的包中有 package-info.java,Hibernate 需要它来实现某些功能(编程实体扫描)。 但是,mvn package 不会导致 package-info.class 在 class
我遇到了似乎很常见的错误,因为 Xcode 似乎找不到我的“Info.plist”文件。 我已经检查了这两个 StackOverflow 问题的答案( Could not read from Info
我一直在尝试阅读 XEP-0030 Service Discovery但发现该语言非常不透明。 我的问题很简单:disco#info 规范和 disco#items 规范有什么区别? 我的猜测是 di
这个问题已经有答案了: String concatenation performance in Log4j (3 个回答) 已关闭 4 年前。 之前我通常使用log.info(“dsasdds ” +
我从 Erlang 文档中看到 supervisor:start_child 可以返回两个不同的非错误结果:{ok, Child} 和 {ok, Child, Info}。这个信息在哪里设置? sim
我使用的是 Crystal 0.25.0,File.info(string).symlink? 在以下示例中应返回 true 时返回 false: `mkdir -p /tmp/delete` Di
对于属性: Persist Security Info=true 和 Persist Security Info=false 你能告诉我它们之间有什么区别吗,如果我不把它放在我的连接中会发生什么? c
我是一名优秀的程序员,十分优秀!