我正在使用log4net和AdoNetAppender.似乎AdoNetAppender有一个Flush方法.无论如何我可以从我的代码中调用它吗?
我正在尝试创建一个管理页面来查看数据库日志中的所有条目,我想用bufferSize = 100(或更多)设置log4net,然后我希望管理员能够单击管理员上的按钮页面强制log4net将缓冲的日志条目写入数据库(不关闭log4net).
那可能吗?
我有这样的AdoNetAppender设置:
<log4net>
<appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
<connectionStringName value="DefaultConnection" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
<useTransactions value="false" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout" value="%thread" />
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout" value="%level" />
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType …Run Code Online (Sandbox Code Playgroud) 我正在使用ADONetAppender(尝试)通过存储过程记录数据(这样我可以将逻辑注入日志记录例程).
我的配置设置如下所示.谁能说出我做错了什么?
<appender name="ADONetAppender_SqlServer" type="log4net.Appender.ADONetAppender">
<bufferSize value="1" />
<threshold value="ALL"/>
<param name="ConnectionType" value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<param name="ConnectionString" value="<MyConnectionString>" />
<param name="UseTransactions" value="False" />
<commandText value="dbo.LogDetail_via_Log4Net" />
<commandType value="StoredProcedure" />
<parameter>
<parameterName value="@AppLogID"/>
<dbType value="String"/>
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{LoggingSessionId}" />
</layout>
</parameter>
<parameter>
<parameterName value="@CreateUser"/>
<dbType value="String"/>
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{HttpUser}" />
</layout>
</parameter>
<parameter>
<parameterName value="@Message"/>
<dbType value="String"/>
<size value="8000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@LogLevel"/> …Run Code Online (Sandbox Code Playgroud) 我正在使用log4net和AdoNetAppender.它将所有日志信息记录到表中.该表实际上有2个整数列(可以为null).
这是我的log4net配置的相关部分:
<commandText value="INSERT INTO ActivityLog ([Date],[Thread],[Level],[Logger],[Message],[DealID])
VALUES (@log_date,@thread,@log_level,@logger,@message,@DealID)" />
//other parameters hten DealID
<parameter>
<parameterName value="@DealID" />
<dbType value="Int32" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{DealID}" />
</layout>
</parameter>
Run Code Online (Sandbox Code Playgroud)
我发现的是,如果我没有明确设置使用类似的东西log4net.ThreadContext.Properties["DealID"] = DealID;会引发异常:
System.FormatException occurred
Message="Failed to convert parameter value from a String to a Int32."
Source="System.Data"
StackTrace:
at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType)
InnerException: System.FormatException
Message="Input string was not in a correct format."
Source="mscorlib"
StackTrace:
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles …Run Code Online (Sandbox Code Playgroud) 在我的一个项目中,我收到此错误:
System.IndexOutOfRangeException: SqlParameterCollection does not contain SqlParameter with ParameterName "@log_date".
? System.Data.SqlClient.SqlParameterCollection.GetParameter(String parameterName)
? System.Data.Common.DbParameterCollection.System.Data.IDataParameterCollection.get_Item(String parameterName)
? log4net.Appender.AdoNetAppenderParameter.FormatValue(IDbCommand command, LoggingEvent loggingEvent)
? log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
? log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)
Run Code Online (Sandbox Code Playgroud)
这是appender配置(在其他项目中完美运行):
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=*****;Initial Catalog=****;Integrated Security=SSPI" />
<commandText value="INSERT INTO [LogsDB].[dbo].[Logs] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
.
.
.
<parameter>
<parameterName value="@exception" /> …Run Code Online (Sandbox Code Playgroud) 我有一个写入SQL Server数据库的log4net ado appender.我喜欢它,我觉得它很整洁.在我将其发送到生产环境之前,我想知道如果数据库发生故障会导致什么行为.
我不希望应用程序停止,因为日志记录数据库不可用.我假设log4net会默默地失败并且什么都不做,至少那是我所希望的.任何人都可以确认这一点或(更好)指出一些证实这一点的文件吗?
http://logging.apache.org/log4net/release/config-examples.html
给出这里的日志表:
CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (1, 1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] (255) NOT NULL,
[Level] [varchar] (50) NOT NULL,
[Logger] [varchar] (255) NOT NULL,
[Message] [varchar] (4000) NOT NULL,
[Exception] [varchar] (2000) NULL,
[Product] [varchar] 100 not null
)
Run Code Online (Sandbox Code Playgroud)
和appender配置在这里:
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception], [Product]) VALUES (@log_date, …Run Code Online (Sandbox Code Playgroud) 我执行log4net的AdoNetAppender在asp.net 2.0核心,但我想它是不支持.我已经在核心2.0中实现了log4net RollingFileAppender,它使用log4.net config成功运行.那么,如果log4net AdoNetAppender在核心2.0中不支持,有没有其他方法将日志插入到核心2.0中的sql数据库?
谢谢
我已在我的本地计算机上配置了log4net并正常工作,但是当我部署到我的主机(godaddy)时,它会无声地失败.我在我的开发机器和主机上使用相同的数据库/配置文件.我的log4net引用设置为copy local,而log4net.dll,.pdb和.xml存在于主机上的bin中.这是一个asp.net mvc应用程序.
编辑:没有抛出异常,应用程序按预期运行(减去日志记录)
这是在SQL Server 2005上运行的.nethost是IIS 7
我的配置的突出细节是:
<root>
<level value="DEBUG" />
<appender-ref ref="AdoNetAppender" />
</root>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
Run Code Online (Sandbox Code Playgroud)
有人对要检查的事情有任何想法吗?
我可以使用ADONetAppender设置log4NET,当我想通过log.Info(消息)记录消息时捕获事物的状态时,一切正常.
因为我将根据在整个应用程序中更改的ActionID从我的应用程序中的各个位置进行日志记录,所以如何进行扩展以便我可以发出一个调用,例如log.Info(ActionID,message),其中ActionID最终为数据库?
对于log4net配置..这是我的参数设置
<parameter>
<parameterName value="@exception"/>
<dbType value="String"/>
<size value="8000"/>
<layout type="log4net.Layout.ExceptionLayout"/>
</parameter>
</appender>
Run Code Online (Sandbox Code Playgroud)
我在ADONetAppender中的存储过程设置如下:
<commandText value="dbo.MyInsertProcName"/>
<commandType value="StoredProcedure"/>
Run Code Online (Sandbox Code Playgroud)
在proc中,@ exception的输入参数如下:
ALTER PROCEDURE [dbo].[MyInsertProcName]
(
@log_date DATETIME
, @log_level VARCHAR(50)
, @logger VARCHAR(255)
, @message VARCHAR(4000)
, @exception VARCHAR(MAX)
....
Run Code Online (Sandbox Code Playgroud)
存储过程写入"MYTable"表,其"异常"列长度为VARCHAR 8000.
我能够创建"MYTable"的条目,但是在创建条目后,此条目不包含整个异常堆栈跟踪.看起来堆栈跟踪被截断,最多只包含1700个字符.
在log4net中将完整堆栈跟踪记录到数据库的最佳方法是什么?
我错过了什么?
请帮忙.
谢谢
我在log4net.config文件中定义了一个记录器,它应该使用AdoNetAppender登录到SQL Server 2005的一个实例.我的代码中正在调用记录器,但没有记录任何消息,也没有抛出任何异常.
以下是我的配置文件中定义记录器和appender的部分:
<logger name="Log4NetSummarySqlLogger">
<level value="INFO"/>
<appender-ref ref="SummarySqlAppender"/>
</logger>
<appender name="SummarySqlAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=[removed];initial catalog=[removed];integrated security=false;persist security info=True;User ID=[removed];Password=[removed]" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout> …Run Code Online (Sandbox Code Playgroud)