====== Simple message logging ======
This article describes an approach to one-line, simple event logging from within stored procedures; something like this:
EXEC dbo.usp_LogEvt 'Here is a message', @@PROCID
===== Setting it up =====
-- Create a log table in a convenient administration database. Mine is called ''_Admin'' but the name isn't important -- if you already have one you can use that instead.
.. USE _Admin
GO
IF OBJECT_ID('dbo.EventLog') IS NOT NULL
DROP TABLE dbo.EventLog
GO
CREATE TABLE dbo.EventLog (
EventId INT IDENTITY(1,1) PRIMARY KEY
, EventTimestamp DATETIME NOT NULL DEFAULT GETDATE()
, SourceDb VARCHAR(128) NOT NULL
, SourceSpSchema VARCHAR(128)
, SourceSpName VARCHAR(128)
, [Message] VARCHAR(MAX) NOT NULL
)
-- Create an SP in the same database to write entries into the log
.. USE _Admin
GO
IF OBJECT_ID('dbo.usp_MakeLogEntry') IS NOT NULL
DROP PROCEDURE dbo.usp_MakeLogEntry
GO
CREATE PROCEDURE dbo.usp_MakeLogEntry (
@srcDb VARCHAR(128)
, @srcSpSchema VARCHAR(128)
, @srcSpName VARCHAR(128)
, @msg VARCHAR(MAX)
)
AS
BEGIN
INSERT INTO dbo.EventLog (
SourceDb
, SourceSpSchema
, SourceSpName
, [Message]
) VALUES (
@srcDb
, @srcSpSchema
, @srcSpName
, @msg
)
RETURN SCOPE_IDENTITY()
END
-- ''usp_MakeLogEntry'' is not intended to be called directly -- create this wrapper SP:
.. IF OBJECT_ID('dbo.usp_LogEvt') IS NOT NULL
DROP PROCEDURE dbo.usp_LogEvt
GO
CREATE PROCEDURE dbo.usp_LogEvt (
@msg VARCHAR(MAX)
, @objId INT = NULL
)
AS
BEGIN
DECLARE @dbName VARCHAR(128) = DB_NAME()
DECLARE @schemaName VARCHAR(128) = OBJECT_SCHEMA_NAME(@objId)
DECLARE @spName VARCHAR(128) = OBJECT_NAME(@objId)
DECLARE @evtId INT
EXEC @evtId = _Admin.dbo.usp_MakeLogEntry
@srcDb = @dbName
, @srcSpSchema = @schemaName
, @srcSpName = @spName
, @msg = @msg
RETURN @evtId
END
.. Note that:
* You need a copy of ''usp_LogEvt'' in any database from which you want to write log entries. This is so that incoming object IDs (''@objId'') can be resolved correctly to database and object names.((For the same reason, don't ever write ''EXEC //DbName//.dbo.usp_LogEvt'' -- you want to ensure that you call the local version or your log entries will become meaningless!))
* The ''EXEC'' call inside ''usp_LogEvt'' is fully qualified, to make sure that you can call it from any database.
* If your administration database isn't called ''_Admin'', you'll need to change the ''EXEC'' call appropriately.
* You might want to think about creating it in ''model'' so that it is automatically added to every new database.
===== Returning event IDs =====
The log entry ID is returned from the call to ''usp_LogEvt''. You don't need to use it at all, but if it is of interest you can do something like:
DECLARE @evtId INT
EXEC @evtId = dbo.usp_LogEvt 'Here is a message', @@PROCID
PRINT @evtId -- this is the logged message's EventId
{{tag>>logs admin}}