python日志公用文件设计-类似java的log4j

本文介绍了如何在Python环境下实现类似Java Log4j的日志系统,包括日志输出到控制台和文件,自定义日志路径,按日期命名文件,定位到代码行号,并作为公用库进行使用。同时提供了实现原理、代码示例和放置公用工具包的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 实现目标
本文完成python环境下,类似java的log4j实现,有下面需求
1、 日志输出到控制台,同时可以输出到文件
2、 日志文件可以在任何目录
如果不指定目录,则自动在当前目录下
3、 文件以当天日期为名称,同一天日志自动追加
4、 日志输出要定位到:天-时-分-秒,当前文件名-日志代码所在行号:(回车)日志内容
日志最大不同于print是日志能定位到代码所在输出行,print不可以
5、 python日志文件要能做为工具文件,放在python公用库目录,可以在任何项目中引用,类似java的公用jar包
二、 实现原理及示例代码


# -*- coding: utf-8 -*-
"""
2018-05-29 09:07:18
作者: 刘明

  %(levelno)s:         打印日志级别的数值  
 %(levelname)s:    打印日志级别名称  
 %(pathname)s:    打印当前执行程序的路径,其实就是sys.argv[0]  
 %(filename)s:      打印当前执行程序名  
 %(funcName)s:    打印日志的当前函数  
 %(lineno)d:         打印日志的当前行号  
 %(asctime)s:      打印日志的时间  
 %(thread)d:        打印线程ID  
 %(threadName)s: 打印线程名称  
 %(process)d:      打印进程ID  
 %(message)s:    打印日志信息 

%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
<think>我们正在处理一个SQL语法错误:org.postgresql.util.PSQLException: ERROR: syntax error at or near "任务名称" 这个错误通常发生在列名(或别名)包含特殊字符(如空格、中文等)而没有正确使用引号时。 在PostgreSQL中,如果列别名包含空格、特殊字符或保留字,必须使用双引号(")将其括起来。 例如,如果别名是"任务名称",则应该成`"任务名称"`。 用户可能在查询中这样: SELECT column_name AS 任务名称 FROM table_name; 或者 SELECT column_name AS '任务名称' FROM table_name; -- 注意:PostgreSQL中字符串使用单引号,但别名不能用单引号 正确的法应该是: SELECT column_name AS "任务名称" FROM table_name; 因此,我们需要检查查询中所有使用了非标准标识符(包含空格、特殊字符、非ASCII字符等)的地方,确保它们用双引号括起来。 步骤: 1. 找到查询中出现别名(或列名)"任务名称"的地方。 2. 确保该别名被双引号括起来,而不是单引号或没有引号。 3. 注意:双引号在SQL中用于标识符(如表名、列名、别名),而单引号用于字符串常量。 示例修正: 错误:SELECT task_name AS 任务名称 FROM tasks; 正确:SELECT task_name AS "任务名称" FROM tasks; 另外,如果查询中其他地方使用了这个别名(比如在GROUP BY或ORDER BY子句中),同样需要用双引号括起来。 例如: SELECT task_name AS "任务名称", COUNT(*) FROM tasks GROUP BY "任务名称"; 注意:在PostgreSQL中,标识符的双引号是大小敏感的。如果创建表时使用了带双引号的大标识符,那么在查询时也必须使用相同大小并加双引号。 但是,根据错误信息,错误发生在“任务名称”这个位置,所以问题很可能是在别名处没有加双引号。 因此,解决方案是:在查询中所有使用“任务名称”作为别名的地方,用双引号将其括起来。 如果用户使用的是工具(如pgAdmin、DBeaver)或编程语言(如JavaPython)执行SQL,确保在SQL字符串中正确转义双引号(如果需要的话)。 例如,在Java字符串中,可能需要这样: String sql = "SELECT task_name AS \"任务名称\" FROM tasks;"; 或者,在Python中: sql = "SELECT task_name AS \"任务名称\" FROM tasks;" 或者使用单引号定义字符串,内部用双引号:sql = 'SELECT task_name AS "任务名称" FROM tasks;' 总结:在PostgreSQL中,包含空格、特殊字符或非ASCII字符的别名必须用双引号括起来。</think>### PostgreSQL 列别名语法错误解决方案 您在 SQL 查询中遇到的错误 `org.postgresql.util.PSQLException: ERROR: syntax error at or near "任务名称"` 是由于 PostgreSQL 对标识符(如列别名)的严格命名规则导致的。以下是具体原因和解决方案: **错误原因分析**: 1. **非法字符问题** PostgreSQL 要求包含空格、中文等特殊字符的标识符必须用**双引号**包裹。直接使用 `任务名称` 会被解析为两个独立标识符("任务"和"名称"),导致语法错误[^1]。 2. **单引号误用** 使用单引号包裹别名(如 `'任务名称'`)是无效的,因为单引号在 SQL 中表示字符串字面量,而非标识符[^2]。 **正确解决方案**: ```sql -- 正确法:使用双引号包裹含特殊字符的别名 SELECT task_name AS "任务名称", -- 别名包含中文和空格 start_date AS "开始时间" FROM projects WHERE status = 'active'; ``` **关键语法规则**: 1. **双引号包裹规则** 当别名满足以下任一条件时必须加双引号: - 包含空格、中文等非 ASCII 字符 - 包含连字符(`-`)或特殊符号 - 使用保留关键字(如 `order`, `user` 等) ```sql -- 合法示例 SELECT total_price AS "总价(¥)" FROM orders; ``` 2. **大小敏感性** 双引号包裹的标识符**区分大小**: ```sql SELECT name AS "UserName" FROM users; -- 后续引用必须用 "UserName" ``` 3. **子句引用一致性** 在 `GROUP BY`, `ORDER BY` 等子句中引用别名时,需保持相同的引号格式: ```sql SELECT department AS "部门名称", COUNT(*) FROM employees GROUP BY "部门名称" -- 必须与 SELECT 中的别名一致 ORDER BY "部门名称"; ``` **常见错误法对比**: | 错误法 | 正确法 | 错误原因 | |---------|---------|---------| | `AS 任务名称` | `AS "任务名称"` | 未加双引号 | | `AS '任务名称'` | `AS "任务名称"` | 误用字符串引号 | | `AS 任务名称`(在 ORDER BY 中) | `ORDER BY "任务名称"` | 子句引用不一致 | **进阶建议**: - 在程序代码中拼接 SQL 时,使用参数化查询避免引号转义问题 - 对于复杂查询,建议使用 CTE(公用表表达式)简化别名引用: ```sql WITH project_data AS ( SELECT id, name AS "项目名称" FROM projects ) SELECT "项目名称" FROM project_data; ``` > **提示**:在 PostgreSQL 中,下划线 `_` 是合法的标识符字符。若不想使用双引号,可用 `任务名称` 替代 `任务名称`(但中文部分仍需引号)[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值