NLog 添加数据库模式名称
NLog adding a database schema name
我不确定是否可以将数据库架构添加到 NLog。我试过这个方法:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Info"
internalLogFile="C:\temp\internallog.txt">
<targets>
<target name="logfile" xsi:type="File"
fileName="C:\temp/${shortdate}_logfile.txt"
layout="${longdate} ${level:uppercase=true} ${message}"/>
<target xsi:type="Database" name="database"
connectionString="Server=.\SQLEXPRESS;Database=AppDB;Trusted_Connection=True;MultipleActiveResultSets=true;User Id=AppDBUser;Password=PSSWRD!"
commandType="StoredProcedure"
commandText="[AppDB].[ASTONE.EventLogs]">
<parameter name="@message" layout="${message}" />
<parameter name="@level" layout="${level}" />
<parameter name="@logger" layout="${logger}" />
<!--<dbProvider>System.Data.SqlClient</dbProvider>-->
</target>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
<logger name="*" minlevel="Info" writeTo="database" />
</rules>
</nlog>
但是,这给了我这个错误:
Error DatabaseTarget(Name=database): Error when writing to database.
Exception: System.Data.SqlClient.SqlException (0x80131904): Could not
find stored procedure 'AppDB.ASTONE.EventLogs'.
我已经查看了 NLog wiki,但它似乎也没有任何内容。
这是凭记忆,但我认为您的 commandText
值应该是这样的:
commandText="[ASTONE].[EventLogs]"
分隔符.
需要在方括号之外。
由于您在连接字符串中指定了数据库名称,因此您不需要将其作为命令文本的一部分。
更新了新信息
因为 ASTONE.EventLogs
是一个 table,您需要编写一个存储过程来将您的参数值插入其中。那是你遗漏的部分。
这是一个示例存储过程:
CREATE PROC [ASTONE].[LogEvent]
(
@message nvarchar(max),
@level int,
@logger nvarchar(1024)
)
AS
INSERT INTO [ASTONE].[EventLogs]
( message, level, logger )
VALUES( @message, @level, @logger)
我在猜测你的布局 EventLogs
table 以及参数的类型和定义。
然后您的 commandText
属性将如下所示:
commandText="[ASTONE].[LogEvent]"
我不确定是否可以将数据库架构添加到 NLog。我试过这个方法:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Info"
internalLogFile="C:\temp\internallog.txt">
<targets>
<target name="logfile" xsi:type="File"
fileName="C:\temp/${shortdate}_logfile.txt"
layout="${longdate} ${level:uppercase=true} ${message}"/>
<target xsi:type="Database" name="database"
connectionString="Server=.\SQLEXPRESS;Database=AppDB;Trusted_Connection=True;MultipleActiveResultSets=true;User Id=AppDBUser;Password=PSSWRD!"
commandType="StoredProcedure"
commandText="[AppDB].[ASTONE.EventLogs]">
<parameter name="@message" layout="${message}" />
<parameter name="@level" layout="${level}" />
<parameter name="@logger" layout="${logger}" />
<!--<dbProvider>System.Data.SqlClient</dbProvider>-->
</target>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
<logger name="*" minlevel="Info" writeTo="database" />
</rules>
</nlog>
但是,这给了我这个错误:
Error DatabaseTarget(Name=database): Error when writing to database. Exception: System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'AppDB.ASTONE.EventLogs'.
我已经查看了 NLog wiki,但它似乎也没有任何内容。
这是凭记忆,但我认为您的 commandText
值应该是这样的:
commandText="[ASTONE].[EventLogs]"
分隔符.
需要在方括号之外。
由于您在连接字符串中指定了数据库名称,因此您不需要将其作为命令文本的一部分。
更新了新信息
因为 ASTONE.EventLogs
是一个 table,您需要编写一个存储过程来将您的参数值插入其中。那是你遗漏的部分。
这是一个示例存储过程:
CREATE PROC [ASTONE].[LogEvent]
(
@message nvarchar(max),
@level int,
@logger nvarchar(1024)
)
AS
INSERT INTO [ASTONE].[EventLogs]
( message, level, logger )
VALUES( @message, @level, @logger)
我在猜测你的布局 EventLogs
table 以及参数的类型和定义。
然后您的 commandText
属性将如下所示:
commandText="[ASTONE].[LogEvent]"