我已经检查了连接字符串(我从服务器资源管理器中获取了它)。
我已经在log4net config中检查了commandText。
我已经检查了数据库权限(集成安全性很好,并且在log4net类之外工作)。
我已经检查了存储库的配置属性(已配置,它可以找到配置文件)。
我还检查过配置文件中定义的字段是否与数据库中表的属性(字段大小等)匹配。
有什么想法吗?
当我调试时,它似乎在所有正确的时间点击所有正确的方法,没有例外。
<log4net>
<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" />
<connectionString value="" />
<commandText value="INSERT INTO dbo.Log4Net ([Date],[Thread],[Level],[Logger],[Message]) VALUES ('01-01-2001', 'test', 'test', 'test', 'test')"/>
<!--<commandText value="INSERT INTO dbo.Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception],[MachineName],[CultureId],[SourcePage],[Details],[Method]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @MachineName, @CultureId, @SourcePage, @Details, @Method)" />-->
<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>
</parameter>
<parameter>
<parameterName value="@log_level"/>
<dbType value="String"/>
<size value="50"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level"/>
</layout>
</parameter>
...more parameters
<securitycontext type="log4net.Util.WindowsSecurityContext">
<credentials value="Process">
</credentials>
</securitycontext>
</appender>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="LogTest.txt"/>
<param name="AppendToFile" value="true"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-2p %c [%x] - %m%n"/>
</layout>
</appender>
<root>
<appender-ref ref="ADONetAppender"/>
<appender-ref ref="FileAppender"/>
</root>
</log4net>
它写的都不是appender。
答案 0 :(得分:18)
是的,经过几个小时的拔毛 - 我已经破了。
这一行:
log4net.Config.XmlConfigurator.Configure();
需要在任何日志记录之前放入(好吧,尽早在应用程序中)。而已。这就是全部。这是其中一个问题,我感到非常宽慰,但同时感到沮丧。
答案 1 :(得分:10)
我建议启用Log4Net调试:
<add key="log4net.Internal.Debug" value="true"/>
如果在幕后发生错误,那么可能会指向正确的方向。输出将定向到IDE或命令行中的控制台输出。
答案 2 :(得分:9)
尝试启用log4net自我记录,也许它有助于找出:
<configuration><appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
</configuration>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\tmp\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>
答案 3 :(得分:2)
根据ADONetAppender配置示例:
<commandText value="INSERT INTO dbo.Log4Net
([Date],[Thread],[Level],[Logger],[Message])
VALUES (@log_date, @thread, @log_level, @logger, @message)"/>
这使用ADO.NET参数化查询格式,因此您需要使用该语法。此外,您可能不希望为数据库连接使用集成安全性(例如,如果您正在运行网站或服务)。对于您的文件追加器,我建议使用完全限定的路径,并确保它可由记录器写入。
我假设您已经在指定的数据库中创建了表?
注意我建议在调试模式下设置trace appender,以确保您实际记录的内容。
答案 4 :(得分:2)
昨天我遇到了类似的问题,Log4Net只是没有写入数据库。我从另一个成功将日志写入数据库的现有appender复制了配置。我的解决方案是运行SQL Server Profiler来尝试捕获正在发生的事情。 Profiler显示INSERT语句是由Log4Net发送的,但它在SQL Server端失败了。在SQL Server Management Studio中手动运行INSERT语句向我展示了它究竟出了什么问题,在我的例子中,它是在一个不接受NULL的列中插入NULL。
答案 5 :(得分:1)
在AssemblyInfo.cs文件中添加此行
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
正如官方配置手册所述“可以使用程序集级属性配置log4net配置而不是以编程方式指定”,我发现这是一种更清晰的方法。有些人可能会觉得我的答案更直接。
来源:https://firebase.google.com/docs/cloud-messaging/http-server-ref
答案 6 :(得分:0)
对于sql server连接,我正在使用我的真实帐户登录到Azure和sql server,由于这个原因,我不得不将集成安全性更改为“ SSPI”,而不是“ true”。
通过添加
仅发现它是con字符串<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\Logs\log4net.txt" />
</listeners>
</trace>