Sql 日志记录过程中的数据库日志记录

Sql 日志记录过程中的数据库日志记录,sql,oracle,stored-procedures,logging,plsql,Sql,Oracle,Stored Procedures,Logging,Plsql,也许这是一个愚蠢的问题,但假设我有一个日志记录过程,为了简洁起见,它被大大简化了: PROCEDURE LOGGER ( p_TYPEOFLOG IN VARCHAR2, p_LOGSEVERITY IN VARCHAR2, p_SESSIONID IN VARCHAR2) AS v_timestamp DATE := SYSDATE; BEGIN

也许这是一个愚蠢的问题,但假设我有一个日志记录过程,为了简洁起见,它被大大简化了:

 PROCEDURE LOGGER (
    p_TYPEOFLOG             IN  VARCHAR2,
    p_LOGSEVERITY           IN  VARCHAR2,
    p_SESSIONID             IN  VARCHAR2)
 AS
    v_timestamp             DATE := SYSDATE;

 BEGIN

    PRAGMA autonomous_transaction;

    BEGIN
        INSERT INTO Log (
            TypeOfLog, LogSeverity, SessionID, TimeOfAction)
        VALUES (
            p_TYPEOFLOG, p_LOGSEVERITY, p_SESSIONID, v_timestamp);
        COMMIT;
    END;

END LOGGER;

现在,通常我会用异常处理程序包装开始/结束位,该异常处理程序将调用此记录器过程。但是如果我已经在记录器中,我该怎么办?如果其他人为null并跳过它,我是否只是执行一个异常?我是否再次尝试调用记录器过程?这里什么是标准?

我不相信有标准这样的东西


就个人而言,如果我的日志代码失败,我会让生成的任何异常被抛出并传播到堆栈上。如果无法写入日志表,则意味着发生了非常不幸的事情。我不想抓住并忽视这样一个例外。如果没有其他方法来记录错误,我会将异常发回调用方,并希望调用方要么向用户显示消息,即前端web应用程序中的堆栈跟踪,要么将消息记录到应用程序服务器日志中。

我不相信有所谓的标准


就个人而言,如果我的日志代码失败,我会让生成的任何异常被抛出并传播到堆栈上。如果无法写入日志表,则意味着发生了非常不幸的事情。我不想抓住并忽视这样一个例外。如果没有其他方法来记录错误,我会将异常发回调用方,并希望调用方要么向用户显示消息,即前端web应用程序中的堆栈跟踪,要么将消息记录到应用程序服务器日志。

如果您再次调用Logger过程,如果这是一个更广泛的问题,比如说空间耗尽,那么你如何防止无限递归增加你的问题呢?Oracle可能会尝试终止递归,但您也会捕获并尝试记录它…如果您再次调用Logger过程,并且再次失败-如果这是一个更广泛的问题,例如空间不足-您将如何防止无限递归增加您的问题?Oracle可能会尝试终止递归,但您也会捕获并尝试记录它。。。。希望对你有所帮助。。希望能有所帮助。