存储过程中能否向数据库标准日志文件写入非错误类消息?
在存储过程中向数据库标准日志写入消息的实现方法
当然可以实现,无需触发异常就能把信息写入数据库主日志,不同数据库的具体操作方式如下:
MySQL
如果开启了通用查询日志(general_log),可以在存储过程中执行一条带标记的查询语句,让日志捕获这条信息:
DELIMITER // CREATE PROCEDURE record_log(IN log_msg VARCHAR(255)) BEGIN -- 执行带日志标记的查询,会被general_log捕获 SELECT CONCAT('INFO: ', log_msg) AS log_entry; END // DELIMITER ;
调用时执行CALL record_log('Note this event happened.');即可,这条查询的内容会被写入MySQL的主日志文件。
PostgreSQL
直接使用RAISE NOTICE语句,不会抛出异常,只要数据库的log_min_messages参数设置为notice或更低级别(默认一般满足),消息就会写入主日志:
CREATE OR REPLACE PROCEDURE record_log(log_msg TEXT) LANGUAGE plpgsql AS $$ BEGIN RAISE NOTICE 'Note this event happened.'; -- 或者动态传入参数:RAISE NOTICE '%', log_msg; END; $$;
调用存储过程后,这条通知消息会出现在PostgreSQL的日志文件中。
SQL Server
有两种常用方式:
- 使用
PRINT语句,只要服务器配置了捕获PRINT输出到错误日志,就能记录信息:
CREATE PROCEDURE record_log @log_msg VARCHAR(255) AS BEGIN PRINT 'Note this event happened.'; -- 或者动态输出:PRINT @log_msg; END;
- 使用专门的日志存储过程
xp_logevent,直接写入错误日志,需要相应权限:
CREATE PROCEDURE record_log @log_msg VARCHAR(255) AS BEGIN EXEC xp_logevent 60000, 'Note this event happened.', informational; END;
内容的提问来源于stack exchange,提问作者Joe McCay
相关产品推荐
相关产品推荐

