日志专用函数

public function write_log($data,$url ='',$filename)
    {
        //设置路径目录信息
        if($url==''){
         $file_url = '././public/log/mihelog/' . date('Ymd') . $filename.'.txt';
        }else{
         $file_url =$url. date('Ymd') . $filename.'.txt';
        }
        $dir_name = dirname($file_url);
        //目录不存在就创建
        if (!file_exists($dir_name)) {
            //iconv防止中文名乱码
            $res = mkdir(iconv("UTF-8", "GBK", $dir_name), 0777, true);
        }
        $fp = fopen($file_url , "a");//打开文件资源通道 不存在则自动创建
        fwrite($fp, var_export($data, true) . "\r\n");//写入文件
        fclose($fp);//关闭资源通道
    }
### PL/SQL中的函数执行日志记录 在PL/SQL中,为了跟踪函数的执行情况并捕获潜在错误或调试信息,通常会采用日志记录机制。这种机制可以通过多种方式实现,具体取决于需求和项目规模。 #### 使用UTL_FILE包进行文件日志记录 `UTL_FILE` 是 Oracle 提供的一个内置包,允许开发者将日志消息写入服务器上的文件。这种方法适用于需要长期保存日志的情况。以下是其实现示例: ```plsql DECLARE log_file UTL_FILE.FILE_TYPE; BEGIN -- 打开日志文件 log_file := UTL_FILE.FOPEN('DIRECTORY_NAME', 'log.txt', 'W'); IF UTL_FILE.IS_OPEN(log_file) THEN UTL_FILE.PUT_LINE(log_file, 'Function started at: ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')); BEGIN -- 函数核心逻辑 NULL; -- 替代实际业务逻辑 UTL_FILE.PUT_LINE(log_file, 'Function executed successfully.'); EXCEPTION WHEN OTHERS THEN UTL_FILE.PUT_LINE(log_file, 'Error occurred: ' || SQLERRM); RAISE; END; -- 关闭日志文件 UTL_FILE.FCLOSE(log_file); ELSE DBMS_OUTPUT.PUT_LINE('Failed to open log file.'); END IF; END; / ``` 上述代码展示了如何利用 `UTL_FILE` 创建日志文件,并在其中记录函数启动时间、成功完成的消息以及任何可能发生的异常[^1]。 #### 利用DBMS_OUTPUT包进行控制台输出 对于简单的测试场景,可以使用 `DBMS_OUTPUT` 将日志打印到控制台上。这种方式不持久化数据,仅适合开发阶段快速验证行为。 ```plsql CREATE OR REPLACE FUNCTION example_function RETURN NUMBER IS BEGIN DBMS_OUTPUT.PUT_LINE('Example function started...'); -- 假设这里是复杂的计算逻辑 DBMS_OUTPUT.PUT_LINE('Example function completed.'); RETURN 1; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('An error has occurred: ' || SQLERRM); RETURN -1; END; / ``` 此方法虽然方便快捷,但由于其依赖客户端设置(如启用缓冲区),因此不适合生产环境中正式部署[^2]。 #### 数据库表作为日志存储介质 更常见也更为推荐的做法是定义一张专用日志表来保存所有的运行状态更新。这样做的好处是可以轻松查询历史记录,并且与其他应用程序共享这些信息变得容易得多。 首先创建日志表结构: ```sql CREATE TABLE LOG_TABLE ( ID NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, MODULE VARCHAR2(50), MESSAGE CLOB, CREATED_AT TIMESTAMP WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL ); ``` 接着修改目标函数以插入相应的条目至该表格里: ```plsql CREATE OR REPLACE PROCEDURE log_message(p_module IN VARCHAR2, p_message IN CLOB) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO LOG_TABLE(MODULE, MESSAGE) VALUES (p_module, p_message); COMMIT; END; / CREATE OR REPLACE FUNCTION another_example_function RETURN BOOLEAN IS BEGIN log_message('ANOTHER_EXAMPLE_FUNCTION', 'Processing request...'); -- 实际处理流程... log_message('ANOTHER_EXAMPLE_FUNCTION', 'Request processed.'); RETURN TRUE; EXCEPTION WHEN OTHERS THEN log_message('ANOTHER_EXAMPLE_FUNCTION', 'ERROR: ' || SQLERRM); RETURN FALSE; END; / ``` 这里引入了一个自治事务过程 (`AUTONOMOUS_TRANSACTION`) 来确保即使主交易失败也能保留日志项[^3]。 ### 总结 以上介绍了三种主要的技术手段用于解决您提到的需求——即如何有效地监控与追踪PL/SQL函数的操作轨迹及其成果反馈状况。每种方案各有优劣之处,在选用前需综合考虑诸如性能影响程度、维护成本等因素后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值