Node.js / Python 日志
一、Node.js 日志
1、原生
Node.js 原生方法其实很简单,就四个:
// 输出到 stdout
console.log()
console.info() = console.log()
// 输出到 stderr
console.warn()
console.error() = console.warn()
配合 pm2 的 log 功能(参见我之前的 blog:pm2 官方文档学习笔记- 小蒋不素小蒋- 博客园),可以对项目实现基础的日志功能。(目前我采用的也是这种)
2、第三方库
debug:比较简单,express 有用到
log4js:比debug复杂,比肩winston
winston:拥有强大的社区支持不同的日志模块
bunyan:更适用于复杂的日志处理,但是需要用户自定义
以上库我都没怎么用过,具体待写。
3、思考
一个好的日志(系统),最好满足下面条件:
1、能按重要程度分级:例如分FATAL
、ERROR
、WARN
、INFO
和 DEBUG
等级。
2、能按所属功能分级:例如:
stat
: 系统性能统计日志,应用会定时收集一些性能信息,便于查询应用当前状态visit
: 每个http请求相关的日志,会包含惟一的 requestId,定位该请求相关的所有日志biz
: 业务数据相关日志,主要提供给数据统计使用
3、日志格式统一,最好采用 JSON ,便于 ELK
解析处理。
Elasticsearch + Logstash + Kibana(ELK)是一套开源的日志管理方案。
4、支持多种输出类型,例如 console、文件。
5、支持过滤规则
6、分布式集中采集。应用一般都是分布式的,但是日志不能是分布式。
7、报警功能。如有 ERROR / FATAL 级别的日志,则发邮件、短信提醒。
8、随时一键打开或关闭
9、可读性强,例如有染色能力
10、支持分割日志、定期备份
11、能重现现场(如还原成 fiddler抓包),对于概率性问题保留现场再重要不过。
二、python 日志
1、原生
(1)介绍
1、python 的日志功能包括:
Logger 记录器:这是我们能对整个对 Logging 进行操作的对象。要输出Logging 一定要一个Logger,当然导入 logging 之后有一个默认 logging 为 root logger。
Handler 处理器:将(日志记录器产生的)日志记录发送至合适的目的地。
Filter 过滤器:提供了更好的粒度控制,它可以决定输出哪些日志记录。
Formatter 格式化器:指明了最终输出中日志记录的布局。
注意:
Logger 可以包含很多 Handler/Filter,Handler 可以包含很多 Handler/Filter/Formatter。
如果不通过
logger = logging.getLogger(name)
来创建 Logger,则采用默认的Logger,名为root
。Logger 会有个默认的 Handler ,将日志打印到 console 上 (stdout)。
Formatter 默认的时间格式为 %Y-%m-%d %H:%M:%S。
2、python 的日志级别分为:
级别 | 何时使用 |
---|---|
DEBUG | 详细信息,典型地调试问题时会感兴趣。 |
INFO | 证明事情按预期工作。 |
WARNING | 表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。软件还是在正常工作。 |
ERROR | 由于更严重的问题,软件已不能执行一些功能了。 |
CRITICAL | 严重错误,表明软件已不能继续运行了。 |
注意:
Logger 和 Handler 都可以指定日志级别,Handler 优先级最高。。
默认的日志级别为 WARNING。(即高于 WARNING 才会输出)
(2)使用方式
- 1、缺省使用不配置;
- 2、显式创建记录器 Logger、处理器 Handler 和格式化器 Formatter,并进行相关设置;
- 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,输出到 console 上 (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')
format格式:
格式 | 描述 |
---|---|
%(levelno)s | 打印日志级别的数值 |
%(levelname)s | 打印日志级别名称 |
%(pathname)s | 打印当前执行程序的路径 |
%(filename)s | 打印当前执行程序名称 |
%(funcName)s | 打印日志的当前函数 |
%(lineno)d | 打印日志的当前行号 |
%(asctime)s | 打印日志的时间 |
%(thread)d | 打印线程id |
%(threadName)s | 打印线程名称 |
%(process)d | 打印进程ID |
%(message)s | 打印日志信息 |
输出:
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() 配置
可快速创建 logger。
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 的配置项如下:
关键字 | 描述 |
---|---|
filename | 创建一个FileHandler,使用指定的文件名,而不是使用StreamHandler。 |
filemode | 如果指明了文件名,指明打开文件的模式(如果没有指明filemode,默认为'a')。 |
format | handler使用指明的格式化字符串。 |
datefmt | 使用指明的日期/时间格式。 |
level | 指明根logger的级别。 |
stream | 使用指明的流来初始化StreamHandler。该参数与'filename'不兼容,如果两个都有,'stream'被忽略。 |
输出:
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、log 如何记录错误栈信息
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)
Node.js / Python 日志的更多相关文章
- Node.js log4js日志记录
这次需要给之前弄的文件服务器添加日志记录,一般每天产生的日志会特别多所以安装日期来划分是最好的,这里我用了express框架,为了适应express框架这里在log.js文件中写了use方法. //日 ...
- Node.js/Python爬取网上漫画
某个周日晚上偶然发现了<火星异种>这部漫画,便在网上在线看了起来.在看的过程中图片加载很慢,而且有时候还不小心点到广告,大大延缓了我看的进度.后来想到能不能把先把漫画全部抓取到本地再去看. ...
- PHP, Python, Node.js 哪个比较适合写爬虫?
PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢.比如:python+ ...
- [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能
[翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能 原文: Comparing AWS Lambda performance of Node.js, ...
- centos 6.5安装node.js
1.检查是否安装gcc编译器 rpm -q gcc rpm -q gcc-c++ 2.如果没有安装则通过以下代码安装gcc编译器 yum -y install gcc-c++ kernel-devel ...
- window环境下 node.js 游戏框架pomelo 安装与启动
一.软件准备 1.1 下载node.js 1.2 下载python 2.5 < version <3.0 1.3 下载c++编译器(一般控制面板中-->程序和功能上已有,如果没有需要 ...
- node.js 基础篇
日志输出方式 node test.js 2>error.log 1>info.log 如果需要日志文件追加 node test.js 2>>error.log 1>> ...
- 好未来数据中台 Node.js BFF实践(一):基础篇
好未来数据中台 Node.js BFF实践系列文章列表: 基础篇 实战篇(TODO) 进阶篇(TODO) 好未来数据中台的Node.js中间层从7月份开始讨论可行性,截止到9月已经支持了4个平台,其中 ...
- 为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?
twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区.文档也是很少可怜我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的 匿名用 ...
随机推荐
- c语言作业07
问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/8655 我在 ...
- 如何在VMware下通过挂载系统光盘搭建本地yum软件仓库
1.打开自己VMware软件中的虚拟机 2.输入用户名root密码登陆进去 3.打开 应用程序----收藏-----终端 4.首先回到根目录,输入cd ..(中间有空格) 5.创建一个名称为swlaa ...
- zsh: /usr/local/bin/pod: bad interpreter: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: no such file or directory
系统升级为 macOS Catalina 发现 CocoaPods 不管用了. 解决方法: 打开 iTerm2 sudo gem update --system 输入电脑密码,然后 sudo gem ...
- 《一张图看懂华为云BigData Pro鲲鹏大数据解决方案》
8月27日,华为云重磅发布了业界首个鲲鹏大数据解决方案--BigData Pro.该方案采用基于公有云的存储与计算分离架构,以可无限弹性扩容的鲲鹏算力作为计算资源,以支持原生多协议的OBS对象存储服务 ...
- 关于非阻塞I/O、多路复用、epoll的杂谈
本文主要是想解答一下这样几个问题: - 什么是非阻塞I/O - 非阻塞I/O和异步I/O的区别 - epoll的工作原理 文件描述符 文件描述符在本文有多次出现,难免有的朋友不太熟悉,有必要简单说明一 ...
- Node.js 中 process.cwd()与__dirname的区别
process.cwd() 是当前执行node命令时候的文件夹地址 --工作目录,保证了文件在不同的目录下执行时,路径始终不变 __dirname 是被执行的js 文件的地址 --文件所在目录 当前模 ...
- react-native-linear-gradient颜色渐变
目录 一 安装 二 使用 2.1 colors 2.2 start / end eg1:斜角渐变 eg2: 从左到右 2.2 locations eg1: 0.4是渐变的起点,0.6是渐变的终点 一 ...
- openstack网络(二)
连接物理服务器 单网卡 多网卡 跨主机安装网络服务 使用单个控制节点安装 使用专用网络节点安装 连接物理服务器 每个物理主机所需的网卡数量取决于云平台使用领域,组织的安全性和性能要求以及硬件的可用性. ...
- [TimLinux] django html如何实现固定表头
1. 需求 表格很长,这个时候就希望表格头部不动,而只是表格内容行支持滚动功能. 2. 方法 两张表:一张表(THeader)负责头部字段的显示,另一张表(TBody)负责内容行字段的显示. 两张表都 ...
- Redis中的Java分布式缓存
为什么在分布式Java应用程序中使用缓存?今天学习了两节优锐课讲解分布式缓存的内容,收获颇多,分享给大家. 在提高应用程序的速度和性能时,每毫秒都是至关重要的.例如,根据Google的一项研究,如果网 ...