Complete Python Logging Guide

Python logging 基础指南 实际项目中,print() 只能满足基本的输出要求,而 logging 模块提供了更灵活、分级别、可配置的日志系统。 核心概念 Logger 记录器 记录器是拿来写日志的东西 logger = logging.getLogger(__name__) logger.info("开始执行任务") 接收日志消息,按级别判断是否要输出,并交给 Handler Handler 处理器 决定日志“去哪里”,有下面常见 Handler StreamHandler: 输出到控制台 FileHandler: 写入文件 RotatingFileHandler: 自动滚动文件 SMTHandler: 发邮件 SocketHandler: 发送到日志服务器 一个 Logger 可以挂多个 Handler Formatter 格式器 负责日志的格式 '%(asctime)s - %(levelname)s - %(name)s - %(message)s' 所有 Handler 都可以设置自己的 Formatter,不同输出渠道可以呈现不同格式 LogRecord 日志记录对象 每次调用 logging.info("hello") 内部都会生成一个 LogRecord 对象 LogRecord 是日志系统的“消息载体”,包括全部的元数据,例如: 时间戳 模块名 文件名、行号 日志级别 写入消息 message 线程 ID、进程 ID Filter 过滤器 Filter 是更细粒度的筛选工具,可以控制某个模块的日志,阻止某些关键字,基于上下文附加标签等。 简单使用 import logging logging.basicConfig( # 输出 INFO 及以上几倍日志 level=logging.INFO, # 时间 - 模块名 - 级别 - 消息内容 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logging.info("程序已启动") logging.warning("磁盘空间将不足") logging.error("读取文件失败") 使用 Logger 对象:在较大的项目中,不会使用基础配置,而是为每个模块创建自己的 logger ...

November 11, 2025 · 10 min · 1920 words · Starslayerx

PostgreSQL 02: SQL Basis

SQL 入门 SQL (Structured Query Language) 是关系数据库最重要的操作语言,且影响已经超出了数据库领域,这篇文章介绍基础部分。 语句分类 SQL 命令一般分为 DQL、DML、DDL 三类: DQL: Data Query Language 数据查询语句,基本就是 SELECT 查询命令,用于数据查询。 DML: Data Manipulation Language 数据操纵语言,主要用于插入、更新、删除数据,即 INSERT、UPDATE、DELETE 三类。 DDL: Data Definition Language 数据定义语言,用于创建、删除、修改表、索引等数据库对象的语言。 词法结构 每次执行的 SQL 语句可以由多条 SQL 命令组成,多条 SQL 语句命令之间由分号 (;) 分隔。 SQL 命令由一系列记号组成,这些记号可以由关键字、标识符、双引号包围的标识符、常量和单引号包围的常量组成。 SQL 命令中可以有注释,这些注释在 PostgreSQL 中等同于空白。 例如下面这些 SQL 命令 SELECT * FROM OSDBA_TABLE01; UPDATE OSDBA_TABLE SET COL1 = 64; INSERT INTO OSDBA_TABLE VALUES (232, 'hello osdba'); DDL 语句 使用 psql 会默认连接到和用户名一样的数据库中,也可以使用命令 psql postgres 来连接到默认数据库,或者 creatdb db_name 创建新数据库。 ...

November 7, 2025 · 5 min · 1022 words · Starslayerx

PostgreSQL 01: Introduction

PostgreSQL 的安装与配置 安装 brew 安装后 brew services start postgresql@17 可以启动服务,使用 brew services list 查看服务状态。 也可以通过设定环境变量 export PGDATA=/opt/homebrew/var/postgresql@17 后使用命令 initdb 创建数据库簇,然后 pg_ctl start -D $PGDATA 启动。 停止命令为 pg_ctl stop -D $PGDATA [-m SHOWDOWN-MODE],其中 -m 是服务器停止方法: smart: 等所有连接终止后,关闭数据库。如果客户端连不上,则无法关闭数据库。 fast: 快速关闭数据库,断开客户端连接,让已有的事务回滚,然后关闭数据库。相当于 Oracle 关闭时的 immediate 模式。 immediate: 立即关闭数据库,相当于数据库进程立即停止,直接退出,下次启动数据库需要恢复。相当于 Oracle 关闭时的 abort 模式。 PostgreSQL 数据库中的 immediate 关机模式相当于 Oracle 数据库中的 abort 关机模式,而 Oracle 中的 immediate 关机模式实际上对应的是 PostgreSQL 中的 fast 模式。 配置 PostgreSQL 数据库的配置主要通过修改数据目录下的 postgresql.conf 和 pg_hba.conf 文件来实现的。 ...

November 5, 2025 · 1 min · 198 words · Starslayerx

Morden Javascript Tutorial Chapter 3.1 - Code Quailty

3.1 Debugging in the browser Debugging is the process of finding and fixing errors with a script. All morden browsers and most other environments support debugging tools - a special UI in developer tools that makes debugging much easier. It also allows to trace the code step by step to see what exactly is going on. The “Sources” panel The Sources panel has 3 parts: The File Navigator pane lists HTML, Javascript, CSS and other files, including images that are attatched to the page. Chrome extensions may appera here too. The Code Editor pane shows the source code. The Javascript Debugging pane is for debugging, we’ll explore it soon. Console 按 Esc 可以打开控制台,在其中可以输入命令,按回车执行。 ...

October 23, 2025 · 1 min · 189 words · Starslayerx

Python Standrad Library - File and Directory Access - pathlib

pathlib - Object-oriented filesystem paths 此模块提供表示文件系统路径的类,其语义适用于不同的操作系统。 路径类分为: 用于纯计算无 I/O 的 pure paths 继承 pure paths 但是有 I/O 操作的 concrete paths 基本使用 导入 Path from pathlib import Path p = Path('.') 列出所有子目录 [x for x in p.iterdir() if x.is_dir()] 列出所有 py 源码文件 list(p.glob('**/*.py')) 在目录树中移动 p = Path('/etc') q = p / 'init.d' / 'reboot' # .resolve() 方法会解析所有符号链接,返回文件绝对路径 # mac os 中的 /etc 实际上是一个符号链接,指向 /private/etc q.resolve() 查询文件路径 q.exists() # 文件是否存在 q.is_dir() # 是否为目录 打开一个文件 q = Path('.') / 'file.py' with q.open() as f: # 读取第一行内容 f.readline() Pure paths 纯路径 Pure path 对象提供路径处理操作,这些操作无需真的访问操作系统。 有三种方法来操作这些类,也被称为 flavours (风格): class pathlib.PurePath(*pathsegemnts) 为一个通用的类,代表当前系统的路径风格 >>> PurePath('setup.py') PurePosixPath('setup.py') pathsegments 的每个元素即可以是代表一个路径的字符串,也可以是实现了 os.PathLike 接口的对象,其中 fspath() 方法返回一个字符串,例如另一个路径对象: ...

October 3, 2025 · 9 min · 1706 words · Starslayerx

Morden Javascript Tutorial Chapter 2 - Fundamentals: 11~18

2.11 Logical operators There are four logical operators in JavaScript: || (ORA), && (AND), ! (NOT), ?? (Nullish Coalescing 空值合并). || OR result = a || b There are four logical combinations: alter( true || true ); // true alert( false || true ); // true alert( true || false ); // true alert( false || false ); // false If an operand is not a boolean it’s converted to be a boolean for the evaluation. if (1 || 0) { // works like (true || false) alter('truthy!'); } OR “||” finds the first truthy value result = value1 || value2 || value3 The OR || operator does the following: ...

September 21, 2025 · 22 min · 4603 words · Starslayerx

Redis Bitmap

Bitmap 位图 Redis 的位图 bitmap 是由多个二进制位组成的数组, 数组中的每个二进制都有与之对应的偏移量(索引), 用户通过这些偏移量可以对位图中指定的一个或多个二进制位进行操作. Redis 为位图提供了一系列操作命令, 通过这些命令, 用户可以: 设置或获取索引位上的二进制值 统计位图中有多少个二进制位被设置成了1 查找位图中, 第一个被设置为指定值的二进制位, 并返回其偏移量 对一个或多个位图执行逻辑并、逻辑或、逻辑异或以及逻辑非运算 将指定类型的整数存储到位图中 SETBIT: 设置二进制位的值 SETBIT bitmap offset value 为位图指定偏移量上的二进制位设置值, 该命令会返回二进制位被设置之前的旧值作为结果. 当执行 SETBIT 时, 如果位图不存在, 或者位图当前的大小无法满足用户想要执行的设置操作, 那么 Redis 将对被设置的位图进行扩展, 使得位图可以满足用户的设置请求. 由于位图的扩展以字节为单位, 所以扩展后的位图包含的二进制数量可能会比用户要求的稍多一些. 且在扩展的同时, 会将未设置的二进制位初始化为 0. 与一些可以使用负数的 Redis 命令不同, SETBIT 命令只能使用正数偏移量, 尝试输入负数作为偏移量将引发一个错误 复杂度: O(1) GETBIT: 获取二进制位的值 GETBIT bitmap offset 与 SETBIT 命令一样, GETBIT 命令也只能接受正数作为偏移量. 对于偏移量超过位图索引的命令, GETBIT 命令将返回 0 作为结果. 复杂度: O(1) BITOCUNT: 统计被设置的二进制数量 BITCOUNT key 对于值为 10010100 的位图 bitmap001, 可以通过执行以下命令来统计有多少个二进制位被设置成了1: ...

September 19, 2025 · 5 min · 1009 words · Starslayerx

Redis HyperLogLog

之前曾介绍过使用 Redis 集和构建唯一计数器, 并将这个计数器用于计算网站的唯一房客 IP. 虽然使用集和实现唯一计数器可以实现该功能, 但这个方法有一个明显的缺陷: 随着被计数元素的不断增多, 唯一计数器占用的内存也会越来越大; 计数器越多, 他们的体积越大, 这一情况就会越严峻. 以计算唯一访客 IP 为例: 存储一个 IPv4 格式的 IP 地址最多需要 15 个字节 根据网站的规模不同, 每天出现的唯一 IP 可能会有数十万、数百万个 为了记录网站在不同时期的访客, 并进行相关的数据分析, 网站可能需要次序地记录每天的唯一访客 IP 数量 综上, 如果一个网站想要长时间记录访客 IP, 就必须创建多个唯一计数器. 如果访客比较多, 那么它创建的每个唯一计数器都将包含大量元素, 并因此占用相当一部分内存. 为了高效解决计算机唯一访客 IP 数量这类问题, 其中一种方法就是 HyperLogLog. HyperLogLog 简介 HyperLogLog 是一个专门为了计算集和的基数而创建的概率算法, 对于一个给定的集和, HyperLogLog 可以计算出这个集合的近似基数: 近似基数并非集和的实际基数, 它可能会比实际的基数大一点或者小一点, 但误差会在一个合理范围内. 因此, 那些不需要知道实际基数的程序就可以把这个近似基数当作集合的基数来使用. HyperLogLog 的优点在于计算近似基础所需的内存并不会因为集和的大小而改变, 无论集和包含元素有多少个, HyperLogLog 进行计算所需的内存总是固定的, 无论集和包含元素多少个, HyperLogLog 进行计算所需的内存总是固定的, 并且是非常少的. PFADD: 对集和元素进行计数 PFADD hyperloglog element [element ...] 根据给定元素是否已经进行过计数, PFADD 命令可能返回0, 也可能返回1: ...

September 18, 2025 · 3 min · 456 words · Starslayerx

Morden Javascript Tutorial Chapter 2 - Fundamentals: 06~10

2.6 Interaction: alert, prompt, confirm Will introduce alert, prompt and confirm in this chapter. alert It shows a message and waits for the user to press “OK”. alert("Hello"); prompt This function prompt accepts two arguments result = prompt(title, [default]); It shows a modal window with a text message, an input field for the visitor, and the buttons OK/Cancel. title: The text to show the visitor. default: An optional second parameter, the initial value for the input field. ...

September 17, 2025 · 15 min · 3118 words · Starslayerx

Morden Javascript Tutorial Chapter 2 - Fundamentals: 01~05

2.1 Hellow Wrold Firtly, let’s see how to attach a script to a webpage. For server-side environments (like Node.js), you can execute this script with a command like node my.js The “script” tag JavaScript programs can be inserted almost anywhere into an HTML docuemnt using the <script> tag <!DOCTYPE html> <html> <body> <p>Before this script...</p> <script> alert("Hello, World!"); </script> <p>...After the script...</p> </body> </html> The <script> tag contains JavaScript code which is automatically executed when the browser process the tag. ...

September 16, 2025 · 16 min · 3234 words · Starslayerx