结合我所假设的小事情正在阻止我的应用程序进行数据库日志记录 .
-
Text命令有效 .
INSERT
和EXEC
命令都工作,数据输入数据库 -
如果我取消注释
ExecutionTime
参数它会停止工作 . 我知道有人正在工作,但我无法弄清楚为什么取消注释参数,更不用说添加它,导致Appender无声地失败 . -
现在发现错误,调试正在运行 . 下面列出并更新了精度和比例 .
-
我正在尝试启用内部调试,它似乎不想工作 . 发现了这个问题 . 将配置部分移动到正确的位置(不在log4net下) .
-
如果我将commandType切换到
StoredProcedure
它会停止工作,即使文本版本有效 -
还是个问题 . 尝试不同的东西,但没有太多的运气
SQL:
DROP TABLE [LOG];
GO
CREATE TABLE [dbo].[LOG] (
[Id] [int] IDENTITY(1,1) NOT NULL
,[Origin] [varchar](55) null
,[LogDate] [datetime] NOT NULL
,[Thread] [varchar](32) NOT NULL
,[Context] [varchar](10) NOT NULL
,[Level] [varchar](10) NOT NULL
,[Logger] [varchar](255) NOT NULL
,[Message] [varchar](4000) Not NULL
,[MethodName] [varchar](200) NULL
,[Parameters] [varchar](4000) NULL
,[Exception] [varchar](4000) NULL
,[ExecutionTime] [decimal](14, 4) NULL
)
GO
DROP PROCEDURE InsertLog
GO
CREATE PROCEDURE [dbo].[InsertLog]
@LogDate DateTime
,@Thread varchar(32)
,@Context varchar(10)
,@Level varchar(10)
,@Logger varchar(255)
,@Message varchar(4000)
,@MethodName varchar(200) = null
,@Parameters varchar(4000) = null
,@Exception varchar(4000) = null
,@ExecutionTime decimal(14,4) = null
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[LOG] ([Origin],[LogDate],[Thread],[Level],[Logger],[Message],[MethodName],[Parameters],[Exception],[Context])
VALUES ('InsertLog',@LogDate, @Thread, @Level, @Logger, @Message, @MethodName, @Parameters, @Exception, @Context)
END
GO
App.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
...
</configSections>
<connectionStrings>...</connectionStrings>
<applicationSettings>...</applicationSettings>
<log4net configSource="Log4Net.config" />
<appSettings>
<add key="log4net.Internal.Debug" value="true" />
</appSettings>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData=".\log4net.log" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
log4net.config
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<root>
<level value="ALL" />
<!-- ColoredConsoleAppender works, so It's not listed below -->
<appender-ref ref="ColoredConsoleAppender"/>
<appender-ref ref="ADONetAppender" />
<appender-ref ref="OutputDebugStringAppender" />
<appender-ref ref="TraceAppender" />
</root>
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
<threshold value="ALL"/>
<bufferSize value="1" />
<lossy value="false"/>
<param name="UseTransactions" value="False" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<connectionString value="..." />
<!--<commandText value="
INSERT INTO [Log] ([Origin],[LogDate],[Thread],[Context],[Level],[Logger],[Message],[MethodName],[Parameters],[Exception])
VALUES ('ADONetAppender',@log_date,@thread,@Context,@Level,@Logger,@Message,@MethodName,@Parameters,@Exception);"
/>-->
<commandText value="
exec InsertLog @log_date,@thread,@Context,@Level,@Logger,@Message,@MethodName,@Parameters,@Exception;"
/>
<!--<commandType value="StoredProcedure" />-->
<!--<commandText value="InsertLog" />-->
<parameter name="LogDate">
<parameterName value="@log_date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
...
<!-- This causes appender to fail silently. -->
<parameter name="ExecutionTime">
<parameterName value="@ExecutionTime"/>
<dbType value="Decimal"/>
<precision value="14"/>
<scale value="4"/>
<layout type="log4net.Layout.PatternLayout" value="%property{execution_time}" />
</parameter>
</appender>
<appender name="OutputDebugStringAppender" type="log4net.Appender.OutputDebugStringAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger (%file:%line) - %message%newline" />
</layout>
</appender>
<appender name="TraceAppender" type="log4net.Appender.TraceAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level - %message%newline" />
</layout>
</appender>
</log4net>
Update 1 现在我已经让Trace的东西工作了......它已经看到了那套
log4net:ERROR [AdoNetAppender] ErrorCode:GenericFailure . 无法准备数据库命令[exec InsertLog @ log_date,@ thread,@ Context,@ Level,@ Logger,@ Message,@ MethodName,@ Parameters,@ Exception; ] System.InvalidOperationException:SqlCommand.Prepare方法要求“Decimal”类型的参数具有显式设置的Precision和Scale . 在System.Data.SqlClient.SqlParameter.Prepare(SqlCommand cmd)at System4Data.qlClient.SqlCommand.Prepare()at log4net.Appender.AdoNetAppender.InitializeDatabaseCommand()
Update 2 添加精度/比例后,错误会发生变化 . 它现在抱怨:
log4net:ERROR [AdoNetAppender] ErrorCode:GenericFailure . DoAppend System.FormatException失败:无法将参数值从String转换为Decimal . ---> System.FormatException:输入字符串的格式不正确 .
2 回答
有两个参数是
AdoNetAppenderParameter
类的一部分,可以添加到xml文件中的ExecutionTime
参数,Precision
和Scale
:启用了调试程序并找到了有关精度和比例的投诉
接下来是NULL值 . 它们被转换为文字
(null)
并且在将其转换为小数时会窒息 .将Log4net.config转换为STRING并向存储过程添加了一些转换逻辑
将ExecutionTime转换为Int,因为我使用的代码是毫秒 .
SQL:
Log4Net.config: